![]() |
About E4X Hacking |
针对xss漏洞利用真是成出不穷 看了Gareth Heyes的《E4X for hackers》,然后又回到以前没看完的这个贴《New XSS vectors/Unusual Javascript 》:(内容很丰富,大家慢慢翻阅了)。 通过使用E4X技术(ECMAScript for XML),可以混淆你的JS脚本,甚至bypass一些过滤规则。这里有简单的说明及实例,大家先了解一下。我主要说说我的一些测试结果: E4X在FF浏览器下有效,IE系列与Google的浏览器都不支持。看下面这段脚本: <script> 直接在<script>标签内写xml,对于FF来说这是合法的,并不会报错(注意写规范)。这段脚本会弹出一个x值,这是通过foo.id这样方式来访问xml的文档结构并获取的。接着看如何获取name属性的值thx呢? 这样:alert(foo.id.@name); //我们弹出来,id可以省略,于是直接这样:alert(foo..@name); //注意这个@符号,用来访问标签节点内的属性节点。好的,既然在<script>内写规范的xml文档是合法的,那么能这样么? alert(<foo>hi</foo>); //弹出hi。继续缩短代码?这样:alert(<>hi</>) //也弹出hi。 于是我们可以考虑将我们的脚本放到xml数据中。这样:x=<>alert('hello')</>(将整个xml数据赋值给x),然后获取这个xml数据,并eval出来:eval(x+[])。注意[]这个不可少:)。这些测试,都是在脚本内操作xml数据流。那么这个“内嵌”的xml数据里如何执行脚本表达式呢?比如:x=<>alert('hello')</>这个是没办法执行alert(),那么这样:x=<>{alert('hello')}</>就行了,即加个花括弧表示里面是我要执行的脚本,你要等我执行完了,再来操作我。 当然你进行上述操作时,可以先这样new XML()声明下,更规范些? 1、Function(<text>\u0061{new String}lert(0)</text>)() 为什么这样可以?看1与2,花括弧{}内执行的是脚本表达式(我上面说了),new String返回空,[]也返回空(继续扩展?),那么alert就是一个完整的了,并且我们可以对其进行编码:16进制,10进制等。Function本身返回一个函数对象,最后的括弧()执行获取到的文本节点内容alert(),弹出。 看3,这个很猛,原理上面都介绍了,@y依次访问xml数据中的y属性节点,a,然后是lert,最后是(123),弹出。大家还可以这样测试下了: x=<text><x y="a"></x><x y="lert"></x><x y="(123)"></x></text>..@y 先弹出123,然后再弹出alert(123)。 最后的4、5、6就没什么好介绍的了,很好理解。不过说下4,alert(/I am e4x/).source,不用双引号或单引号,这样也可以弹出I am e4x。当然这样也行:alert( String(/Test/).substr(1,4) );。当然还有更牛的方法。 |