[Java代码审计]—命令执行失效问题

news2024/12/24 2:49:55

前言

关于Java的命令执行其实一直都没有单独学习过,正好昨天师傅问了一个问题:命令执行时字符串和字符串数组用哪个更好一些。当时被问得有点懵难道不都一样么?其实不然,借此重新了解下RCE以及失效问题。

单例模式

常规命令执行代码:

Runtime.getRuntime().exec("calc");

在看过Runtime类后,一直有个问题:exec()就在Runtime类中,为什么不直接Runtime.exec()进行调用,而是中间加上getRuntime()?

在这里插入图片描述

这个就是由单例模式决定的:

单例模式(Singleton)的目的是为了保证在一个进程中,某个类有且仅有一个实例。

因为这个类只有一个实例,因此,自然不能让调用方使用new Runtime()来创建实例了。所以,单例的构造方法必须是private,这样就防止了调用方自己创建实例,但是在类的内部,是可以用一个静态字段来引用唯一创建的实例的,这个实例也就是getRuntime()

private static Runtime currentRuntime = new Runtime();

public static Runtime getRuntime() {
    return currentRuntime;
}

所以我们在获取Runtime实例时,就要通过getRuntime()方法获取。

流程分析

exec()有以下几个重载方法,根据不同形参进行调用

public Process exec(String command)-----在单独的进程中执行指定的字符串命令。
public Process exec(String [] cmdArray)---在单独的进程中执行指定命令和变量
public Process exec(String command, String [] envp)----在指定环境的独立进程中执行指定命令和变量
public Process exec(String [] cmdArray, String [] envp)----在指定环境的独立进程中执行指定的命令和变量
public Process exec(String command,String[] envp,File dir)----在有指定环境和工作目录的独立进程中执行指定的字符串命令
public Process exec(String[] cmdarray,String[] envp,File dir)----在指定环境和工作目录的独立进程中执行指定的命令和变量

先看下大致流程,跟进exec(),会调用StringTokenizer()把传入的conmmand字符串按中的 \t \n \r \f 分割成数组cmdarray。(为什么数组更好原因就在这里,等会在看)

在这里插入图片描述

public StringTokenizer(String str) {
    this(str, " \t\n\r\f", false);
}

分割后,由于cmdarray变成了数组,便会进入其他有参exec()方法,其中实例化了ProcessBuilder,并调用了start()方法,这里的cmdarray的值就是我们传入的calc,其中environment、directory都是对值进行初始化,主要还是start()这里

在这里插入图片描述

跟进后又调用了,process实现类的start(),执行了calc(其中调用过程牵扯到linux的UNIXProcess,而windows中没有所以就不跟进了)

在这里插入图片描述

ProcessBuilder

根据上边的流程可以发现:真正执行代码的地方其实是:

new ProcessBuilder(cmdarray)
            .environment(envp)
            .directory(dir)
            .start();

所以除了常规的Runtime.getRuntime().exec()可以换成

new ProcessBuilder("calc").start();

反射调用:

Class<ProcessBuilder> pbc = ProcessBuilder.class;
Constructor<ProcessBuilder> cons = pbc.getDeclaredConstructor(String[].class);
Method method = pbc.getDeclaredMethod("start");
Object o = cons.newInstance(new String[][]{{"calc"}});
method.invoke(o);

失效问题

最后看下失效问题,这里失效主要是使用String类型导致,这里把calc命令换成echo Sentiment && echo 6666

正常情况下&&会当做连接符,执行下一个命令

在这里插入图片描述

但是在java如果用String类型命令,执行后的结果变成了Sentiment!&&echo 123,也就是&&也当作字符串进行输出了

在这里插入图片描述

原因也就在于StringTokenizer方法的处理,将后边的&echo其解析成了一段字符

在这里插入图片描述

所以这里就需要用字符串数组类型,来解决这个问题,此时将命令换为:

String[] cmd = {"cmd","/c","echo Sentiment!&&echo 123"};
#liinux
String[] cmd = {"/bin/bash","-c","echo Sentiment!&&echo 123"};

