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语句,利用 and
或 or
关键字判断语句返回 true
或 false
,以此来逐步获取信息。
步骤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被封。