预防跨站点请求伪造:了解浏览器选项卡中的隐藏危险(1)
- UID
- 1066743
|
预防跨站点请求伪造:了解浏览器选项卡中的隐藏危险(1)
简介IBM Security AppScan Standard
IBM® Security AppScan® Standard 可帮助识别应用程序中潜在的 XSRF 漏洞。可从 developerWorks 下载和试用 。
有时您可能在想,您是否变得健忘了。您可能会扪心自问,“我什么时候在社交网络帐户中向这个网站提交了一个链接?” 一些人甚至都不会注意到。他们从朋友那里发现,他们的社交网络帐户上出乎意料地添加了一个成人网站的链接。
事实证明,您在浏览器选项卡中打开的其他网站可能会代表您执行操作。
假设您在一个选项卡中打开您的社交网络站点,在另一个选项卡中打开另一个称为 many_ads.com 的网站。您并不知道,many_ads.com 是一个恶意网站。many_ads.com 网站可向您的社交网络站点发出消息。此操作称为跨站点请求伪造(简称 XSRF 或 CSRF)。
尽管这种恶意发布很讨厌且会令人尴尬,但也没有什么大不了的,是吗?您随时可删除发布的信息。
但 XSRF 攻击会让您损失金钱。如果您的银行站点容易受到 XSRF 攻击,您可能会向一个未知的海外账户付款,并且表面上看起来是您支付的。事实上,根据服务器日志来看,是 您自己完成的付款。
攻击场景假设一家名为 Altoro Mutual 的虚构银行有一个页面来处理向一个特定账号的转账。请求可能是这样的:
1
| http://www.altoromutual.com/bank/transfer.aspx?creditAccount=1001160141&transferAmount=1000
|
攻击者注意到该链接,发现如果他让其他人访问该链接,他可向其海外账户转入任意多的资金。
他可能在电子邮件中发送该链接:
亲爱的 Altoro Mutual 客户,
我们最近对服务器应用了一些安全改进,需要您重新验证您的帐户。
请单击下面的 继续。
但是,发送电子邮件可能暴露攻击者的意图,尤其是在用户最终在一个页面上看到以下信息时:已成功将 1000 美元转入账号 1001160141
如果攻击者可让用户非故意地访问他的链接,该怎么办?
对攻击者来说,方便的是,许多 Altoro Mutual 用户常常访问一个金融讨论论坛。在这个称为 Altoro Community 的虚构网站上,您可在您的论坛帖子中创建头像。
论坛头像是一张图,可能就像这张普通的人像图片:
图 1. AltorJ Community 网站头像的示例图像用户帖子中的头像可能类似于这个例子:
表 1. 论坛帖子中的 AltorJ Community 头像示例头像示例帖子示例
Evil Hacker
50 篇帖子 大家好,
我想问是否有人看到了最新的 Altoro 财务报表。
该社区网站允许用户为一个自定义的头像指定一个 URL。该头像通常通过填写一个字段来指定,就像这个示例:
表 2. 指定一个自定义头像示例字段示例 URL 指定您的头像: http://some_image_site_found_with_google/random_image.jpg
如果攻击者使用转账链接作为头像,情况会怎样?例如:
表 3. 攻击者指定一个头像示例字段示例 URL 指定您的头像: http://www.altoromutual.com/bank ... =1001160141&transferAmount=1000
现在,用户每次访问社区论坛并查看攻击者编写的帖子时,该请求就会在浏览器尝试加载头像时执行。攻击者头像的图片不会加载。每个访问该论坛主题的用户都会将钱转给攻击者,只要该用户也在另一个浏览器选项卡中登录到 Altoro 网上银行。
图 2. 攻击者编写的缺少头像图片的示例帖子您可能会告诉自己,“好吧,我使用表单来转账,所以肯定不会受影响!”
确实,大部分转账请求都是通过提交表单请求来发起的,攻击者很难像头像示例那样利用这些请求。但攻击者有办法解决表单请求。攻击者可设计一个页面,其中包含一个从恶意网站提交转账请求的表单。
攻击者无法将该页面用作头像,但可让它看起来像某种财务博客,吸引受害者访问它。
恶意网站上的页面可能类似于 :
清单 1. 恶意网页代码示例1
2
3
4
5
6
7
8
9
10
11
| <html>
<body onLoad="document.getElementById('transferForm').submit()">
<form id="transferForm" action="http://www.altoromutual.com/bank/transfer.aspx" method="post">
<input type="hidden" name="creditAccount" value="1001160141">
<input type="hidden" name="transferAmount" value="10">
</form>
</body>
|
请注意,这个表单会在加载该 URL 时自动提交。无需来自用户的交互。 |
|
|
|
|
|