jQuery 选择器中带有转义等号的 XSS

信息安全 xss dom jQuery
2021-08-16 06:38:54

网站使用 jQuery 1.8.3,它在选择器中有已知的 XSS 漏洞。https://snyk.io/vuln/npm:jquery:20120206)。

它在选择器内传递过滤和 urldecoded document.location.hashval2如下)值。

$('div[data-foo=\''+filter(val1)+'\'][data-value=\''+filter(val2)+'\']')

function filter(str) {
    if (str)
        return str.replace(/([ #;?%&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1');
    return str;
}

我想出了以下有效载荷:

<img%09src%09onerror=alert`1`%09>

如果等号不替换为\=. 浏览器似乎根本无法容忍\=

有什么想法可以绕过它,或者可能是另一个可以在这里工作的有效载荷吗?

更新:

如此处所述: https ://security.stackexchange.com/a/60915/196507

<script defer>alert(2)</script>可能适用于某些浏览器(我也在某处发现 IE 就是这个浏览器)。但不幸的是,它并没有以简化形式在 IE11 事件中为我分叉:

document.getElementById('test').innerHTML = "<script defer>alert(1)<\/script>";

更新2:

<script defer>在 IE9 中工作,但那里不支持反引号 (`)。所以出现了转义括号的问题。

1个回答

如果字符集不是非典型的,您也许可以这样做,然后您可以通过使用多字节字符转换为等号来获得有效结果,但您不能自己更改字符集,因为它可能会出现在服务器响应标头中,或默认为 UTF-8。

HTML 标准的第 12.1.2.1-3 节中,必须关闭标签,U+003E因此使用脚本标签将不起作用。属性可以通过空语法指定,例如“禁用”,但这些都不允许您执行 JavaScript。正如您在问题中指出的那样,您可以使用不带引号的值语法,但不带引号的部分必须跟在一个U+003D符号后面,就像单引号或双引号属性一样,这意味着没有可利用的途径。