【问题标题】:Cross-site scripting from an Image来自图像的跨站点脚本
【发布时间】:2008-10-27 18:52:52
【问题描述】:

我的网站上有一个富文本编辑器,我试图保护它免受 XSS 攻击。我想我已经处理了几乎所有的事情,但我仍然不确定如何处理图像。现在我正在使用以下正则表达式来验证图像 URL,我假设它会阻止内联 javascript XSS 攻击:

"https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+"

我不确定这让我对来自远程图像的 XSS 攻击有多开放。链接到外部图像是否构成严重的安全威胁?

我唯一能想到的是,输入的 URL 引用了一个资源,该资源返回“text/javascript”作为其 MIME 类型而不是某种图像,然后执行 javascript。

这可能吗?我还应该考虑其他安全威胁吗?

【问题讨论】:

  • 我还推荐 ha.ckers.org 备忘单:ha.ckers.org/xss.html

标签: security xss


【解决方案1】:

另一件需要担心的事情是,您可以轻松地将 PHP 代码嵌入到图像中并在大多数情况下上传。攻击唯一需要做的就是找到一种包含图像的方法。 (只有 PHP 代码会被执行,其余的只是回显)。检查 MIME 类型对您没有帮助,因为攻击者可以轻松地上传具有正确前几个字节的图像,然后是任意 PHP 代码。 (HTML 和 Javascript 代码也是如此)。

【讨论】:

  • 我不允许用户上传图片。用户只能出于您提到的原因链接到其他网站上的图片。
  • 一个简单的文件名过滤器不会阻止这种情况吗?
  • @AaronSieb,不,因为您可以,例如,将 PHP 代码嵌入 GIF 托盘并上传具有正确文件类型和 mime 类型的完全有效的 GIF 图像。问题是,只要我可以操纵网站做 include("my_uploaded_gif.gif") 你就有麻烦了。另外,注意 %00 的事情。
  • 我想我对 PHP 的了解还不够 :) 如果您有足够的权限执行 include("my_uploaded_gif.gif") 语句,为什么需要在首先是 GIF?
  • 拥有包含($_GET['p] . '.php') 的人就足以包含任意文件(index.php?p=some_image.gif%00 或其他)。将它们作为图像上传是在服务器上获取这些文件的一种方法。
【解决方案2】:

如果最终查看者位于密码保护区域,并且您的应用包含基于 GET 请求启动操作的 URL,您可以代表用户发出请求。

例子:

  • src="http://yoursite.com/deleteuser.xxx?userid=1234"
  • src="http://yoursite.com/user/delete/1234"
  • src="http://yoursite.com/dosomethingdangerous"

【讨论】:

  • 我真的会因此受到攻击吗?我的正则表达式只允许在 URL 的开头使用 http/https,所以 Javascript(或它的任何编码)应该无法通过,还是我错了?
  • @inf3rno - 你是绝对正确的。显然,我在完全理解 REST 之前就写了这个答案。我进行了编辑以避免任何混淆。
【解决方案3】:

在这种情况下,看看它周围的上下文:用户是否只提供一个 URL?在这种情况下,只需验证 URL 语义和 MIME 类型就可以了。如果用户还可以输入某种类型的标签,您必须确保它们不可被操纵以执行除显示图像之外的任何操作。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2017-11-06
    • 2013-11-26
    • 2014-01-12
    • 2014-01-27
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多