当WAF遇见Kryo反序列化:一场绕过与反绕过的攻防拉锯战
哎,兄弟们,今天咱们不聊虚的,就唠唠我最近在实战里踩的那个大坑——WAF和Kryo反序列化这对冤家,说实话,我一开始真没把这事儿当回事儿,总觉得WAF不就是个看门的嘛,规则匹配一下,拦个SQL注入、XSS就得了,直到那次内网渗透,我拿着Kryo的payload往目标上一打,好家伙,WAF直接给我甩了个403,那叫一个干脆利落,我人直接傻了。
你瞅瞅,这不就是典型的“魔法打不过机制”吗?Kryo这玩意儿,它不像Java原生的Serializable那么出名,但是它的序列化速度是真的快,很多高并发的分布式系统都在用它做RPC的传输格式,可谁能想到,Kryo反序列化漏洞一旦被利用,那可是能直接打到RCE的,威胁程度直接拉满,但问题就出在,WAF的规则库大多是针对老牌的序列化框架(比如ysoserial那些经典gadget)去做的特征匹配,Kryo这东西,它的序列化格式是二进制的,而且那堆类名和ID的映射关系,WAF的引擎压根儿就“看”不懂,或者说,普通规则根本逮不着它。
然而啊,现在的WAF也不是吃素的,你看啊,有些智能WAF会做深度报文解析,它可能不看你具体的payload长得像不像shiro,而是盯着你请求里的头部长度、内容熵值、流量行为这些点,我那次就是没做好长度伪装,payload里塞了一长串的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl,这玩意儿特征太明显了,WAF一看这堆字符串,好嘛,老熟人了,直接拦下。
所以啊,绕过这破玩意儿,光靠硬怼是不行的,得讲究“降维打击”,我后来是怎么搞定的?嘿嘿,分了三步走。
第一步:先“混淆”Kryo的类名映射。 Kryo支持注册类ID,把那些敏感的类名注册成整数,然后我把payload里的TemplatesImpl替换成12345这种无意义的ID,让WAF的特征库彻底失效,你别说,这一招对传统的正则型WAF那是真好使,直接过,就跟隐形了一样。
第二步:分块传输加压缩,主打一个“瞒天过海”。 我先把序列化后的字节流用gzip压缩一遍,然后利用HTTP的Transfer-Encoding: chunked,把数据切成好几百个小块,WAF要检测就得重组大包,那性能开销简直想哭,大部分情况下,它扫描个开头看到不是明文特征,直接“放行”了,哎呀,这感觉就像偷着乐,爽!
第三步,也是最关键的一步——利用WAF的“信任盲区”,我发现那个目标站点的WAF,对multipart/form-data的解析特别粗心,只校验了文件名和content-type,内容区往往是“重点观察区”也是“漏网重灾区”,我直接把Kryo的payload塞到某个图片的EXIF信息里,通过上传接口打过去,WAF光顾着检查图片马了,压根没在意那个隐藏在图像像素里的二进制的Kryo流,结果呢?反弹Shell的那一刹那,我瞬间觉得,这世界清净了。
不过啊,兄弟我得提个醒,绕过WAF虽然有快感,但咱们不能三天两头就想着怎么去搞别人网站,学习和研究这个,是为了更好地理解攻击链,从而做好防守,现在的WAF也在进化,什么AI语义分析、行为建模,都是用来自动识别这些花活儿的。
最后说句掏心窝子的话,玩网络安全,思路一定要活,工具是死的,人是活的,你不但要懂Kryo的序列化机制,还得去琢磨WAF的引擎解析逻辑,站在开发者的视角看问题,这才能做到“见招拆招”,不然你就只会在那儿拿着网上下载的现成工具一波乱打,被人封IP了还不知道咋回事呢!
好了,今天关于Kryo绕过WAF的这些经验和教训,就先分享到这儿,如果你也是搞攻防的,或者对这些奇技淫巧挺感兴趣,欢迎来交流,咱们一起涨姿势!

学习网络安全可以加QQ:3383-2495-88(备注:博客来的)

