Java代码审计:远程代码执行

admin 2022年1月13日18:54:23评论162 views字数 1886阅读6分17秒阅读模式
1 RCE漏洞
RCE (Remote Code Execution), 远程代码执行漏洞,这里包含两种类型漏洞:
  • 命令注入(Command Injection),在某种开发需求中,需要引入对系统本地命令的支持来完成特定功能,当未对输入做过滤时,则会产生命令注入
  • 代码注入(Code Injection),在正常的java程序中注入一段java代码并执行,即用户输入的数据当作java代码进行执行。 
Java代码审计:远程代码执行

2 漏洞代码
(1)调用ProcessBuilder执行ls命令,接收参数filepath,拼接命令语句,此处攻击者通过拼接; & |等连接符可以执行执行自己的命令
@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); ...
(2)使用Runtime.getRuntime().exec()执行命令
@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);     ...
Java代码审计:远程代码执行
(3)通过加载远程js文件来执行代码,如果加载了恶意js则会造成任意命令执行。
@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);}
Java代码审计:远程代码执行
(4)不安全的使用Groovy调用命令
import groovy.lang.GroovyShell;@GetMapping("/groovy")public void groovy(String cmd) {    GroovyShell shell = new GroovyShell();    shell.evaluate(cmd);}

3 安全代码
自定义黑名单,这里过滤了常见的管道符,可自行添加
public static boolean checkOs(String content) {    String black = "|,&,&&,;,||";    String[] black_list = black.split(",");    for (String s : black_list) {        if (content.contains(s)) {            return true;        }    }    return false;}
Java代码审计:远程代码执行

4 编码建议
避免不可信数据拼接操作系统命令
  • 当不可信数据存在时,应尽量避免外部数据拼接到操作系统命令使用 Runtime 和 ProcessBuilder 来执行。优先使用其他同类操作进行代替,比如通过文件系统API进行文件操作而非直接调用操作系统命令。
避免创建SHELL操作
  • 禁止外部数据直接直接作为操作系统命令执行。
  • 避免通过"cmd"、“bash”、“sh”等命令创建shell后拼接外部数据来执行操作系统命令。
  • 对外部传入数据进行过滤。可通过白名单限制字符类型,仅允许字符、数字、下划线;或过滤转义以下符号:|;&$><`(反引号)!

5 代码链接
https://github.com/j3ers3/Hello-Java-Sec

6 往期文章
Java代码审计:SQL注入
Java代码审计:XSS与SSRF

原文始发于微信公众号(Reset安全):Java代码审计:远程代码执行

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月13日18:54:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java代码审计:远程代码执行http://cn-sec.com/archives/735606.html

发表评论

匿名网友 填写信息