执行后得到了我们想要的结果:

在这里插入图片描述

再看下代码,由于直接用了数组,因此在执行了exec()时,直接执行到了形参为数组的exec()方法中,直接执行ProcessBuilder.start()方法中,成功执行命令

在这里插入图片描述

因此在遇到命令中有\t\n\r\f这类转义字符时,需要用字符串数组类型。其实除了这种方式外还可以通过对命令进行编码的形式解决,不过只针对于linux

在这里插入图片描述

参考

Java Runtime.getRuntime().exec由表及里 - 先知社区 (aliyun.com)

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

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

相关文章

基于STM32 电机库(5.4.4)的单电阻采样调试总结

目录 硬件调整 软件调整 下载运行 参数优化 总结 硬件调整 实验用的开发板和电机如下&#xff0c;在调单一电阻之前已经在三电阻的环境下把启动运行的参数已经调好了&#xff0c;这里不多说。调好后需要把硬件改成单电阻采样。 如下原理图&#xff1a; 只需要把R75,76两…

每个人都应该知道的5个NLP代码库

在本文中&#xff0c;将详细介绍目前常用的Python NLP库。内容译自网络。这些软件包可处理多种NLP任务&#xff0c;例如词性&#xff08;POS&#xff09;标注&#xff0c;依存分析&#xff0c;文档分类&#xff0c;主题建模等等。NLP库的基本目标是简化文本预处理。目前有许多工…

【6】linux命令每日分享——rm删除目录和文件

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…

loki 日志管理的安装部署使用

loki介绍 Loki是 Grafana Labs 团队最新的开源项目&#xff0c;是一个水平可扩展&#xff0c;高可用性&#xff0c;多租户的日志聚合系统。它的设计非常经济高效且易于操作&#xff0c;因为它不会为日志内容编制索引&#xff0c;而是为每个日志流编制一组标签。 不对日志进行…

python学习之手把手教你将图片变成黑白或彩色字符画(骚操作)

文章目录前言一、字符画的实现原理二、黑白字符画实现代码三、彩色字符画生成代码实现&#xff1a;总结前言 字符画这个话题&#xff0c;似乎早在贴吧时代就已经被玩烂了。在百度图片随便一搜索&#xff0c;就能够看到非常多。然后在这个时代&#xff0c;会编程的人越来越多&a…

Transformer输出张量的值全部相同?!

【bug】Transformer输出张量的值全部相同&#xff1f;&#xff01;现象原因解决现象 输入经过TransformerEncoderLayer之后&#xff0c;基本所有输出都相同了。 核心代码如下&#xff0c; from torch.nn import TransformerEncoderLayer self.trans TransformerEncoderLayer…

日记本-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-3】 日记本 【任务介绍】 1.任务描述 编写一个日记本功能的程序&#xff0c;使用字节流经日记的具体信息记录在本地的txt文件中。当用户输入日记的特定内容后&#xff0c;会将输入的内容保存至本地的txt文件中。需要输入的内容包括“姓名”&#xff0c;“天气”、“…

OpenFeign详解

OpenFeign是什么&#xff1f; OpenFeign&#xff1a; OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解&#xff0c;如RequesMapping等等。OpenFeign的FeignClient可以解析SpringMVC的RequestMapping注解下的接口&#xff0c;并通过动态代理的方式产生实现类&am…

基于YOLOv5的细胞检测实战

数据及代码链接见文末 1.任务与数据集介绍 如下图所示,我们有一个医学细胞数据集,需要从数据集中检测出三种不同的细胞。标签中已经标注了细胞的类别和位置。 我们也可以看到,三种细胞有着不同的形态和颜色,同时数据集的标签也存在没有标注到的细胞 2.数据与标签配置方…

【打卡-Coggle竞赛学习2023年2月】图节点嵌入

文章目录## Part4 图节点嵌入### 背景介绍### 环境配置### 学习打卡- 任务1&#xff1a;图属性与图构造- 任务2&#xff1a;图查询与遍历- 任务3&#xff1a;节点中心性与应用- 任务4&#xff1a;图节点嵌入算法&#xff1a;- 任务5&#xff1a;图节点嵌入算法&#xff1a;- 任…

