XSS中JavaScript加密以及Filter bypass
转载于http://www.iteye.com/topic/947149
在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例javascript代码:
Javascript代码
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
这是一段完全合法的javascript代码,效果相当于alert(1)。它可以在大部分浏览器上运行。(虽然目前我测试过手头的浏览器都能运行,但理论上不能保证所有浏览器都能正确运行,原因见下文)
这段代码的好处(对于***)是,它不包含任何字符或数字,可以逃过某些过滤器的检查。比如说,如果假定一个AJAX请求将返回一个只包含数字的 JSON,于是很可能会简单判断了一下其中不含字母就直接eval了,结果给***们留下了后门。上面的代码功能很简单,只是alert(1),但使用同样 的原理,完全可以干出更复杂的事,例如alert(document.cookie)。更重要的是,这段代码再一次提醒我,***的想象力是无限的……正如 Ryan Barnett的演讲标题:"XSS:The only rule is no rule"。
那么这段代码是如何工作的呢?
我们可以把它分为两个部分来理解:
第一部分:
Javascript代码
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()
第二部分:
Javascript代码
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
其中第一部分是核心,我们首先对它进行分析,先缩进一下:
Javascript代码
($= [$=[]][ (__=!$+$)[_=-~-~-~$] + ({}+$)[_/_] + ($$= ($_=!''+$)[_/_] + $_[+$]) ] )()
显然,最外层是(...)()形式的函数调用,我们需要看看这里究竟调用了什么函数,返回了什么。下一步,我们把原来代码中赋值表达式提取出来,将其改写为以下等价形式:
Javascript代码
$ = []; //1 __ = !$+$; //2 _ = -~-~-~$; //3 $_=!''+$; //4 $$ = $_[_/_] + $_[+$]; //5 $= [$][ __[_] + //6 ({}+$)[_/_] + //7 $$ //8 ]; //9 $(); //10
现在来一行行看:
1. $先赋值为一个空数组 (后面会被覆盖)
2.__ = ![] + [] = false + [] = "false"这里利用了javascript运算的强制类型转换特性。首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时,由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"",因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。 **
换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串**
3. 在计算~[]时,~需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1
Java代码
参考: ~3 = -4 ~[3] = -4 ~[3,2] = -1 (无法转为数字) ~"3" = -4 ~"abc" = -1
因此:
_ = -~-~-~[] = -~-~-(-1) = -~-~1 = -~-(-2) = -~2 = -(-3) = 3
理论上,可以用这种方式得出1-9所有数字
4. !''是true,使用+$将其变为字符串 "true"
5. 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0)。因此:$$ = "true"[3/3] + "true"[+[]] = "true"[1] + "true"[0] = "rt"
6.__[_] = "false"[3] = "s"
7. ({} + [])导致空对象{}被转换为字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o"
9. 这里把$覆盖为[[]]["s"+"o"+"rt"]。注意这里[[]]本身是一个包含空数组的数组,其实对这一步来说,任何一个数组都没有关系(不一定要是嵌套数组),但作者巧妙地把$的首次赋值式放在了数组内部,使代码更为紧凑。最终结果是$ = [[]]["sort"] = [[]].sort = Array.prototype.sort
10. 调用$(),作为整个表达式最终的取值。需要注意,$是全局范围的,是window的一个属性,相当于window.$。而Array.prototype.sort会返回this。对于window.$来说,this就是window。因此,整个第一部分的值,就是window本身!当然,这个过程的正确运作依赖于当前浏览器Array.prototype.sort实现能对this为window的情况容错。
通过第一部分,我们已经获得将任何值转换为字符串的简单方法,并能产生任意的数值,理论上就可以从javascript的取值系统中提取出大部分 字母(不知道是不是全部,需要考证)。并且,我们获取到了window的引用。下面就可以开始上下其手,为所欲为了。木哈哈哈哈哈!
可以看出,上面的第10步是与浏览器的具体实现相关的,因此也存在着某些浏览器下需要对代码作出修改的可能。
现在看第二部分,事实上已经非常明朗了,唯一需要注意的是,现在$是一个函数,因此~$ = ~0 (无法直接转换为数字则作为0处理) = -1。
Javascript代码
[__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)
所以,整条式子相当于:
Javascript代码
window["alert"](1)
转载于:https://blog.51cto.com/fy20000/1742860
XSS中JavaScript加密以及Filter bypass相关推荐
- python判断网页密码加密方式_Python模拟网页中javascript加密与验证的相关处理
在做网络爬虫的过程中你是否一些在这方面做的很好的网站,你向知道他是通过哪些相关的操作做出这么好的网站,以下就是文章的相关内容的具体介绍,希望你浏览完下面的内容会有所收获.Python模拟网页的java ...
- JavaScript中md5加密基础使用方法
关于JavaScript中md5加密使用方法重点 不说别的,先上代码,代码其实不难,更多需要理解 //这边是前端代码 <form class="loginForm" acti ...
- 浅析图片XSS中的哪些技术问题
本文讲的是浅析图片XSS中的哪些技术问题,跨站请求漏洞是web漏洞中最普遍的漏洞,在特定的场景下可以造成很严重的破坏.可以让攻击者在受害者浏览器上执行一个恶意脚本,网络上关于这方面的文章已经很多了. ...
- ajax在Xss中的利用,XSS高级利用
点击阅读 利用 xss 的 javascript 劫持 一个 xss 漏洞示例页面 1 2 3 4 5 6 7 8 9 10 $xss = @$_GET['xss']; if($xss!==null) ...
- javascript加密七种方法
本文一共介绍了七种javascript加密方法: 在做网页时(其实是网页木马呵呵),最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的javascript代码常常被别人轻易的拷贝,实在让自己的心里有点 ...
- 如何通过 Tampermonkey 快速查找 JavaScript 加密入口
在很多情况下,我们可能想要在网页中自动执行某些代码,帮助我们完成一些操作.如自动抢票.自动刷单.自动爬虫等等,这些操作绝大部分都是借助 JavaScript 来实现的.那么问题来了?在浏览器里面怎样才 ...
- 在线Javascript加密混淆工具
在线Javascript加密混淆工具 在线Javascript加密混淆工具 在线Javascript Obfuscator 使 javascript 代码更难阅读以保护它.该工具提供了四种使用工具.你 ...
- mvc中js是如何调用HTML的,MVC中javascript直接调用Model
最近做一个统计页面, Model从后台已经获取了数据集合,想直接在前台展示,而这个展示是需要用js生成图表的. 控制器部分代码: public ActionResult Index() { var m ...
- 常规 JavaScript 加密大全
JavaScript 是一种广泛使用的编程语言,常用于网页开发和客户端脚本编写.然而,由于 JavaScript 是一种开放式语言,使得它的代码可以轻松地被其他人读取和修改,这可能导致安全问题.因此, ...
最新文章
- SAP HUM 带HU的TO单对应的外向交货单VL09取消PGI之后不能对该交货单执行LT0G做WM层面的返架?
- 图解Win7下安装Oracle 12c
- 【DIY】可能是最实用最便宜的 arduino 温湿度计方案,200615整合家用声控温湿度计完整方案...
- 2020\Simulation_2\3.单词重排
- redis3集群部署
- vue使用Echart跟随窗口大小改变而重新绘制时出现读取窗口大小不及时的问题
- Ubuntu系统强制关闭程序
- appium 驱动 对应9.0 系统_第一章:appium
- 狂神设计模式笔记-工厂模式
- Mybatis3.4.x技术内幕(十七):Mybatis之动态Sql设计原本(上)
- spring源码:BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的区别
- python学习日常-----作业(4)
- C/C++ - enum 与 int 相互转换
- python中pd是什么意思_python pd
- 在EntityFramework中使用 nock的方法。
- shader graph落在地面的水滴涟漪效果制作思路
- Web网站模板-小清新企业个人营销宣传响应式网站模板(HTML+CSS+JavaScript)
- vue+echarts+3D地图 制作大屏
- 字节跳动 CEO 张一鸣炮轰 HR , “按这要求我自己都进不来!”
- cs231n课程笔记 摘抄
热门文章
- 二叉树为空意味着二叉树_程序员的进阶课-架构师之路(8)-二叉树
- 华清远见智能家居ppt_怀揣梦想,一路前行——西安华清与西安培华实训集
- mysql 集群备份脚本_MysqlBackup
- 合肥学院计算机对口升学2019,15高校招生4340人!2019安徽省对口升学本科招生计划出炉!...
- 最新最全的用户画像系统详解,还可免费试用哦!
- 以太坊和区块链实战技术分析详解
- jenkins+testlink+python搭建自动化测试环境
- 几款开源的图形化Redis客户端管理软件推荐
- 亲和属性和链路管理组的TE隧道路径控制原理
- 关于省,市,区联动 java 实现方式