【问题标题】:Is it possible to perform a XSS attack using jQuery's .attr("href", value) method for <a> tags?是否可以使用 jQuery 的 .attr("href", value) 方法对 <a> 标签执行 XSS 攻击?
【发布时间】:2019-02-14 21:38:41
【问题描述】:

给出以下 html 片段,它是静态输入到 html 文件中的:

<a id="link001" href="https://google.com" target="_blank">Google</a>

请注意,href 的属性值已被引用。当攻击者可以在以下上下文中为变量unsafe_string 提供任意值时,是否可以执行 XSS 攻击:

$('#link001').attr("href", unsafe_string);

我的问题是:是否可以注入和执行恶意代码?攻击者只能控制unsafe_string,没有别的。攻击者可以假设受害者最终会点击链接。

用户可以通过点击链接被转发到一些恶意网站的情况应该被忽略。

【问题讨论】:

    标签: jquery html xss


    【解决方案1】:

    是的,这是不安全的,可以在恶意代码前面加上javascript::

    $('#link001').attr("href", "javascript:alert('evil')");
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <a id="link001" href="https://google.com" target="_blank">Google</a>

    【讨论】:

    • 在这种情况下是否可以安全地阻止 JS 执行?将 unsafe_string 包装到函数 encodeURI() 将无济于事。检查特定字符序列非常容易出错,因为可以应用不同的编码。检查网址是否以http 或https 开头可能是一种想法,但如果还应允许相对链接,则不适合。
    • 我最初的想法是确保字符串不以javascript: 开头(不区分大小写);一旦解决了这个问题,您是否知道任何其他可能的利用路径?
    • 前置例如控制字符和空格也将允许运行 javascript:$('#link001').attr("href", "\n\b\r\t jAvAsCrIpT:alert('evil')"); 也许最好强制用户提供绝对 url,因为每个相对 url 都可以写为绝对 url 并遵循白名单方法,要求给定的字符串完全以http(或http://)或https(或https://)。
    • 此外,也许还有一些其他脚本语言可以在某些情况下(在某些浏览器中)执行,例如:$('#link001').attr("href", "vbscript:msgbox('XSS')"); 或$('#link001').attr("href", "livescript:[code]");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2012-05-12
    • 2011-09-25
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多