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