Java反序列化数据绕WAF之加大量脏数据

admin 2022年3月17日10:20:45评论203 views字数 1117阅读3分43秒阅读模式

 0x01 

背景



前几周有个同事发给我一个授权的站点,需要拿下webshell权限。发现存在Java反序列化漏洞,但是有WAF,ysoserial生成的序列化数据直接就被拦截了。

Java反序列化数据绕WAF之加大量脏数据

绕WAF的前提自然是先摸清WAF拦截的规则。我先是把序列化头aced0005删掉,发现还是被拦截了,看来WAF没开启无脑的hw模式。


接着将序列化数据当中的class名破坏,发现不再拦截了。说明WAF应该是把gadget的class加入了规则。


考虑到大多数WAF受限于性能影响,当request足够大时,WAF可能为因为性能原因作出让步,超出检查长度的内容,将不会被检查。于是我在序列化头后加了50000x字符,发现WAf不再拦截,证明这个思路可行!


这样虽然绕过了WAF,但新的问题也来了。序列化数据是二进制数据,直接手工在burp里加入垃圾数据破坏了序列化数据的结构,后端代码并没有反序列化成功。接下来继续解决这个问题。



 0x02  

如何给序列化数据加脏数据?



我的思路是需要找到一个class可以序列化,它可以把我们的脏数据对象ysoserial gadget对象一起包裹起来。

Java反序列化数据绕WAF之加大量脏数据

所以我们要找的class,第一需要实现java.io.Serializable接口,第二可以存储任意对象。这么看来集合类型就非常符合我们的需求。


1. ArrayList

2. LinkedList

3. HashMap

4. LinkedHashMap

5. TreeMap

6. ......


伪代码如下:

Java反序列化数据绕WAF之加大量脏数据



 0x03 

改造ysoserial



为了方便日后使用,我们可以改造下ysoserial,让所有gadget都支持添加大量垃圾数据。大致的流程调用是,构造函数传入gadget对象以及垃圾数据长度,然后调用doWrap方法随机创建一个集合类型把随机生成的脏数据和gadget对象存储起来,最终序列化该对象即可拿到bypass WAF的序列化数据。具体实现参考如下代码和注释。

Java反序列化数据绕WAF之加大量脏数据

完整代码请移步ysoserial-for-woodpecker项目(https://github.com/woodpecker-framework/ysoserial-for-woodpecker)


通过如下命令就可以生成带有40000脏数据的CommsonCollects6序列化数据。

Java反序列化数据绕WAF之加大量脏数据

cc6-dnslog.ser复制到burp中发送,完美饶过waf收到dnslog!

Java反序列化数据绕WAF之加大量脏数据



 0x04 

留一个小问题



其实不是所有的集合类都适合用于包裹脏数据和gadget,比如LinkedHashSet,HashSetTreeSet等类就不适合。至于为何,留给大家思考。


本文始发于微信公众号(回忆飘如雪):Java反序列化数据绕WAF之加大量脏数据

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月17日10:20:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java反序列化数据绕WAF之加大量脏数据http://cn-sec.com/archives/499438.html

发表评论

匿名网友 填写信息