access偏移注入原理 (3)

通过分析下图中表2我们发现,经过2级偏移注入,我们成功的将admin表的数据向前移动了6个字段,使其原本在17号字段及其之后才显现出的数据,变为了在11号字段及其之后就可回显而出。而此时admin表的password字段和count_time字段恰好处于显示位13和15上,于是就自然而然的暴露了出来。

那又为什么admin表的数据会向前移动6个字段呢?

原因就是,由于admin表进行了一次自连接,使得payload中from关键字后面的表由原有的admin表变成了:由“先让admin自己做笛卡尔积然后挑选id值相等的记录”组成的表。这样的话,payload中的“ * ”就由原来所代表的admin表中的6个字段,变为了现在代表的admin自连接表的12个字段,又由于union关键字的使用,要求union关键字后面查询的字段数必须要等于前面的表即product表的字段数,所以union关键字后面的select中用于充数的字段由原来的22-6=16变为了22-12=10个字段,因此由于充数的字段变少了,那么admin表的数据自然的就可以向前移动了。

请注意:admin表中的数据向前移动的字段数只能是admin表(即目标表)字段数的整数倍(这是由表自连接的特性所决定的)。

13_access偏移注入-2级偏移注入

在此我们已经爆出了admin表的密码,

此时,其实admin表的admin字段就紧挨在password字段的前方(其实在实战环境中我们是不确定admin字段是在前还是在后的,此处只是为了方便原理的讲解,就直接告诉你了)

那么我们是否仍然可以将数据向前移动而爆出admin字段的值呢?在这里显然是不行的,因为我们只能向前移动admin表的字段数量的整数倍(在这里即是6的整数倍),而此时admin表的admin字段此时所处字段为12号字段,再向前移动6个字段的话,admin字段就处于6号字段处了,仍然没有与显示位的位置发生重合。

到了这里,细心的同学会发现:

之前我们讲的都是如何将admin表中的数据向前移动,那么我们可不可以使得数据向后移动呢?要是可以向后移动的话,紧接着2级偏移,然后让数据向后移动一个字段,不就正好让admin字段处于13号显示位了吗?

恭喜你!你的想法是对的,我们的确可以让admin表的数据向后移动,不过遗憾的是,向后移动的字段数仍然取决于:我们能够猜解出admin表中多少个字段名。若猜解出1个字段名,那么我们就可以让数据向后移动1个字段数,若猜解出2个字段名,那么我们就可以让数据向后移动2个字段数,以此类推。(不过这里所需要猜解的字段名不需要是我们想要查找的字段名,只要是admin表中的字段名均可),原因请继续往后阅读:

微调payload:

?id=1513 union select top 1 1,2,3,4,5,6,7,8,9,10,b.id, * from (admin a inner join admin b on a.id=b.id)

根据页面返回的数据,我们可以看到,在第13号显示位我们成功的爆出了admin字段的第一个值:admin

原因:

我们先观察sql语句,发现union关键字后面的select查询的填充字段多了代码“b.id”,意思是在此输出b表(admin表的别名之一)的id字段值,由于此处已经显式的指出id字段值的输出位置,那么后面的 “ * ” 就会自动的识别,就只输出admin自联表剩下的字段值了,从而使得剩余数据均向后移动了一个字段,让原本在13号字段的admin字段向后移动了1位,到了13号显示位上了。

但请注意:此处的id字段名是我们已经猜解出的

这也就回答了上述所说的:“向后移动的字段数仍然取决于:我们能够猜解出admin表中多少个字段名,不过这里所需要猜解的字段名不需要必须是我们想要查找的字段名,只要是admin表中的字段名均可”,因此,如果我们想让admin数据向后移动2个字段值,那么我们就需要知道除了id字段名外,其他任一字段名即可,然后构造如下payload:?id=1513 union select top 1 1,2,3,4,5,6,7,8,9,10,b.id,b.字段名 * from (admin a inner join admin b on a.id=b.id)

14_access偏移注入-微调

五. 总结与反思

至此,整个测试已结束,我们成功的爆出了 账号与密码:admin/a48e190faf

接下来我会依次提出几个问题,然后一一进行解答:

如果我们仍然采用上述环境,那可不可以进行3级偏移和四级偏移呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxdgf.html