PHP執行系統命令函式例項講解
命令注入
命令注入(Command Injection
),對一些函式的引數沒有做過濾或過濾不嚴導致的,可以執行系統或者應用指令(CMD
命令或者 bash
命令)的一種注入攻擊手段。
常見的執行系統命令的函式有
- system()
- passthru()
- exec()
- shell_exec()
- popen()
- proc_opNWgePken()
- pcntl_exec()
system()函式
string system ( string $command [,int &$return_var ] )
$command
為執行的命令,&return_var
system()函式執行有回顯,將執行結果輸出到頁面上
<?php system("whoami");?>
passthru()函式
void passthru ( string $command [,int &$return_var ] )
和system函式類似,$command
為執行的命令,&return_var
可選,用來存放命令執行後的狀態碼
執行有回顯,將執行結果輸出到頁面上
<?php passthru("whoami");?>
exec()函式
string exec ( string $command [,array &$output [,int &$return_var ]] )
$command是要執行的命令
$output
是獲得執行命令輸出的每一行字串,$return_var
用來儲存命令執行的狀態碼(檢測成功或失敗)
exec()函式執行無回顯,預設返回最後一行結果
<?php echo exec("whoami");?>
<?php $test = "ipconfig"; exec($test,$array); print_r($array); ?>
shell_exec()函式
string shell_exec( string &command)
&command
是要執行的命令
s程式設計客棧hell_exec()函式預設無回顯,通過 echo 可將執行結果輸出到頁面NWgePk
<?php echo shell_exec("whoami");?>
反引號 `
shell_exec() 函式實際上僅是反撇號 (`) 操作符的變體,當禁用shell_exec時,` 也不可執行
在php中稱之為執行運算子,PHP 將嘗試將反引號中的內容作為 shell 命令來執行,並將其輸出資訊返回
<?php echo `whoami`;?>
popen()函式
resource popen ( string $command,string $mode )
函式需要兩個引數,一個是執行的命令command
,另外一個是指標檔案的連線模式mode
,有r
和w
代表讀和寫。
函式不會直接返回執行結果,而是返回一個檔案指標,但是命令已經執行。
popen()
開啟一個指向程序的管道,該程序由派生給定的command
命令執行而產生。
返回一個和fopen()
所返回的相同的檔案指標,只不過它是單向的(只能用於讀或寫)並且必須用pclose()
來關閉。
此指標可以用於fgets()
,fgetss()
和 fwrite()
<?php popen( 'whoami >> c:/1.txt','r' ); ?>
<?php $test = "ls /tmp/test"; $fp = popen($test,"r"); //popen打一個程序通道 while (!feof($fp)) { //從通道里面取得東西 $out = fgets($fp, 4096); echo $out; //打印出來 }pclose($fp);?>
proc_open()函式
resource proc_open (string $cmd,array $descriptorspec,array &$pipes [,string $cwd [,array $env [,array $other_options ]]])
與Popen函式類似,但是可以提供雙向管道
<?php $test = "ip程式設計客棧config"; $array = array(array("pipe","r"), //標準輸入程式設計客棧160; array("pipe","w"), //標準輸出內容 array("pipe","w") //標準輸出錯誤 ); $fp = proc_open($test,$array,$pipes); //開啟一個程序通道 echo stream_get_contents($pipes[1]); //為什麼是$pipes[1],因為1是輸出內容 proc_close($fp); ?>
pcntl_exec()函式
void pcntl_exec ( string $path [,array $args [,array $envs ]] )
path是可執行二進位制檔案路徑或一個在檔案第一行指定了 一個可執行檔案路徑標頭的指令碼
args是一個要傳遞給程式的引數的字串陣列。
pcntl
是linux
下的一個擴充套件,需要額外安裝,可以支援 php 的多執行緒操作。
pcntl_exec
函式的作用是在當前程序空間執行指定程式,版本要求:PHP > 4.2.0
<?php pcntl_exec( "/bin/bash",array("whoami")); ?>
對這些危險函式,可以在php.ini中禁用,進行安全加固
到此這篇關於PHP執行系統命令函式例項講解的文章就介紹到這了,更多相關PHP執行系統命令函式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!