SQL注入 (二) Access注入

Access数据库简介

Microsoft Access 是由微软发布的一款关系数据库管理系统(RDBMS),结合了 Microsoft Jet Database Engine 和图形用户界面(GUI)。Access通常用于较小规模的应用中,由于其自带图形界面,操作相对简单。

注意:Access数据库只有一个数据库实例,结构是:

  • 库 -> 表 -> 字段 -> 值

并且,Access常常与ASP/ASPX等脚本语言一起使用。在这种组合中,可以通过特定的方式进行SQL注入。

判断数据库类型

要判断当前使用的数据库是否是Access,可以通过查询 msysobjects 这个Access数据库独有的系统表:

and (select count(*) from msysobjects)>0

如果报错,那就是Access数据库,因为 msysobjects 是Access专有的,并且不能通过外部直接访问。如果正常执行则是其他类型的数据库(例如MS SQL Server)。

注意:Access数据库没有注释符,注入时可以使用 %00 截断。如果使用的是PHP,并且开启了“魔术引号”,则需要将输入内容转换为十六进制格式。

Access注入方式

1. 联合查询法

步骤1:确认注入点
可以通过提交单引号 ' 或使用逻辑运算进行测试:

  • 提交单引号:URL?id=1',如果报错,说明存在SQL注入点。
  • 使用逻辑运算:URL?id=1' and 1=1# 正常执行,URL?id=1' and 1=2# 报错,则说明存在注入点。

步骤2:确认列数
通过 order by 来确定列数,直到出现错误为止:

URL?id=1' order by 列数#

order by 后的列数超过实际列数时会报错,例如 order by 23 报错,则说明有22个列。

步骤3:猜测表名
猜测表名后,进行联合查询:

URL?id=1513' union select 1,2,......,22 from 表名#

若正确,会显示数据。如果猜不中表名,可以结合网站源码或者其他线索进行猜测。

步骤4:猜列名
与猜表名类似,依次猜出列名后,就可以通过联合查询获取具体数据。

2. 布尔盲注法

布尔盲注通常用于页面没有明显回显,且不支持联合查询的情况。通过构造SQL语句,利用 andor 关键字判断语句返回 truefalse,以此来逐步获取信息。

步骤1:确认注入点
(与联合查询类似)

步骤2:猜表名
通过以下语句判断表是否存在:

and 0 <>(select count(*) from 表名)#

如果正常执行,说明该表存在。

步骤3:猜记录数

and (select count(*) from 表名)=n#

如果正常,说明该表有n条记录。

步骤4:猜列名

and (select count(*) from 表名 where len(列名)>0)=1#

如果正常,则说明存在该列。

步骤5:猜测数据长度

and (select count(*) from 表名 where len(列名)>n)=1#

如果正常,则列的长度为n。常见的密码字段可能是16或32位,因为许多系统使用MD5哈希进行加密。

步骤6:逐字爆破数据
使用以下方式逐个字符获取数据:

and (select top 1 asc(mid(admin,位数,1)) from admin)=ascii值#

若正常,则说明该位字符的ASCII值正确,通过转换可以得到对应字母。

3. 时间盲注法

时间盲注与布尔盲注相似,但通过引入延迟的方式判断SQL语句是否为真。常用 if 语句与 sleep() 结合进行注入:

if(查询条件, sleep(5), 0)#

如果查询条件为真,页面将延迟响应,否则页面会立即返回结果。

总结

  • 联合查询:快速获取数据,但对不同数据库的兼容性较差。
  • 布尔盲注:虽然较为慢和繁琐,但适用范围广,兼容性好。
  • 时间盲注:与布尔盲注类似,但依赖页面延迟来判断。

Access数据库因为没有注释符、表名难以猜解,常常需要通过暴力破解或者社工的方法辅助。而对于盲注,推荐使用工具如 Burp Suite 配合代理池来进行自动化测试,避免因频繁请求导致IP被封。

评论区
头像