当面试官对你发起灵魂之问:如何绕过针对fastjson漏洞payload的WAF规则。如果此时你双手一摊,一脸懵逼那么可以肯定的是,你面试肯定挂了,如果你只知道老掉牙的URL编码、双写、大小写等方式,那么面试官可能会疑惑你可能只是个脚本小子。所以,如何才能获得面试官的青睐呢?那你就需要跟着我从fastjson发序列化过程中发现一些可以用来绕过WAF的点了。
除了上面提到的传统的绕过WAF的姿势,fastjson系列漏洞的不断发展本身也是对原有补丁的绕过过程。在fastjson的历史版本漏洞中出现的绕过方式包括但不限于:
-
使用JVM类描述符,也就是类名前加L,类名后加;
-
使用JVM数组描述符,也就是类名前加[
-
json内置,也就是json嵌套
-
双重L;,也就是LLxxx;;
-
以及最新版的漏洞通过expectClass来实现补丁绕过。
那么除了这些针对代码补丁的绕过方案,还有没有一些比较通用的染过方式呢?当然是有的,包括以下这些内容,如:
-
使用多个逗号
-
使用空白字符
-
使用单引号替换JSON标准的双引号
-
使用十六进制编码
-
使用unicode编码
-
使用_
-
使用is
-
使用单行注释与多行注释
那么接下来我们就来看看这些方法为什么能够用来绕WAF。
在FastJSON反序列化过程中进行词法解析时会调用com.alibaba.fastjson.parser.JSONLexer#skipWhitespace
方法删除部分空白字符:
并且如果碰到"/"会调用skipComment
方法跳过注释,注意单行注释要在末尾加n
在调用com.alibaba.fastjson.parser.JSONLexerBase#scanSymbol(com.alibaba.fastjson.parser.SymbolTable, char)
扫描符号的时候会对x与u开头的十六进制与unicode进行解析
如果feature配置中设置了AllowSingleQuotes
则可以解析单引号,而该配置默认为True
你甚至可以在设置字段名的时候不使用双引号,如果AllowUnQuotedFieldNames
为True
的话
在解析JavaBean时,如果字段类型为布尔类型时,你甚至可以在其字段名前添加is
,如果该字段本身不是以is
开头的话。
当然下划线与短划线_也可以尝试。
如果有数字的话,你还可以添加进制标识来干扰WAF
一些内部标准类,他们有更简单的写法,且是有缓存的
特殊类,可以使用JVM的类与数组描述符。
原文始发于微信公众号(一个安全研究员):面试官:如何绕过针对FastJSON漏洞Payload的WAF规则
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论