
本文记录了一次针对某教育站点的Fastjson漏洞利用过程。漏洞环境的特点是网络限制严格,对不出网的场景利用具有一定的参考价值。
第一步:判断出网情况
首要任务是判断目标服务器的网络连通性。通常我们会测试DNS、HTTP、LDAP等协议。
该站点的测试结论为:DNS协议不出网,但LDAP协议可以出网。这个信息为后续利用链的选择奠定了基础。

第二步:确定Fastjson版本
通过构造特定的Payload触发报错,可以直接获取Fastjson的版本信息。
{ "@type": "java.lang.AutoCloseable"}
发送上述Payload后,从报错信息中可以看到 fastjson-1.2.47。

在Fastjson 1.2.47及之前的版本中,存在通杀利用方法,即便未开启AutoTypeSupport也可利用。其本质是利用缓存机制将恶意类加载到mappings中,从而绕过限制。
第三步:分析依赖与环境
确定了版本,接下来的思路是选择合适的利用链。常规思路是:若目标出网,则使用JdbcRowSetImpl发起JNDI注入攻击;若不出网,则尝试BCEL类加载器。
由于LDAP出网但DNS不出网,属于“半出网”状态。笔者优先尝试更直接的BCEL利用方式。
在尝试之前,需要确认目标环境是否存在必要的依赖。有三种常见的方法来判断依赖:DNS查询、延时等待和报错回显。在本场景中,报错回显最为直接。
如果相关依赖存在,会返回 can not cast to char 的错误。

如果依赖不存在,则会正常响应或返回其他错误。

通过构造不同类路径的Payload,我们可以探测关键依赖并间接判断JDK版本范围:
org.apache.tomcat.dbcp.dbcp.BasicDataSource //tomcat-dbcp-7-BCEL
org.apache.tomcat.dbcp.dbcp2.BasicDataSource //tomcat-dbcp-8及以后-BCEL
com.sun.org.apache.bcel.internal.util.ClassLoader



探测结果表明,环境中存在BCEL相关的类,但缺少触发链所需的完整依赖。
第四步:调整利用链,尝试本地反序列化
既然BCEL利用受阻,而目标LDAP协议出网,可以考虑结合本地反序列化链进行攻击。本地反序列化是Java安全测试中的一项关键技术。
考虑到JDK版本可能低于8u251,笔者首先尝试经典的CommonsCollections1(CCK1)链。该链在低版本JDK中利用成功率高。
首先需要确认环境中是否存在Transformer等关键转化类,以及TemplatesImpl这个最终的Sink点。


探测发现依赖齐全。于是使用工具生成CCK1链的Payload进行攻击。

但攻击失败,服务器返回了一大串详细的栈错误信息。


分析错误信息,推断可能是目标环境中的Commons Collections库版本高于3.2.1,导致CCK1链失效。
第五步:切换利用链,最终获取权限
CCK1链失败后,迅速切换到备用的CommonsBeanutils1(CB链)。使用工具生成CB1.9链的Payload,并集成JMG以打出一个Tomcat内存回显。

执行Payload后,成功获取了命令执行权限。

后续尝试打入持久化内存马未果,遂直接通过命令一键上线C2工具,完成对整个服务器的控制。

总结与反思
本次渗透测试的核心在于对Fastjson漏洞原理的深入理解和对目标环境的精准判断。从出网检测、版本识别,到依赖分析、利用链选择和切换,每一步都建立在扎实的知识储备之上。对于安全研究者而言,面对一个目标不应仅限于实现攻击,更重要的是过程中的分析、记录与反思,这将帮助我们在面对同类型目标时更加得心应手。