RCE/Command Injection
RCE (Remote Code Execution), 远程代码执行漏洞,Command Injection,命令注入漏洞,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许使用者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码.
运行
漏洞代码 - ProcessBuilder方式
@RequestMapping("/ProcessBuilder") public static String cmd(String filepath) { String[] cmdList = {"sh", "-c", "ls -l " + filepath}; StringBuilder sb = new StringBuilder(); ProcessBuilder pb = new ProcessBuilder(cmdList); pb.redirectErrorStream(true); ...
运行
漏洞代码 - Runtime方式
@RequestMapping("/runtime") public static String cmd2(String cmd) { StringBuilder sb = new StringBuilder(); try { Process proc = Runtime.getRuntime().exec(cmd); InputStream fis = proc.getInputStream(); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); ...
运行
漏洞代码 - 远程加载JS
// js: var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("open -a Calculator");} @GetMapping("/js") public void jsEngine(String url) throws Exception { ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); String payload = String.format("load('%s')", url); System.out.println(payload); engine.eval(payload, bindings); }
编码建议
【建议】避免不可信数据拼接操作系统命令 当不可信数据存在时,应尽量避免外部数据拼接到操作系统命令使用 Runtime 和 ProcessBuilder 来执行。优先使用其他同类操作进行代替,比如通过文件系统API进行文件操作而非直接调用操作系统命令。 【必须】避免创建SHELL操作 禁止外部数据直接直接作为操作系统命令执行。 避免通过"cmd"、“bash”、“sh”等命令创建shell后拼接外部数据来执行操作系统命令。 对外部传入数据进行过滤。可通过白名单限制字符类型,仅允许字符、数字、下划线;或过滤转义以下符号:|;&$><`(反引号)!