在没有相等字符的jQuery中利用XSS?

信息安全 攻击 xss javascript jQuery
2021-08-12 14:38:09

这是一些易受攻击的 JavaScript 代码:

$(document).ready(function(){
    var payload = unescape(document.location.hash.substr(1));
    $(payload);
    document.body.innerText = "The payload is: " + payload;
});

当我尝试用这个输入来利用它时

http://localhost/xss.html#<img src=x onerror=alert(0)>

它工作正常,弹出警报。我的情况略有不同,有一个小过滤器可以防止利用:

$(document).ready(function(){
    var payload = unescape(document.location.hash.substr(1));
    payload = payload.split('=')[0];  // <------- The new filter
    $(payload);
    document.body.innerText = "The payload is: " + payload;
});

它会截断“=”字符之后的所有内容,这意味着我无法注入属性。我已经尝试了以下方法,但没有奏效:

  • HTML 对等号字符 ( onerror&equal;alert())进行编码
  • <script>alert(0);</script>

任何人都知道我可以做些什么来绕过这个过滤器?

3个回答

我认为在这一点上可以肯定地说,使用现代浏览器的这个过滤器没有琐碎的/教科书绕过。我与一群我认为精通 XSS 的朋友和同事分享了这段代码,但他们都无法构建绕过。

您可以尝试与您尝试输入的内容等效的编码字符。尝试在输入的有效负载部分使用 URL 编码来绕过此过滤器。

例如,您可以将 URL 编码为“=”%3D或 URL 编码<img src=x onerror=alert(0)>%3Cimg+src%3Dx+onerror%3Dalert%280%29%3E

如果期望“=”,这将绕过过滤器

或者,由于您看起来像是在本地主机上运行它,因此使用 Burp Suite 等代理工具来拦截您的请求/响应,您可以使用不同的有效负载来测试您的 XSS 有效负载。

你应该对其进行编码。像这样的东西会起作用:

 eval(String.fromCharCode(/*list of codes of payload*/))

您需要将有效负载拆分为字符并将它们一一转换为整数。你可以为它制作一个脚本。

你也可能想看看 atob 和 btoa。