
悪意のあるWAVEファイル(例:作成者)をアップロードできるユーザーは、WordPressのメディアライブラリでXML解析の問題を悪用し、XXE攻撃を引き起こす可能性があり、ファイルシステムの開示につながる可能性があります。
XML External Entity (XXE) 脆弱性
XMLでは、ドキュメント全体で再利用可能なカスタムエンティティを定義できます。これは、例えば重複を避けるために使用できます。 以下のコードは、後で使用するためにエンティティ myEntity を定義しています。

定義されたエンティティの値は、URIによって参照される外部ソースからも取得できます。この場合、これらは外部エンティティと呼ばれます:

XXE攻撃はこの機能を悪用します。攻撃者がURIとして file:///var/www/wp-config.php を指定した場合、機密性の高いファイルの内容を漏洩させることに成功します。この攻撃は、ユーザーが制御するコンテンツに対して緩く設定されたXMLパーサーが実行された場合に可能になります。
WordPressにおけるXXE
WordPressにはメディアライブラリがあり、認証されたユーザーがメディアファイルをアップロードし、それをブログ投稿で使用できます。 これらのメディアファイルからメタ情報(例:アーティスト名やタイトル)を抽出するために、WordPressはgetID3ライブラリを使用します。このメタデータの一部はXML形式で解析されます。ここで、可能性のあるXXE脆弱性(730行目)が報告されました。

libxml_disable_entity_loader(true) 関数は非推奨になりました。これは、PHP 8バージョンがLibxml2 v2.9以上を使用しており、デフォルトで外部エンティティの取得を無効にしているためです。
以下のコマンドを使用して、悪意のあるWAVEファイルを作成します。

dtdファイルを作成し、このコードを追加します。これにより、データベース認証情報などの機密データを含むwp-config.phpを取得できるようになります。

次に、HTTPサーバーを起動します。

悪意のある.wavファイルをWordPressアプリケーションにアップロードします。.wavファイルをアップロードすると、HTTPサーバーログに以下のリクエストが表示されるはずです。データの効果的な外部漏洩のためには、Zlibを使用してデコードする必要があります。

その後、データベース認証情報を取得し、データベースにログインして管理者を探します。

corp-001 が管理者です。そのパスワードハッシュをクラックし、管理者としてログインします。

WordPressはバージョン5.7.1で、PHP 8で非推奨になった libxml_disable_entity_loader() 関数の呼び出しを再導入することで脆弱性を修正しました。PHPの非推奨警告を回避するために、呼び出しにPHPエラー抑制演算子 @ が追加されました。

https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447/
https://nvd.nist.gov/vuln/detail/CVE-2021-29447
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-29447
https://github.com/motikan2010/CVE-2021-29447
https://www.youtube.com/watch?v=pkooNXGHl7c
https://www.youtube.com/watch?v=tE8Smz1Jvb8
https://www.mend.io/vulnerability-database/CVE-2021-29447