img src 和 background-image url 中的 XSS 向量

信息安全 Web应用程序 网页浏览器 攻击 xss javascript
2021-08-22 13:08:46

在提供 img.src 和后台 url 时,我对 XSS 漏洞有点困惑。据我了解,在这种情况下执行 javascript 的唯一方法是使用 javascript 协议。让我们考虑这个例子:

if (location.hash.indexOf('javascript:') !== 0) {
    img.style.backgroundImage='url("'+location.hash+'")';
 }
 img.src='some/local/path/'+location.hash;

此代码中是否存在 XSS 漏洞?

2个回答

,在现代浏览器中,不可能通过标签的styleorsrc属性实现 XSS。<img>

所以这些都不会在任何最新的浏览器中执行 JS 代码:

<img src="javascript:alert(1)">
<img src="x.jpg" style=background-image:url('javascript:alert(2)')">

CSS 属性中对 Javascript 的支持早已被放弃你可以在这里找到一些关于它的旧参考资料

分析您的示例代码

location.hash总是以#符号开头。由于这个字符在 JS 中是非法的,并且不是新 URL 的有效开头,所以一开始就不可能出现 XSS。(例如,eval(location.hash)总是产生语法错误。)

让我们假设,您忽略#andlocation.hash可以真正包含您想要的任何字符串。

那么这个安全检查是有缺陷的:

(location.hash.indexOf('javascript:') !== 0)

攻击者仍然可以构造以 . 开头的 URL JaVaScRiPt:此外,假设任何实现都不允许前导空格或控制字符(例如\t\x00javascript:)是有风险的。那么 URL 编码呢?以开头的有效负载javascript%3a将通过您的过滤器。另外,您要允许该data:协议吗?如果您想将 URL 限制为绝对位置,您可以将开头列入白名单,http://https://不是列入黑名单javascript:

这可以:

img.src='some/local/path/'+location.hash;

即使该src属性容易受到脚本代码的影响,您的前缀some/local/path/也可以确保它不能转换为 JS URL。但是,攻击者可以指定同一服务器上的图像文件的任何相对路径,您可能会觉得这是不受欢迎的。

注意:这是关于构建恶意javascript:URL。如果你想使用用户控制的值,比如location.hashHTML 输出或不同的上下文,你必须正确地清理字符串。

是的,这一个问题,甚至可能是一个大问题,但“XSS”可能不是正确的术语。

什么可能出错?

  1. 使用 svg 执行远程代码,尤其是旧版浏览器
  2. 场外图像泄露您用户的 IP 地址(又名纬度/经度)、userAgent 和网络性能
  3. 恶意图像本身就是向量,过去有很多 0days
  4. 一个特殊的甚至只是大而糟糕的 GIF 可以让页面/CPU 变得糟糕
  5. 大图像可用于注入大量已知数据以帮助破解加密
  6. 您的网站可能会“宣传”您不想与之关联的内容
  7. 场外图像可以确认特定用户获得特定链接并访问

虽然这些都不是传统的 XSS,但它们都是无赖。

如果您需要自定义功能,我会推荐从现场图像白名单中进行某种选择。