Kib*_*bee 41 security xss ajax
为什么决定使用XMLHTTPRequest进行XML调用不应该跨域边界调用?您可以检索JavaScript,图片,CSS,iframe以及我能从其他域中想到的任何其他内容.为什么不允许Ajax HTTP请求跨越域边界?考虑到我可以看到它被滥用的唯一方式,这似乎是一个奇怪的限制,如果有人将Javascript注入页面.但是,在这种情况下,您只需向文档中添加img,script或iframe元素,即可让它请求第三方URL并将其发送到服务器.
[编辑]
一些答案指出了以下原因,让我们指出他们没有创造禁止这一点的主要原因的原因.
你可以在不使用它的情况下进行XSRF攻击.作为一般规则,XMLHTTPRequest根本不被使用,仅仅是因为以与所有主流浏览器兼容的方式制作XMLHTTPRequest非常困难.如果您希望它们加载您的URL,则可以更轻松地向网址添加img标记.
<script type="text/javascript">
$.post("http://some-bank.com/transfer-money.php",
{ amount: "10000", to_account: "xxxx" })
</script>
Run Code Online (Sandbox Code Playgroud)
可以完成
<body onload="document.getElementById('InvisbleForm').submit()"
<div style="display:none">
<form id="InvisbleForm" action="http://some-bank.com/transfer-money.php" method="POST">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="to_account" value="xxxxx">
</form>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
你不会再造成任何不安全感.您只是想要以良好的方式使用它的开发人员感到不安.任何想要将此功能用于邪恶(也称为真棒)的人都可以使用其他方法来实现它.
我将bobince的答案标记为正确,因为他指出了关键问题.因为XMLHTTPRequest允许您使用凭据(cookie)发布到目标站点,并读取从站点发回的数据,以及发送人员凭据,您可以编排一些提交一系列表单的JavaScript,包括确认表单,完成生成的任何随机密钥,以防止XSRF.通过这种方式,您可以浏览目标网站,如银行,银行的网络服务器将无法确定是否只是提交所有这些表单的普通用户.
bob*_*nce 36
为什么不允许Ajax HTTP请求跨越域边界.
因为AJAX请求是(a)使用用户凭据提交的,并且(b)允许调用者读取返回的数据.
这些因素的组合可能会导致漏洞.有建议添加一种省略用户凭据的跨域AJAX.
您只需在文档中添加img,script或iframe元素即可
这些方法都不允许调用者读取返回的数据.
(除了脚本之外,它是故意设置允许的,允许的跨域脚本编写 - 或者某人做出可怕的蠢事.)
你可以在不使用它的情况下进行XSS攻击.发布到第三方网站
这不是XSS攻击.这是一个跨站点请求伪造攻击(XSRF).有一些已知的解决XSRF攻击的方法,例如包括一次性或加密令牌,以验证提交是故意来自用户的,而不是从攻击者代码启动的.
如果您允许跨域AJAX,您将失去这种安全措施.攻击代码可以从银行站点请求页面,读取其上的任何授权令牌,并在第二个AJAX请求中提交它们以执行传输.这将是一个跨站点脚本攻击.
POST之间的一个重要区别:
<body onload="document.getElementById('InvisbleForm').submit()" ...
Run Code Online (Sandbox Code Playgroud)
和Ajax是在做任何POST后,浏览器将替换页面并在执行Ajax调用之后 - 而不是.POST的结果将是:
my-bank.com将采取控制.没有银行会实施一键转移.如果允许跨域Ajax,XSRF的场景将如下所示:
www.bad-guy.com.my-bank.com在浏览器的其他实例中没有打开页面,则攻击不成功.www.bad-guy.com进行Ajax调用my-bank.com.my-bank.com发送给它并发送它们.www.bad-guy.com页面上看到漂亮的图片.my-bank.com如果需要,JavaScript代码会进行其他几次调用.要点是不需要注入或任何页面篡改.
更好的解决方案可能是允许呼叫本身但不发送任何cookie.这是一个非常简单的解决方案,不需要任何广泛的开发.在许多情况下,Ajax呼叫进入不受保护的位置,不发送cookie不会受到限制.
现在正在讨论的CORS(跨源资源共享),其中包括发送/不发送cookie.
| 归档时间: |
|
| 查看次数: |
15938 次 |
| 最近记录: |