目录
1、偏移注入使用场景
在做SQL注入的时候,通常我们查询数据需要知道在哪个表哪个字段,我们才能在里面提取到我们想要的数据,比如说select password from admin,从admin表里面取password字段里面的内容;
在做渗透测试会遇到一种情况,比如没有系统自带库,因为有的系统自带库可能权限不够或访问不了,像Access数据库根本就没有系统自带库;如果遇到这种情况就会产生一些问题,表名、字段名就需要强行猜;
需要强行猜就会造成一种情况,比如说它的字段名设置的比较奇葩的时候,例如像这样的:H5scker_Passwd,这一类的密码字典里面不存在,所以基本上来说是爆破不了;
这样的问题该如何解决?
如果不知道表名,那在Access数据库中也是无解的,它不能够通过Burp一个个地爆破,但是如果知道表名不知道字段名,那是有解的,就要用到——偏移注入(移位溢注);
2、什么是移位溢注?
偏移注入正统的叫法是移位溢注,我们现在要学的方法叫做移位溢注,它跟正统的偏移注入不一样,移位溢注是现在做偏移注入比较主流的方法;
真正的偏移注入是要用一些左连接右连接的查询,比较麻烦,而且成功率比较低;所以我们学习成功率比较高的移位溢注;
之前我们学习过:
库.表.字段 => 选中某库中的某表中的某字段
select * from admin 查询admin表里面的全部字段内容
可以看到里面有id、username、password字段;
输入select * from admin就能查询到admin表里字段内容;
会发现select * from admin等价于select id,username,password from admin;
*(星号)就代表着id,username,password字段;
这个时候就会产生一个问题:为什么*就代表着admin表里的内容,而不是其他表的内容?
这是因为现在所查询的是admin表,所以*代表的是admin表里的所有字段;
select * from admin => select id,username,password from admin
这个地方还可以用库.表.字段来写select admin.* from admin
select admin.* from admin
会发现得到的结果和我们前面得到的结果是相同的;
可以得出一个小结论:
select admin.* from admin 中的 admin.*代表着admin表中的所有字段;
那么现在就知道了表名.*代表着这个表里所有的字段;
这里就是核心概念;
举个例子:
select * from news where id =1 union select admin.* from admin
union:要求前后两条SQL语句的字段数必须相同;
union的核心是将两个查询的结果输出到一起;
比如这有一个表,里面有学号,姓名,性别3个字段,第一条数据逐一显示了3个字段内容,但第二条数据不止显示了3个字段内容并且还多出了一个21;
那么这个数据去导入的时候就会出现问题,数据库不知道21是什么情况,不知道21是对应什么的,就会出现报错或者不执行,这里就是联合查询的核心,前后的字段数必须要相同;
如果我们去写一个select 1,2,3,4这1,2,3,4并不重要,重要的是位置,你也可以写其他的select 222,111111,55555,6666是一样的,都是占4个位置,无论你写的再长,都是一样的;
select 1,2,3,4=select 222,111111,55555,6666
select 1,2,3,4=select 'skjfhkjhkja',222,345,112
回到上面那条语句;
select * from news where id =1 union select admin.* from admin
必要条件
偏移注入需要满足一定的条件:
①知道表名;
②注入点的字段数长度要大于你想要查询的表的字段数;
a. 第一种情况
后半条语句的字段数多于前半条语句的字段数
select * from news where id =1 union select admin.* from admin
可以union前后做个分割;
select * from news where id =1 假设这里是3个字段
union
select admin.* from admin 而这里是4个字段
像这样的情况就不能写select admin.* from admin,因为已经超出了前面的字段数;
b. 第二种情况
前半条语句的字段数多于后半条语