PowerAutomation获取邮件附件并删除这个邮件方法

这个文章是怎么来的呢&#xff1f;现在不是低代码开发平台启蒙阶段嘛&#xff1f;笔者也有幸在工作中进行了尝试&#xff0c;目前也已经在实际工作中结合Python进行了使用&#xff0c;当然&#xff0c;是可以提高IT的工作效率的。需求是这样的&#xff0c;想从公司的EBS平台报表…

3.5 实战:Spring Boot 实现系统多环境配置

第3章 Spring Boot 的系统配置 3.1 Spring Boot 系统配置文件 3.2 Spring Boot 自定义配置项 3.3 Spring Boot 其他配置 3.4 Spring Boot 日志配置 3.5 实战&#xff1a;Spring Boot 实现系统多环境配置 3.5 实战&#xff1a;Spring Boot 实现系统多环境配置 在实际项目开发的…

python的所有知识点(含讲解),不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类&#xff0c;注&#xff1a;不是那个对象&#xff01;&#xff01;&#xff01;&#xff01;&…

2023年安徽省职业院校技能大赛“网络空间安全” 比赛任务书

2023年安徽省职业院校技能大赛“网络空间安全” 比赛任务书 一、竞赛时间 总计:360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 Nginx安全策略 A-3 日志监控 A-4 中间件服务加固 A-5 本地安全策略 A-6 防火墙策…

基本程序设计技术

一.统计&#xff08;计数&#xff09;问题&#xff1a;方法&#xff1a;计数变量c的初值为0&#xff0c;每输入一个数据&#xff0c;进行必要判断后&#xff0c;若输入的数据满足统计条件&#xff0c;则计数变量c自加1&#xff0c;这样当对所有输入进行判断后&#xff0c;计数变…

多线程案例(一)【单例模式+阻塞队列】

一、单例模式 单例模式属于最容易被问到的一种设计模式。 啥是设计模式&#xff1f; 类似于棋谱&#xff0c;按摩模式写代码&#xff0c;可以更加规范。 单例模式的含义&#xff1a; 单例&#xff1a;单个实例对象 某个类有且只有一个对象。 这一点在很多场景上都需要. 比如…

如何轻松录制 CS 游戏玩法?4 种免费录制 CS 游戏视频的方法

CS:GO&#xff0c;又名反恐精英&#xff1a;全球攻势&#xff0c;是一款多人第一人称射击游戏&#xff0c;由 Valve 和 Hidden Path Entertainment 于 2012 年设计推出。作为反恐精英系列的第四代&#xff0c;它广受欢迎与全球游戏玩家。随着近年来电子竞技的兴起&#xff0c;用…

冒泡排序(朴素+优化)

思想 先来看一张动图 上面这张图就是冒泡排序的代码可视化 很显然我们可以发现&#xff0c;冒泡排序的基本思想就是从前往后比对&#xff0c;一直将找到的最大值交换到序列的末尾感觉冒泡排序这个名字还是很形象的 朴素做法 不难看出&#xff0c;将最大值交换到末尾的操作一…

数据结构与算法之打家劫舍(二)动态规划思想

前言&#xff1a;上一个题目所求的数组是线性的&#xff0c;首尾并不影响结果。这道题目的数组的首尾相连接&#xff0c;构成一个环。再来求这一道题目&#xff0c;难度进一步上身。我们直接进入题目&#xff1a;一.题目二.在上一道题目的基础上进行剖析对于一个数组&#xff0…

​科伦博泰冲刺港交所上市:持续大额亏损,科伦药业为其控股股东​

近日&#xff0c;四川科伦博泰生物医药股份有限公司&#xff08;下称“科伦博泰”&#xff09;在港交所递交招股书&#xff0c;准备在港交所主板上市&#xff0c;高盛和中信证券为其联合保荐机构。据贝多财经了解&#xff0c;科伦博泰为A股上市公司科伦药业&#xff08;SZ:0024…