
php2shell(CVE-2026-109618 および CVE-2026-109619)向けの高精度スキャナー
PHPアプリケーションにおけるCVE-2026-109618およびCVE-2026-109619を検出するためのコマンドラインツール。
スキャナは最小限のマルチパート制御リクエストを送信し、続いて最大3つの細工されたマルチパートプローブを送信します。プローブは62階層深くネストされたPHP配列キーを使用し、1 MiBから20 MiBまで増加します。これはAssetnoteの内部スキャナが使用する検出ロジックに一致します。
プローブがPHPのメモリ枯渇エラー、差分のある空のHTTP 500、PHP-FPMワーカーの障害、または未パッチであることが知られている公開済みのPHPバージョンを引き起こした場合、ターゲットは脆弱であると報告されます。初回の5xxレスポンス、一般的なリクエスト拒否ステータス、およびPHPの致命的エラーシグネチャを伴わない非空のHTTP 500レスポンスは、クラッシュシグナルとして扱われません。
スキャナはデフォルトで /index.php をテストします。URLで指定されたパスは保持され、--path または --path-file でカスタムパスをテストできます。phpMyAdminのターゲットは /show_config_errors.php で自動的に再テストされます。リダイレクトは追跡されません。
デフォルトの --sapi auto モードは、mod_phpとPHP-FPMの両方の判定ルールを適用し、Assetnoteのpostmodulesの複合的な動作に一致します。--sapi mod_php または --sapi fpm を使用して、検出を既知のSAPIに制限できます。
テストされる各パスは、42バイトの制御リクエストと、合計約29 MiBの3つのプローブを受信する可能性があります。判定が確定するとすぐにプロービングは停止し、重複する入力URLは1回だけスキャンされます。
pip install -r requirements.txt
単一のホストをスキャンします:
python3 scanner.py -u https://example.com
ホストのリストをスキャンします:
python3 scanner.py -l hosts.txt
複数のスレッドでスキャンし、結果を保存します:
python3 scanner.py -l hosts.txt -t 20 -o results.json
カスタムヘッダーを使用してスキャンします:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
カスタムパスをスキャンします:
python3 scanner.py -u https://example.com --path /phpinfo.php
python3 scanner.py -u https://example.com --path /index.php --path /admin.php
python3 scanner.py -u https://example.com --path-file paths.txt
PHP-FPM の判定ルールのみを使用します:
python3 scanner.py -u https://example.com --sapi fpm
-u, --url Single URL to check
-l, --list File containing hosts (one per line)
-t, --threads Number of concurrent threads (default: 10)
--timeout Request timeout in seconds (default: 60)
-o, --output Output file for results (JSON)
--all-results Save all results, not just vulnerable hosts
-k, --insecure Disable TLS certificate verification
-H, --header Custom header (can be used multiple times)
-v, --verbose Show verdict reasons and response snippets
-q, --quiet Only output vulnerable hosts
--no-color Disable colored output
--sapi Verdict rules: auto, mod_php, or fpm (default: auto)
--path Custom path to test (can be used multiple times)
--path-file File containing paths to test (one per line)
php2shell の最初の原発見は Calif チームによるものです。彼らの解説記事はこちらで読むことができます: https://calif.io/php2shell/。
スキャナーは Assetnote Security Research Team によって、Searchlight's Exposure Platform 向けに構築されたロジックを用いて作成されました。
結果はターミナルに出力されます。-o を使用すると、脆弱なホストが判定理由とマスク処理された HTTP リクエスト/レスポンスの証拠とともに JSON ファイルに保存されます。
特定の PHP 設定では、マルチパートプローブが PHP の memory_limit を超えた場合に、スキャナーが誤検知を報告することがあります。その場合、パッチ適用済みバージョンと脆弱なバージョンが同じ空の HTTP 500 レスポンスを返す可能性があります。
これは、パッチ適用済みの PHP 8.4.27 において memory_limit を 2M から 32M に設定した場合、および PHP 8.3.36 において max_multipart_body_parts を 2785 以上 に設定した場合の 128M で再現されました。正確な閾値はビルドによって異なる場合があります。
PHP がバージョンを開示しない場合、スキャナーはこの安全なパッチ適用後の OOM と、脆弱なパッチ適用前の挙動を区別できません。したがって、結果はインストールされている PHP のバージョンおよびベンダーのバックポートに対して検証する必要があります。