PHP系統命令函式

Json______發表於2017-10-04
<?php
//PHP呼叫cmd引數
//程式碼審計命令注入
////PHP執行系統命令可以使用的函式


$action=$_GET['cmd'];
echo "<pre>";
//查詢ipconfig資訊
/*system()
原型:string system (string command [, int return_var])
system()函式很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個引數是可選的,用來得到命令執行後的狀態碼。
返回結果:
成功返回0,
失敗(命令不存在等原因)   返回   非0值*/
//echo system($action);


//exec只能獲取最後一行資料,shell_execu則可以獲取全部資料。
//echo exec($action);


//passthru() 跟system差不多 輸出結果
//passthru($action);


//也是獲取系統資訊 不會直接輸出
//echo shell_exec($action);


//反引號也可以輸出系統命令
//echo `$action`;




echo popen($action,'r');


//void pcntl_exec(string$path[,array$args [,array$envs]])


//popen  開啟程式檔案指標 r: 只讀。w: 只寫 (開啟並清空已有檔案或建立一個新檔案) 和
//  proc_open()


//主程式檔案,輸出時間(子父程式會sleep的關係,所以可能不會和當前時間相同,差距 2s 以內)
$child_file = "child.php";


$descriptorspec = array(
    0 => array("pipe", "r"),  // 標準輸入,子程式從此管道中讀取資料
    1 => STDOUT,  // 標準輸出,重定向子程式輸入到主程式STDOUT
    2 => array("file", "error-output.txt", "a") // 標準錯誤,寫入到一個檔案
);
$child_process = proc_open("php {$child_file}", $descriptorspec, $pipes);
while(1){
    $time = date("Y-m-d h:i:s");
    fwrite($pipes[0], "main say {$time}\n");
    sleep(2);
}
proc_close($child_process);


//防禦函式
//當使用者提供的資料傳入此函式,使用 escapeshellarg() 或 escapeshellcmd() 來確保使用者欺騙 系統從而執行任意命
escapeshellarg($action);
//可以用到 php 的安全中,會過濾掉 arg 中存在的一些特殊字元。在輸入的引數中如果包含中 文傳遞給 escapeshellarg,會被過濾掉。
escapeshellcmd($action);
//escapeshellcmd()函式會轉義命令中的所有 shell 元字元來完成工作。這些元字元包括: #&;` , |*?~ <>^()[]{}$\\。


//這兩個函式可以配合著shell_exec()的函式使用 用get傳值的時候會把特殊符號給過濾掉 否則執行shell_exec()函式時使用者用get
//傳輸過來的是特殊符號會被執行 這樣可以防止注入

相關文章