コース目次 / 第2章

発見から、再現手順を固める

見つけた穴を、あいまいな記憶ではなく誰でも辿れる番号付き手順に固める作業を、実際に自作やられ(vuln-portalのIDOR)で行います。良い手順・悪い手順を見比べます。

第2章 / 全6章目安 約10分この章のゴール: 見つけた穴を、誰が読んでも同じ結果になる再現手順として固められるようになる

前章で偵察した対象に、これまでのコースの目で穴を見つけたとします。次にやることは、もう一度確かめること——ではありません。誰が読んでも、あなたと同じ結果にたどり着ける手順に固めることです。

悪い再現手順を、読んでみる

こんな再現手順を、報告書で見たことがあるかもしれません。

悪い例:
ログインして、注文のページを見ると、他人の情報が見えることがある。

これでは、受け取った人は何もできません。「ログイン」に使う ID は? 「注文のページ」とは具体的にどのURL? 「他人の情報」とは何を指す? 「見えることがある」——毎回? 特定の条件で?
あいまいな再現手順は、報告書の価値をほぼゼロにします。受け手が再現できなければ、直しようがない——修正されないまま放置される、最悪の結果を招きます。

良い再現手順の条件

sec-authz で見つけた IDOR(vuln-portal.js の /orders/1002)を題材に、良い手順を書いてみます。

良い例:

前提: サーバ(vuln-portal.js)が http://127.0.0.1:3600 で起動していること。

1. ブラウザで http://127.0.0.1:3600/login?as=t1 を開く(ユーザー t1 としてログイン)。
2. 続けて http://127.0.0.1:3600/orders を開き、自分の注文一覧を確認する。
   → 注文 ID 1001(三脚・8000円)のみが表示される。
3. ログインしたまま、http://127.0.0.1:3600/orders/1002 を直接開く。
   → 期待: 403(権限エラー)。実際: 200 で、別ユーザー t2 の注文
      (フィルム・3000円)が表示される。

違いは明確です。①前提(何が起動しているか)を明記し、②番号付きの、具体的な操作で、③各ステップの結果を書き、④「期待される動作」と「実際の動作」を対比させています。この形なら、受け取った人はこの手順をそのまま自分の環境でなぞるだけで、あなたと同じものを見られます。

固める、というプロセス

「見つけた」瞬間の操作は、たいてい行き当たりばったりです。あちこち試して、偶然うまくいく。そのままでは、再現手順になりません。

1. 最初から、もう一度やり直す。行き当たりばったりで見つけた道筋を、最短の手順に整理する。
2. 一度、他人のつもりで辿ってみる。自分が書いた手順を、書いた記憶を忘れたつもりで読み、抜けている前提が無いか確かめる。
3. できれば、本当に一度やり直す。サーバを再起動し、手順どおりに操作して、本当に再現するかを確認する。ここで再現しなければ、手順のどこかが間違っています。

これは、旗艦コースで学んだ「再検証」と地続きです。あなたが直す前の攻撃を、あとでもう一度、寸分違わず実行できる必要がありました。良い再現手順は、まさにその「寸分違わず」を、他人でも辿れる形にしたものです。

演習

自分が過去のコースで見つけた穴を1つ選び、上の型で再現手順を書き出してみてください。書けたら、一晩置いてから読み返す(あるいは、いま書いた前提を忘れたつもりで読む)と、抜けが見つかりやすくなります。

持ち帰る一言

あなたの記憶ではなく、他人が辿れる手順を書く。 前提を明記し、番号付きの具体的な操作で、期待と実際を対比させる。行き当たりばったりの発見を、最短の再現手順に固める作業が、報告書の心臓を作ります。次は、その穴が「どれくらい深刻か」を評価します。

こうなっていればOK

卒業まであと3章です。

この章はまだ完了していません。