
ZoneMinder Time-Based SQL Injection (CVE-2024-51482) Exploit POC
このリポジトリには、ZoneMinder 1.37.* ~ 1.37.64 で見つかったブラインドSQLインジェクションの脆弱性に対する、高性能かつ並列化された概念実証(PoC)エクスプロイト(Exploit.py)が含まれています。
GHSA-qm8h-3xvf-m7j3 によると、この脆弱性は web/ajax/event.php が removetag アクションを処理する際に発生します。tid(TagId)パラメータはリクエストから読み取られ、安全でない方法でSQL文に直接連結されます:
$tagId = $_REQUEST['tid'];
// ...
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
$tagId は dbNumRows() に渡される前にパラメータ化されていないため、認証済みの攻撃者はブールベースまたは時間ベースのSQLインジェクション手法(ここで紹介するPoCは SLEEP() を利用)を使用して、任意のSQLコマンドを注入できます。
これによりSQLデータベースを完全に制御できるようになり、データの機密性と完全性の喪失、さらには永続的なスリープコマンドによるサービス拒否(DoS)を引き起こす可能性があります。
バージョン1.37.65以降、SQLクエリは適切にパラメータ化されています。脆弱なブロックは、安全なクエリを構築するようにパッチが適用されました:
$sql = "SELECT * FROM Events_Tags WHERE TagId = ?";
$rowCount = dbNumRows($sql, $tagId);
v2.0 FAST EXPLOIT スクリプトは、マルチスレッド、最適化された文字頻度検索、動的閾値キャリブレーションを使用してデータ抽出を最大5倍高速化し、zm.Users データベーステーブルからユーザー認証情報(Username:Password)を積極的に抽出します。
Exploit.py v2.0 FAST EXPLOIT)zm.Users テーブル全体を順次ダンプすることをサポートします。http://<target>/zm/index.phpview=request&request=event&action=removetagtidpython3 Exploit.py
実行すると、スクリプトは対話モードで動作し、以下の入力を求めます:
index.php ファイルへのパス(例:http://zoneminder.local/zm/index.php)。ZMSESSID Cookie を指定してください。zm.Users テーブル全体を自動検出してダンプします。extracted_data.txt というファイルが自動的に作成され、ダンプされた認証情報(Username:Password 形式)が保存されます。また、スクリプトは経過時間の合計と送信されたHTTPリクエストの総数を含む実行統計をリアルタイムで表示します。
免責事項: このエクスプロイトスクリプトは、教育目的および許可されたペネトレーションテスト専用です。所有していない、または明示的なテスト許可を得ていないシステムに対してこのツールを使用しないでください。