067-Web攻防-Java安全&JNDI项目&审计源码&工具箱等

知识点:

1、Java安全-RCE执行-5大类函数调用

2、Java安全-JNDI注入-RMI&LDAP&高版本

3、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j

Java安全-RCE执行-5大类

白盒审计Java中代码执行的类:

  • Groovy
  • RuntimeExec
  • ProcessImpl
  • ProcessBuilder
  • ScriptEngineManager

检测:(大部分白盒)
黑盒看URL的参数名和参数值
白盒看类函数名和可控变量

Groovy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@GetMapping("/groovy")
public String groovyExec(String cmd, Model model) {
GroovyShell shell = new GroovyShell();
try {
shell.evaluate(cmd); // 🚨 危险点:直接执行用户传入的 cmd
model.addAttribute("results", "执行成功!!!");
} catch (Exception e) {
e.printStackTrace();
model.addAttribute("results", e.toString());
}
return "basevul/rce/groovy";
}

poc:"calc".execute() // 在 Windows 下弹出计算器
  • image-20250628134053269

RuntimeExec

  • Process proc = Runtime.getRuntime().exec(cmd);
    这句代码直接将用户传入的 `cmd` 参数,作为系统命令执行。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    * <img src="/img/image-20250628134416471.png" alt="image-20250628134416471" style="zoom:50%;" />



    ### ProcessImpl



    * 这里通过**反射调用了 JDK 内部的私有类 `ProcessImpl` 的 `start()` 方法**,本质上是调用系统命令。用户传入的 `cmd` 字符串直接作为参数执行,**且没有任何验证或限制**。

    * ```
    Class<?> clazz = Class.forName("java.lang.ProcessImpl");
    Method method = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
    method.setAccessible(true);
    Process e = (Process) method.invoke(null, new String[]{cmd}, null, null, null, false);
    * ![image-20250628134559147](/img/image-20250628134559147.png)

ProcessBuilder

  • 这个 Controller 实现了一个 “根据用户输入的 IP 进行 ping 操作” 的功能。

  • String[] cmdList = {"cmd", "/c", "ping -n 1 " + ip};
    ProcessBuilder pb = new ProcessBuilder(cmdList);