前言:近段时间在学习access偏移注入时,在网上查询了大量的资料,感觉很多资料讲解的十分模糊并且我个人认为有很多不够严谨的地方,于是我便在线下经过大量测试,写出以下文章,如有错误,望指出。
如要转载,请标明出处!!
一、认识偏移注入偏移注入的适用背景:
access数据库与mysql不同,access数据库没有类似于mysql的information_schema这样的系统数据库,所以对于access的表名及其字段名我们只能靠经验进行猜解,而偏移注入就是提供了另外一种思路:
在我们只能猜解出表名,而猜解不出我们所想要的字段名的情况下,直接爆最后的字段数据。
偏移注入的原理(这里只是粗略的概述,详细请看下面):
就是将目标表进行(多级)内连接,通过联合查询和已知目标字段名的微调,将我们想要知道的字段值在已经确定的显示位上暴露出来。
影响偏移注入成功率的因素(当然这些因素都是影响因素,不是决定因素):
联合查询中显示位的位置
当前注入点所查询的表的字段数量(即:“当前表”的字段数量)
目标表的字段数量
我们可以猜解到的目标表的字段名的数量
二、实战测试环境此次实战测试主要涉及的两张表:product表和admin表
product表:该表有22个字段(请谨记这个字段数)
admin表:该表有6个字段(请谨记这个字段数)
exist()函数:用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
as关键字:用于起别名,可以为表起别名,也可以为字段起别名(as关键字可省略)
表1 inner join 表2 on 筛选条件 :该关键字用于将表1与表2做笛卡尔积,然后根据on后面的条件进行筛选。
下图中select语句的意思是:将admin表与自己做笛卡尔积,然后筛选出两者id值相同的记录
top n 关键字:作用是使查询结果只显示前n条记录
为了方便讲解,我们在这里选择“实战”和“偏移注入的注入原理”相结合的方式进行讨论。
偏移注入的流程是:
判断是否存在注入点
判断当前注入点对应表的字段数量
为方便之后讲解,我们把“当前注入点对应表”称作为“当前表”,
把我们将要进行联合查询的表称为“目标表”,
在这里“当前表”->product表;“目标表”->admin表
猜解目标表的表名
确定显示位
确定目标表的字段数量
开始进行偏移注入,经过不断的“微调”,将我们想要的字段值在显示位处暴露出来。
4.1 判断是否存在注入点payload:
?id=1513 and 1=2 页面显示出错
?id=1513 and 1=1 页面显示正常