如何使用图像URL阻止跨站点请求伪造攻击?

时间:2010-01-31 18:52:48

标签: security struts csrf

来自ha.ckers.org/xss.html

  

IMG嵌入式命令 - 这有效   当网页在哪里   注入(如网页)落后   密码保护和密码   保护与其他命令一起使用   在同一个域名上。这可以使用   删除用户,添加用户(如果是   访问该页面的用户是   管理员),发送凭据   别的等等....这是其中之一   较少使用但更有用的XSS   载体:

<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
     

或:

     

重定向302 /a.jpg http://victimsite.com/admin.asp&deleteuser

我允许用户在论坛中发布图片。如何防止这种情况?

我正在使用Java Struts,但欢迎任何通用答案。

5 个答案:

答案 0 :(得分:5)

如果你遵循HTTP specification的规则,这种攻击不会造成任何伤害。 9.1.1 Safe Methods部分说:

  

[...] GET和HEAD方法不应该采取除检索之外的其他操作的重要性。这些方法应该被认为是“安全的”。这允许用户代理以特殊方式表示其他方法,例如POST,PUT和DELETE,以便让用户知道正在请求可能不安全的操作。

     

当然,无法确保服务器不会因执行GET请求而产生副作用;实际上,一些动态资源会考虑这个功能。这里的重要区别是用户没有请求副作用,因此不能对他们负责。

因此,只允许通过POST允许所有在服务器端更改数据的请求。即使在那里,您也应该仅通过生成仅对特定表单/操作有效的令牌来允许您的系统已经过身份验证的请求。

答案 1 :(得分:3)

此攻击只是对任何URL发出的HTTP GET请求。您无法通过阻止某些<img>标记来可靠地阻止它。

相反,您需要确保您的网站没有目标(响应GET请求和更改内容的网址)

如果没有任何“多汁”的URL响应HTTP GET(而不是POST)并更改数据,则攻击者无需攻击。 (<img>标记不能用于创建HTTP POST)

答案 2 :(得分:2)

跨网站脚本编制是您不应允许论坛用户通过链接到您网站外的图片来发布图片的一个原因。 应通过允许用户将图像文件上传到您的站点并使用内部相对URI来提供图像发布。

答案 3 :(得分:2)

通过注入<img>标记,有人可以绕过基于引用的XSRF保护来获取GET请求。原因是因为<img>生成的GET请求的引用与其自身的主机具有相同的引用。因此,这将绕过代码检查,以查看引用者和主机的不同之处。

您不应该允许人们在您的网页上放置HTML。在这种情况下,您应该让用户上传它们,然后在本地托管图像。如果你真的希望人们在你的网站上放置IMG标签,请确保URL没有指向你的服务器,因为这就是攻击所能做的!也不要使用基于referer的XSRF保护,使用基于令牌。 <img>标记注入无法绕过基于令牌的xsrf保护。

答案 4 :(得分:0)

似乎没有人提到允许人们发布图片的威胁不是,而是其他网站

如果您允许人们发布图片但您的网站没有XSRF漏洞,则您的网站不会处于危险之中;其他具有XSRF漏洞的网站,因为您的用户在访问您的网站时会在不知不觉中通过嵌入式图像向其他网站发出请求。恶意<img>标记看起来像这样:

<img src="http://my-bank-website.com/withdraw_money.php?amount=100000&account=mandy-the-hacker" />

请注意,这不是真实的图片,但浏览器不会知道,所以它会提出请求,将$ 100,000转移到 mandy-the-hacker 的帐户假设用户当前已登录 my-bank-website.com 。这就是XSRF漏洞的工作原理。

阻止此操作的唯一方法是强制用户上传图片,而不是为他们提供网址。但是,恶意用户仍然只能提供指向XSRF漏洞的链接,因此删除提供URL的能力并没有任何帮助;你不是通过允许<img>标记来伤害其他网站,他们通过不使用user-specific tokens in forms来伤害自己。