|
|
一、综述
有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不受限制执行任意JS.对于跨站师们来说,研究极端情况下XSS利用的可能性是一种乐趣;对于产品安全人员来说,不受限制的利用的可能是提供给开发人员最有力的证据,要求他们重视并修补这些极端情况下的XSS漏洞。
突破的方法有很多种,但是突破的思想基本都一样,那就是执行可以控制的不受限制的数据。
二、突破方法
2.1 利用HTML上下文中其他可以控制的数据
可控的安全的数据
alert(/xss/);
由于XSS点有字符数量限制,所以这里只能弹框,那么我们可以把XSS的Payload通过escape编码后作为安全的数据,输出到可控的安全数据位置,然后在XSS点执行可控的安全数据:
eval(unescape(x.innerHTML));
长度:28 + len(id)
由于x内部的数据没有字符数量的限制,那么从而可以达到执行任意JS的目的。
2.2 利用URL中的数据
长度:30
limited_xss_point>eval(location.href.substr(80));
长度:31
上面两个例子对比,前一个例子更短,那么有没有办法更短呢?通过查阅t手册的String的方法可以发现,切割字符串有一个更短的函数slice,5个字符比substr还要短一个字符:
长度:29
eval(location.href.slice(80));
长度:30
那么还有没有办法更短呢?答案是YES,查阅一下MSND里的location对象的参考你会发现有个hash成员,获取#之后的数据,那么我们可以把要执行的代码放在#后面,然后通过hash获得代码执行,由于获得的数据是#开头的,所以只需要slice一个字符就可以拿到代码:
eval(location.hash.slice(1));
长度:29
这样比上面的例子又少了一个字符。那么还可以更短么? |
|