本日(2018/11/12)に前回の徳丸日記のCSRF初級編の回答が出ていたので、このブログでも解説します。
続いて、中級の問題も出ていましたが、この記事では初級編の解答のみの解説となります。
また、内容について誤り等があれば優しく教えてくれると助かります。
ブラックボックス診断的な検証
実際の解答やPoCについては徳丸日記を参照していただくのが一番かと思います。
この記事では普段脆弱性診断を実施している際にやっている診断方法で検証をし、脆弱性を見つけましょう。
まずはプロキシツール「burp」を使用し全ての画面にアクセスを行いリクエスト内容を確認してみます。
すると、最後の「chgmail.php」のリクエスト内容で以下のように処理されています。(ブラウザはFirefox)を使用しています。
#chgmail.php POST /chgmail.php HTTP/1.1 Host: 192.168.70.139 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://192.168.70.139/chgmailform.php Content-Type: application/x-www-form-urlencoded Content-Length: 82 Cookie: PHPSESSID=cf7621vs01968usds8rapnok8g Connection: close Upgrade-Insecure-Requests: 1 mail=csrftest%40example.com&token=5eac682c2d4e732aac203a766b35374fa96e10cd85a09448
このリクエストを送信したレスポンスでメールアドレスが変更しましたと表示されているため、このリクエストを検査しCSRFが存在しているか調査します。
調査には「burp」の機能の一つである「Repeater」を使用します。
リクエスト内容の個所で「Ctrl+r」を押すことでリクエスト内容を「Repeater」に送ることができます。
まずは同じリクエスト内容を送信してみます。以下のように「Repeater」画面で「Go」ボタンを押せばOKです。
結果は「正規の画面からご利用ください」と表示され、処理は失敗します。
ちゃんとパラメータ「token」を見ていそうですので、次に「token」の値を削除してみます。
先ほどと同様に「正規の画面からご利用ください」と表示され、処理は失敗します。
じゃあ、次にパラメータ「token」ごと削除して送信してみましょう。
すると今度は以前までとは異なり、処理が成功してしまいます。
このため、このリクエストを送信することで処理は成功します。
また、「Referer」ヘッダを確認している場合もあるため、削除して確認してみますが、ちゃんと成功します。
以上の調査から、該当の処理にCSRFが発生する要因があることがわかりました。
検証時や診断時の注意
なお、CSRFの確認時について、実際の検査時においても気を付ける箇所があります。
それは、手作業での検査時に「chgmailform.php」にアクセス後に「メールアドレス変更」ボタンを押下して、burpでリクエストを変更して処理を行った際は確認ができないことです。
以下のように「chgmailform.php」にアクセスし、メールアドレスに値を入力します。
次に「burp」で「Intercept On」にし、ブラウザからのリクエストを変更します。
すると、パラメータ「token」はリクエスト内に含まれていませんが、以下のように処理は失敗します。
ソースを読めば、「chgmailform.php」にアクセスした際に「token」の値がセッションIDにも保存されているため、失敗することがわかりますが、本当にブラックボックスで検査した際は判定漏れする可能性があるので、今回のような処理になっている場合もあることを考慮して検査する必要がありますね。
最後に
徳丸日記のCSRFの問題初級編の解説を行いました。
非常にいい問題だなと思いました。
次の中級編も出ていたので、こちらも取り組んでいこうと思います。
なお、ソースを読んでもわからない方もいるかもしれませんが、その際は実際にローカルの環境(VM等)を実際に作成し、徳丸日記の解答を見ながらでもいいので、手を動かしてやってみることが理解の近道になると思います。
不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。
コメント