php-open-redirect-audit について
PHP プロジェクトのオープンリダイレクトを調べるセキュリティ監査スキルです。コード監査担当者向けに、ユーザー入力による遷移先と検証処理を追跡し、php-route-tracer の証拠を求めます。
主な機能
- 01header や redirect などの出力箇所を特定
- 02遷移先の入力元と検証処理を追跡
- 03スキーム、エンコード、空白文字による回避を確認
- 04ルート証拠、データフロー、PoC、修正案を要求
活用シーン
- 01next や return_to が遷移先を制御できるか確認
- 02外部 URL やエンコード形式による検証回避を評価
- 03ログイン後の遷移がフィッシングに使われないか確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ 0xshe/ php-code-audit-skill --skill php-open-redirect-auditインストール後、Claude Code で/php-open-redirect-auditを入力して読み込まれたか確認します。
詳細
PHP オープンリダイレクト監査(php-open-redirect-audit)
PHP プロジェクトのソースコードを分析し、すべての「ジャンプ/リダイレクト」動作で、遷移先をユーザーが制御できる可能性があり、フィッシングや OAuth などのフローが乗っ取られるおそれがないか確認します。
重大度と番号
- 詳細:
shared/SEVERITY_RATING.md - 脆弱性番号:
{C/H/M/L}-REDIR-{序号}
必須チェック対象のシンク
次のリダイレクト出力箇所を特定します。
header("Location: {value}")<meta http-equiv="refresh" content="{value}">redirect()/to()/return redirect({value})- カスタムリダイレクト関数(内部で最終的に Location を出力)
制御可能性の追跡(必須)
次の 2 種類の変数を必ず追跡します。
- 遷移先の入力元:通常は
$_GET['next']/$_POST['url']/Referer/return_toなどです - 遷移先の検証:相対パスのみを許可しているか、allowlist があるか、scheme(
http://///)を拒否しているか、ドメインを検証しているか
回避条件(必須)
次の潜在的な回避方法を特定して出力します。
- scheme の回避:
//evil.com、http:%2f%2fevil.com - エンコードによる回避:二重エンコード、URL エンコードされたコロン/スラッシュ
- 末尾/空白文字による回避(古い実装でよく見られます)
レポート出力
{output_path}/vuln_audit/redir_{timestamp}.md
項目テンプレート(必須)
各脆弱性には、次の項目を必ず含めてください。
- 位置を示す証拠:リダイレクト関数の位置 + ルート
- データフロー:ユーザー入力 -> 検証 -> header/redirect
- 悪用の前提条件:通常、ログインが必要か(ログイン後のリダイレクトの場合)と、攻撃者がパラメーターを制御できるかどうか
- 検証 PoC(実際のルートが必須。遷移先パラメーターは実際のフィールド名に置き換えてください)
- 修正案:相対パスのみを許可し、サーバー側の allowlist を使い、エンコード/scheme を正規化してから検証します
証拠の引用(必須:php-route-tracer から取得)
オープンリダイレクトの疑いがある各脆弱性について、trace 出力の ## 9) Sink Evidence Type Checklist にある REDIR 行に対応する証拠項目をそれぞれ引用してください(状態は検証待ちでも構いませんが、証拠の引用は必須です)。
EVID_REDIR_OUTPUT_POINT:リダイレクト出力箇所の位置を示す証拠(header/redirect の最終出力位置)EVID_REDIR_DEST_SOURCE_MAPPING:遷移先の入力元変数の対応関係を示す証拠(ルートパラメーターから遷移先変数まで)EVID_REDIR_DEST_VALIDATION_NORMALIZATION:遷移先の検証/正規化/allowlist/scheme 拒否の分岐を示す証拠(エンコード回避への対処分岐を含む)
tracer の証拠が不足している場合の処理(必須)
- 上記 1〜3 の重要な証拠項目のいずれかを特定できない場合、その脆弱性の状態は
⚠️待ち検証と記載する必要があり、✅悪用可能と確認済みとしてはなりません。
コメント
Markdown 対応