pikachu之XEE練習

_嘿!發表於2020-12-22

XXE (xml external entity injection)即xml外部實體注入漏洞

概括一下就是"攻擊者通過向伺服器注入指定的xml實體內容,從而讓伺服器按照指定的配置進行執行,導致問題",也就是說服務端接收和解析了來自使用者端的xml資料,而又沒有做嚴格的安全控制,從而導致xml外部實體注入。

現在很多語言裡面對應的解析xml的函式預設是禁止解析外部實體內容的,從而也就直接避免了這個漏洞。
以PHP為例,在PHP裡面解析xml用的是libxml,其在≥2.9.0的版本中,預設是禁止解析xml外部實體內容的。

本章提供的案例中,為了模擬漏洞,通過手動指定LIBXML_NOENT選項開啟了xml外部實體解析。

XML是什麼?

XML:eXtensibleMarkup Language,可擴充套件標記語言,使用簡單的標記來描述資料。

  1. XML是一種非常靈活的語言,類似於HTML語言,但是並沒有固定的標籤,所有的標籤都可以自定義,其設計的宗旨是傳輸資料,而不是像HTML一樣顯示資料。
  2. XML不會做任何事情,它是被設計用來結構化、儲存以及傳輸資訊,也就是XML檔案所攜帶的資訊,需要被其他的語言或者程式來解析,才能發揮作用。

XML的作用

XML使用元素和屬性來描述數 據。在資料傳送過程中,XML始終保留了諸如父/子關係這樣的資料結構。幾個應用程式 可以共享和解析同一個XML檔案,不必使用傳統的字串解析或拆解過程。 相反,普通檔案不對每個資料段做描述(除了在標頭檔案中),也不保留資料關係結構。使用XML做資料交換可以使應用程式更具有彈性,因為可以用位置(與普通檔案一樣)或用元素名(從資料庫)來存取XML資料。

它是怎樣構建外部實體注入的?

方式一:直接通過DTD外部實體宣告
方式二:通過DTD文件引入外部DTD文件,再引入外部實體宣告
方式三:通過DTD外部實體宣告引入外部實體宣告

PHP中有一個函式將形式良好的 xml 字串轉換為 SimpleXMLElement 物件,在PHP裡面解析xml用的是libxml,其在 ≥2.9.0 的版本中,預設是禁止解析xml外部實體內容的。
XXE漏洞發生在應用程式解析XML輸入時,沒有禁止外部實體的載入,導致攻擊者可以構造一個惡意的XML
在這裡插入圖片描述

<?xml version = "1.0"?>

<!DOCTYPE note [

    <!ENTITY hacker "ESHLkangi">

]>

<name>&hacker;</name>

輸入,可以看到正確讀出變數;
在這裡插入圖片描述
DTD(文件型別定義)的作用是定義 XML 文件的合法構建模組。DTD 可以在 XML 文件內宣告,也可以外部引用。

(1)內部宣告DTD

<!DOCTYPE 根元素 [元素宣告]>

(2)引用外部DTD

<!DOCTYPE 根元素 SYSTEM "檔名">
或者
<!DOCTYPE 根元素 PUBLIC "public_ID" "檔名">

DTD實體是用於定義引用普通文字或特殊字元的快捷方式的變數,可以內部宣告或外部引用。

相關文章