当前位置:网站首页>浅谈jsfuck编码
浅谈jsfuck编码
2022-08-10 22:31:00 【ek1ng】
参考: https://zh.wikipedia.org/wiki/JSFuckhttps://blog.csdn.net/qq_36539075/category_7591719.htmlhttps://chinese.freecodecamp.org/news/javascript-implicit-type-conversion/
前言
第一次看到jsfuck编码还是在hgame 2022的week1中一个在线小游戏的ctf题目,只是在注释中发现了一段有很多[]的内容,搜索后发现是jsfuck编码,在控制台中执行就得到了flag,其实也不是很懂jsfuck的原理,只是单纯觉得比较神奇,今天又在一篇安全相关的文章中看到了jsfuck cheat sheet于是就想深入了解一下jsfuck。
什么是jsfuck
先贴一段wiki对jsfuck的解释,JSFuck是一种深奥的 JavaScript编程风格。以这种风格写成的代码中仅使用 [、]、(、)、! 和 + 六种字符。此编程风格的名字派生自仅使用较少符号写代码的Brainfuck语言。与其他深奥的编程语言不同,以JSFuck风格写出的代码不需要另外的编译器或解释器来执行,无论浏览器或JavaScript引擎中的原生 JavaScript 解释器皆可直接运行。鉴于 JavaScript 是弱类型语言,编写者可以用数量有限的字符重写 JavaScript 中的所有功能,且可以用这种方式执行任何类型的表达式。
为什么可以只用6种字符编码js
显然一段js代码只用6种字符去写,毫无疑问可以绕过很多关键词的过滤,但是在使用之前会有一个疑问就是为什么可以这样编码一段js代码。
其实这是由于js的隐式类型转换导致的,对于逻辑表达式[]==![],js会返回true
先来说说对于运算符==的运算规则
NaN和其他任何类型比较永远返回false(包括和他自己)NaN == NaN // falseBoolean和其他任何类型比较,Boolean 首先被转换为 Number 类型。true == '2' // false true -> 1String和Number比较,先将String转换为Number类型。123 == '123' // true, '123' -> 123null == undefined比较结果是true,除此之外,null、undefined和其他任何结果的比较值都为false。原始类型和引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型。
️
ToPrimitive规则,是引用类型向原始类型转变的规则,它遵循先valueOf后toString的模式期望得到一个原始类型。如果还是没法得到一个原始类型,就会抛出TypeError。
我们再来看看[]==![],取非运算优先级最高,[]是空数组,对一个空数组取非得到false,那么[]==![] 会变成 []==false,然后因为Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型,false -> 0,变成[]==0,然后再因为原始类型和引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型,[].valueOf().toString()的值为'',String和``Number比较会把String转换成Number,也就是‘’ -> 0,最终变成0==0`得到true。
看明白上面的例子后会发现,js的隐式类型转换使得我们可以组合上述的6个符号来替换一些我们希望得到的字符,符号等等内容,所以这也是为什么js代码可以用这样简单的6个符号用来表达,当然这么说其实也还是很难有信服力,我们接下来解析一下如何使用jsfuck编码alert()。
数字的话比较简单有1有0我们一直加想要多少就多少,然后我们肯定需要26个字符对吧,那字符的话其实是用截取的方式,alert的话我们可以用true和false截取就可以实现
'a' == 'false'[1] == (false + '')[1] == (![]+[])[+!+[]]
'l' == 'false'[2] == (false + '')[2] == (![]+[])[!+[]+!+[]]
'e' == 'true'[0] == (true + '')[3] == (!![]+[])[!+[]+!+[]+!+[]]
'r' == 'true'[0] == (true + '')[1] == (!![]+[])[+!+[]]
't' == 'true'[0] == (true + '')[0] == (!![]+[])[+[]]
'alert' == (![]+[])[+!+[]] + (![]+[])[!+[]+!+[]] + (!![]+[])[!+[]+!+[]+!+[]] + (!![]+[])[+!+[]] + (!![]+[])[+[]]但是26个字母其他的又该怎么实现呢,我们这里看一下jsfuck的官方仓库中是如何获取指定字符的,那更多的字符就需要去看jsfuck的源码啦
'a': '(false+"")[1]',
'b': '([]["entries"]()+"")[2]',
'c': '([]["flat"]+"")[3]',
'd': '(undefined+"")[2]',
'e': '(true+"")[3]',
'f': '(false+"")[0]',
'g': '(false+[0]+String)[20]',
'h': '(+(101))["to"+String["name"]](21)[1]',
'i': '([false]+undefined)[10]',
'j': '([]["entries"]()+"")[3]',
'k': '(+(20))["to"+String["name"]](21)',
'l': '(false+"")[2]',
'm': '(Number+"")[11]',
'n': '(undefined+"")[1]',
'o': '(true+[]["flat"])[10]',
'p': '(+(211))["to"+String["name"]](31)[1]',
'q': '("")["fontcolor"]([0]+false+")[20]',
'r': '(true+"")[1]',
's': '(false+"")[3]',
't': '(true+"")[0]',
'u': '(undefined+"")[0]',
'v': '(+(31))["to"+String["name"]](32)',
'w': '(+(32))["to"+String["name"]](33)',
'x': '(+(101))["to"+String["name"]](34)[1]',
'y': '(NaN+[Infinity])[10]',
'z': '(+(35))["to"+String["name"]](36)',
利用jsfuck绕过过滤
因为jsfuck只用6个字符编码,这样的话很多时候可以绕过一些对恶意代码的检测,看到渗透测试中大多数对jsfuck的运用就是绕XSS的过滤,比如这篇文章,文章中xss的payload结合jsfuck编码绕过对alert等一些危险函数的利用。ctf中我也没怎么看到过jsfuck绕过过滤的题目,只看到过一段js代码里面就直接是flag的题,因此也没有机会仔细研究一下,也许明年hgame可以出个有意思的题考考新生hhh。
边栏推荐
- 《DevOps围炉夜话》- Pilot - CNCF开源DevOps项目DevStream简介 - feat. PMC成员胡涛
- Power system power flow calculation (Newton-Raphson method, Gauss-Seidel method, fast decoupling method) (Matlab code implementation)
- ASCII, Unicode and UTF-8
- 新一代网络安全防护体系的五个关键特征
- H3C S5130 IRF做堆叠
- Redis - 利用lua脚本控制密码错误次数超限,锁定账号
- 二叉树 | 层序遍历 | leecode刷题笔记
- DC-8靶场下载及渗透实战详细过程(DC靶场系列)
- file IO-buffer
- 常用代码扩展点设计方式
猜你喜欢

自学软件测试不知道该如何学起,【软件测试技能图谱|自学测试路线图】

PyQt5 窗口自适应大小

金山云CEO王育林离职:正值冲刺港股之际 雷军曾送金砖

2021 IDEA creates web projects
![68: Chapter 6: Develop article services: 1: Content sorting; article table introduction; creating [article] article services;](/img/95/7f21ecda19030c2faecbe373893d66.png)
68: Chapter 6: Develop article services: 1: Content sorting; article table introduction; creating [article] article services;

阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展

实例050:随机数

How to be a Righteous Hacker?What should you study?

电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)(Matlab代码实现)

二叉树 | 代码随想录学习笔记
随机推荐
文件IO-缓冲区
Lambda
【640. 求解方程】
ASCII, Unicode and UTF-8
带着昇腾去旅行:一日看尽金陵城里的AI胜景
RecyclerView滑动监听
Translating scientific and technological papers, how to translate from Russian to Chinese
3598. Binary tree traversal (Huazhong University of Science and Technology exam questions)
This visual tool artifact is more intuitive and easy to use!love so much
【软件测试】2022年最火的十大测试工具,你掌握了几个
DC-8靶场下载及渗透实战详细过程(DC靶场系列)
自学软件测试不知道该如何学起,【软件测试技能图谱|自学测试路线图】
美味石井饭菜
一、ICESat-2数据查询,下载,与处理
How does the Weiluntong touch screen display the current value of abnormal data while alarming?
2022年8月10日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 ASP.NET Core 创建 Web UI(没看懂需要再看一遍)
常用代码扩展点设计方式
2022年8月的10篇论文推荐
Addition of linked lists (2)
Glide监听Activity生命周期源码分析