9 XXE
概念
XML External Entity Injection,即xml外部實體注入漏洞,發生在應用程式解析XML輸入時,美歐禁止外部實體的加載,導緻可加載惡意外部檔案和代碼,造成任意檔案讀取、指令執行、内網端口掃描、攻擊内網網站、發起DdoS攻擊等危害
觸發點
往往是可以上傳xml檔案的位置,沒有對上傳的xml檔案進行過濾,導緻可上傳惡意xml檔案。
xml
可擴充标記語言(Extensible Markup Language),不同于HTML(被設計用來顯示資料),XML是用來傳輸和存儲資料。XML沒有預定義标簽,允許自定義标簽和文檔結構,XML 被設計用來傳輸和存儲資料。
XML的文法規則:
• XML 文檔必須有一個根元素
• XML 元素都必須有一個關閉标簽
• XML 标簽對大小敏感
• XML 元素必須被正确的嵌套
• XML 屬性值必須加引号
XML中5個預定義的實體引用
< >
> <
& &
' ‘
" “
DTD(文檔類型定義)
作用:定義XML文檔的合法構模組化塊
兩種建構方式:内部DTD聲明、外部DTD聲明(外部實體攻擊主要利用DTD的外部實體來進行注入的)
聲明方式:
·内部DTD聲明:<!DOCTYPE 根元素 [元素聲明]>
·外部DTD聲明:<!DOCTYPE 根元素 SYSTEM “檔案名”>
内部聲明方式
外部聲明方式
DTD實體構造:
DTD實體同樣有兩種建構方式:
内部實體聲明:<!ENTITY entity-name ‘entity-value’>
外部實體聲明:<!ENTITY entity-name SYSTEM “URL/URL”>
執行個體:
外部實體注入:
<?xml version=”1.0”?>
<!DOCTYPE hack[
<!ENTITY xxe SYSTEM “file://etc/password”>
]>
上述代碼中,XML的外部實體“xxe”被賦予的值為:file:///etc/passwd,當解析xml文檔時,xxe會被替換為file:///ect/passwd的内容。
參數實體+外部實體注入:
<?xml version=”1.0”? encoiding=”utf-8”>
<!DOCTYPE hack[
<!ENTITY % name SYSTEM “file://etc/password”>
%name;
]>
實體又分為一般實體和參數實體
1,一般實體的聲明文法:<!ENTITY 實體名 "實體内容“>
引用實體的方式:&實體名;
2,參數實體隻能在DTD中使用,參數實體的聲明格式: <!ENTITY % 實體名 引用實體的方式:%實體名;
XXE漏洞攻擊主要是利用了DTD引用外部實體導緻的漏洞。
攻擊思路
• 1. 引用外部實體遠端檔案讀取(有回顯)
<?php
header("content-type:text/html;charset=utf-8");
date_default_timezone_set("PRC");
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);
echo date('Y-m-d H:i:s',time())."\n\r";
echo $xml->login;
?>
simplexml_load_string() 函數轉換形式良好的 XML 字元串為SimpleXMLElement 對象。
第一步:
第二步:修改post内容
• 2. Blind XXE(先做記錄)
如果伺服器沒有回顯,隻能使用Blind XXE漏洞來建構一條外帶資料(OOB)
通道來讀取資料。是以,在沒有回顯的情況下如何來利用XXE
思路:
1. 用戶端發送payload 1給web伺服器
2. web伺服器向vps擷取惡意DTD,并執行檔案讀取payload2
3. web伺服器帶着回顯結果通路VPS上特定的FTP或者HTTP
4. 通過VPS獲得回顯(nc監聽端口)
• 3. php指令執行
php環境下,xml指令執行需要php裝有expect擴充,但是該擴充預設沒
有安裝,是以一般來說,比較難利用,這裡就隻給出代碼了
<?php
$xml = <<<EOF
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "except://ifconfig">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
XXE防禦:
1、過濾使用者提供的XML資料
2、過濾關鍵字:<\!DOCTYPE和<\!ENTITY,或者SYSTEM和PUBLIC。
3、不允許XML中含有自己定義的DTD
4、使用開發語言提供的禁用外部實體的方法
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))
轉載于:https://www.cnblogs.com/guike/p/11189856.html