0x00/ fastjson
fastjson
是一个非常流行的库,可以将数据在JSON和Java Object之间互相转换,但是在2017年官方主动爆出了fastjson的反序列化漏洞以及升级公告
[https://github.com/alibaba/fastjson/wiki/security_update_20170315] ,这次我们就学习一下这个漏洞。
最终的payload
会放到我的GitHub [https://github.com/lightless233/Java-Unserialization-Study] 上。
这次使用的fastjson
是1.2.23版本:
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.23</version></dependency>
class User { private int age; public String username; private String secret; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSecret() { return secret; }}
String myJSON = "{\"@type\":\"me.lightless.fastjsonvuln.User\",\"age\":99,\"username\":\"lightless\",\"secret\":\"2333\"}";JSONObject u3 = JSON.parseObject(myJSON);System.out.println("u3 => " + u3.get("secret"));
如果需要还原出private
成员的话,还需要加上Feature.SupportNonPublicField
:
User u3 = (User) JSON.parseObject(myJSON, User.class, Feature.SupportNonPublicField);
0x01/ 跟踪分析
根据官方公告中的WAF检测方法来看,问题很有可能是因为反序列化了任意类型的class从而导致的RCE。
@RestControllerpublic class IndexController { @RequestMapping(value = "/fastjson", method = RequestMethod.GET) public String fastjson() { return "Hello World!"; } @RequestMapping(value = "/fastjson", method = RequestMethod.POST) public JSONObject testVuln(@RequestBody String data) { JSONObject obj = JSON.parseObject(data, Feature.SupportNonPublicField); JSONObject ret = new JSONObject(); ret.put("code", 1001); ret.put("data", "Hello " + obj.get("name")); return ret; }}
然后就会执行我们在_bytecodes
构造的恶意字节码,造成命令执行。
0x02/ 一些疑问
根据上面的流程,我们应该已经可以写出PoC了,这里就不占用篇幅展示了,直接放到了我的GitHub上。
0x03/ 修复措施
在fastjson的官方补丁中,将loadClass(typeName, config.getDefaultClassLoader())
替换为了config.checkAutoType(typeName)
,并且扩充了黑名单列表,将传入的类名与黑名单一一比较,如果发现了相同开头的类就停止反序列化。
// 新增的黑名单
bsh
com.mchange
com.sun.
java.lang.Thread
java.net.Socket
java.rmi
javax.xml
org.apache.bcel
org.apache.commons.beanutils
org.apache.commons.collections.Transformer
org.apache.commons.collections.functors
org.apache.commons.collections4.comparators
org.apache.commons.fileupload
org.apache.myfaces.context.servlet
org.apache.tomcat
org.apache.wicket.util
org.codehaus.groovy.runtime
org.hibernate
org.jboss
org.mozilla.javascript
org.python.core
org.springframework
技术分享 | Apache-Commons-Collections反序列化漏洞分析