網(wǎng)站上的個(gè)人詞條怎么做的百度高級(jí)搜索首頁(yè)
命令執(zhí)行漏洞簡(jiǎn)介
命令執(zhí)行漏洞產(chǎn)生原因
應(yīng)用未對(duì)用戶輸入做嚴(yán)格得檢查過(guò)濾,導(dǎo)致用戶輸入得參數(shù)被當(dāng)成命令來(lái)執(zhí)行
命令執(zhí)行漏洞的危害
1.繼承Web服務(wù)程序的權(quán)限去執(zhí)行系統(tǒng)命會(huì)或讀寫文件
2.反彈shell,獲得目標(biāo)服務(wù)器的權(quán)限
3.進(jìn)一步內(nèi)網(wǎng)滲透
遠(yuǎn)程代碼執(zhí)行
因?yàn)闃I(yè)務(wù)需求,在PHP中有時(shí)需要調(diào)用一些執(zhí)行命令的函數(shù)·如:eval0、assert0、preg_replace0、create_function0等,如果存在一個(gè)使用這些函數(shù)且未對(duì)可被用戶控制的參數(shù)進(jìn)行檢查過(guò)濾的頁(yè)面,那么這個(gè)頁(yè)面就可能存在遠(yuǎn)程代碼執(zhí)行漏洞。
遠(yuǎn)程代碼執(zhí)行-eval函數(shù)
eval ( string $code )
把字符串 code 作為PHP代碼執(zhí)行
注意:
eval0 函數(shù)傳入的參數(shù)必須為PHP代碼,即要以分號(hào)結(jié)尾;
函數(shù)eval0語(yǔ)言結(jié)構(gòu)是非常危險(xiǎn)的,因?yàn)樗试S執(zhí)行任意 PHP 代碼·不要允許傳入任何由用戶提供的、未經(jīng)
完整驗(yàn)證過(guò)的數(shù)據(jù)。
遠(yuǎn)程代碼執(zhí)行-assert函數(shù)
assert ( mixed $assertion [ string $description ])
檢查一個(gè)斷言是否為 FALSE,如果 assertion 是字符串,它將會(huì)被 assert0 當(dāng)做 PHP 代碼來(lái)執(zhí)行
注意:
assert0函數(shù)是直接講傳入的參數(shù)當(dāng)成PHP代碼執(zhí)行,不需要以分號(hào)結(jié)尾
遠(yuǎn)程代碼執(zhí)行-preg_replace函數(shù)
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject l int KaTeX parse error: Expected 'EOF', got '&' at position 19: …it = -1 l, int &?count ]] )
執(zhí)行一個(gè)正則表達(dá)式的搜索和替換,搜索subiect中匹配pattern的部分,以replacement進(jìn)行替換
preg_replace(‘正則規(guī)則’,‘替換字符’, ‘目標(biāo)字符’)
PCRE修飾符 e: preg_replace0在進(jìn)行了對(duì)替換字符串的后向引用替換之后,將替換后的字符串作為php代碼
評(píng)估執(zhí)行(eval函數(shù)方式),并使用執(zhí)行結(jié)果作為實(shí)際參與替換的字符串。
遠(yuǎn)程代碼執(zhí)行-array_map函數(shù)
array_map ( callable $callback , array $array1 [, array $…])
array_map0: 返回?cái)?shù)組,是為 array1每個(gè)元素應(yīng)用 callback函數(shù)之后的數(shù)組·callback 函數(shù)形參的數(shù)量和傳給 array_map0 數(shù)組數(shù)量,兩者必須一樣·為數(shù)組的每個(gè)元素應(yīng)用回調(diào)函數(shù)
<?php
$func=$_GET['func];
$cmd=$_POSTIcmd];
$array[0]=$cmd;
$new_array=array_map($func,$array):
echo Snew_array;
?>
遠(yuǎn)程代碼執(zhí)行-create_function函數(shù)
create_function ( string $args , string $code )
從傳遞的參數(shù)創(chuàng)建一個(gè)匿名函數(shù),并為其返回唯一的名稱。
通常這些參數(shù)將作為單引號(hào)分隔的字符串傳遞·使用單引號(hào)的原因是為了保護(hù)變量名不被解析,否則,如果
使用雙引號(hào),就需要轉(zhuǎn)義變量名,例如 $avar
<?php
$func = create function(”,$_POST['cmd']):
$func();
?>
遠(yuǎn)程代碼執(zhí)行-call_user_func函數(shù)
call user_func ( callable $callback [, mixed $parameter [, mixed $… ]])
第一個(gè)參數(shù) calback 是被調(diào)用的回調(diào)函數(shù),其余參數(shù)是回調(diào)函數(shù)的參數(shù)·把第一個(gè)參數(shù)作為回調(diào)函數(shù)調(diào)
<?php
cal user _func("assert",$_POST['cmd])
//傳入的參數(shù)作為assert函數(shù)的參數(shù)
//cmd=system(whoami)
?>
遠(yuǎn)程代碼執(zhí)行-array_filter函數(shù)
array_filter ( array $array [ callable $callback [, int $flag = 0 ]1)
用回調(diào)函數(shù)過(guò)濾數(shù)組中的單元依次將 array 數(shù)組中的每個(gè)值傳遞到 callback 函數(shù)
<?php
$cmd=$_POSTI'cmd];
$array1=array($cmd);
$func =$ GETI'func'l;
array_filter($array1,$func),
//用回調(diào)函數(shù)過(guò)濾數(shù)組中的元素 : array_filter(數(shù)組,函數(shù))
//?func=system //cmd=whoami
?>
遠(yuǎn)程代碼執(zhí)行-雙引號(hào)
<?php // echo "phpinfo()"; echo "{$(phpinfo()}}"; ?>在php中,雙引號(hào)里面如果包含有變量,php解釋器會(huì)將其替換為變量解釋后的結(jié)果單引號(hào)中的變量不會(huì)被處理,雙引號(hào)中的函數(shù)不會(huì)被執(zhí)行和替換
遠(yuǎn)程系統(tǒng)命令執(zhí)行
一般出現(xiàn)這種漏洞,是因?yàn)閼?yīng)用系統(tǒng)從設(shè)計(jì)上需要給用戶提供指定的遠(yuǎn)程命令操作的接口,比如我們常見的路由器、防火墻、入侵檢測(cè)等設(shè)備的web管理界面上,一般會(huì)給用戶提供一個(gè)ping操作的web界面,用戶從web界面輸入目標(biāo)IP,提交后后臺(tái)會(huì)對(duì)該IP地址進(jìn)行一次ping測(cè)試,并返回測(cè)試結(jié)果·而,如果,設(shè)計(jì)者在完成該功能時(shí),沒有做嚴(yán)格的安全控制,則可能會(huì)導(dǎo)致攻擊者通過(guò)該接口提交惡意命令,讓后臺(tái)進(jìn)行執(zhí)行,從而獲得后臺(tái)服務(wù)器權(quán)限。
利用PHP 的系統(tǒng)命令執(zhí)行函數(shù)來(lái)調(diào)用系統(tǒng)命令并執(zhí)行,這類函數(shù)有 svstem()、exec()、shell exec()、passthru()、penti_exec()、popen()、proc_pen()等,此外還有反引號(hào)命令執(zhí)行,這種方式實(shí)際上是調(diào)用shell_exec(函數(shù)來(lái)執(zhí)行
遠(yuǎn)程系統(tǒng)命令執(zhí)行
system(): 執(zhí)行外部程序,并且顯示輸出
exec(): 執(zhí)行一個(gè)外部程序
shell_exec(): 通過(guò) shell 環(huán)境執(zhí)行命令,并且將完整的輸出以字符串的方式返回
passthru(): 執(zhí)行unix乳統(tǒng)命令并且顯示原始輸出
pcntl_exec(): 在當(dāng)前進(jìn)程空間執(zhí)行指定程序
popen(): 打開進(jìn)程文件指針
proc_open(): 執(zhí)行一個(gè)命令,并且打開用來(lái)輸入/輸出的文件指針。
遠(yuǎn)程系統(tǒng)命令執(zhí)行-exec函數(shù)
exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 17: …ommand l array &?output [, int &$return var ]])
執(zhí)行一個(gè)外部程序,exec( 執(zhí)行 command 參數(shù)所指定的命令。
exec執(zhí)行系統(tǒng)外部命令時(shí)不會(huì)輸出結(jié)果,而是返回結(jié)果的最后一行·如果想得到結(jié)果,可以使用第二個(gè)參數(shù),讓其輸出到指定的數(shù)組·此數(shù)組一個(gè)記錄代表輸出的一行。
遠(yuǎn)程系統(tǒng)命令執(zhí)行-system函數(shù)
system ( string $command [, int &return_var ] )
函數(shù)執(zhí)行 command 參數(shù)所指定的命令,并且輸出執(zhí)行結(jié)果
system在執(zhí)行系統(tǒng)外部命令時(shí),直接將結(jié)果輸出到瀏覽器,如果執(zhí)行命令成功則派回system和exec的區(qū)別在于,true,否則返回false。
遠(yuǎn)程系統(tǒng)命令執(zhí)行-passthru函數(shù)
passthru ( string KaTeX parse error: Expected 'EOF', got '&' at position 16: command l, int &?return var ])
執(zhí)行外部程序并且顯示原始輸出,同exec0函數(shù)類似,passthru0 函數(shù) 也是用來(lái)執(zhí)行外部命令(command)的
當(dāng)所執(zhí)行的 Unix 命令輸出二進(jìn)制數(shù)據(jù) ,并且需要直接傳送到瀏覽器的時(shí)候,需要用此函數(shù)來(lái)替代 exec0 或system0 函數(shù)。
passthru與system的區(qū)別: passthru直接將結(jié)果輸出到瀏覽器,不返回任何值,且其可以輸出二進(jìn)制,比如圖像數(shù)據(jù)。第二個(gè)參數(shù)可選,是狀態(tài)碼。
遠(yuǎn)程系統(tǒng)命令執(zhí)行-system函數(shù)
system ( string KaTeX parse error: Expected 'EOF', got '&' at position 15: command [ int &?return_var ])
函數(shù)執(zhí)行 command 參數(shù)所指定的命令·并且輸出執(zhí)行結(jié)果·
system和exec的區(qū)別在于·system在執(zhí)行系統(tǒng)外部命令時(shí)·直接將結(jié)果輸出到瀏覽器·如果執(zhí)行命令成功則返回 true·否則返回false
遠(yuǎn)程系統(tǒng)命令執(zhí)行
命令執(zhí)行常用特殊字符
cmd1cmd2: 無(wú)論cmd1是否執(zhí)行成功,cmd2將被執(zhí)行
cmd1;cmd2: 無(wú)論cmd1是否執(zhí)行成功,cmd2將被執(zhí)行
cmd1llcmd2: 僅在cmd1執(zhí)行失敗時(shí)才執(zhí)行cmd2
cmd1&&cmd2:僅在cmd1執(zhí)行成功后時(shí)才執(zhí)行
cmd2$(cmd) : echo $(whoami) 或者 $(touch test.sh; echo 'ls' > test.sh)
'cmd': 用于執(zhí)行特定命令,如 whoami
>(cmd) : <(ls)
<(cmd) : >(ls)