代碼執行函數
場景:eval()、assert()、preg_replace()、動態函數執行
call_user_func()、call_user_func_array()函數的功能是調用函數,多用在框架裡面動態調用函數
array_map()函數的作用是調用函數並且處第一個參數外其他參數為數組,通常會寫死第一個參數,即調用的函數
命令執行函數
system()、exec()、shell_exec()、passthru()、pcntl_exec、popen()、popen_open()以及反引號(`)
解決方案:
escapeshellcmd()和escapeshellarg()
escapeshellcmd():過濾整條命令
string escapeshellcmd(string $command)
參數string為要過濾的命令,返回過濾後的string類型的命令,過濾的字符串
為'&',';','`','|','*','?','~','<','>','^','(',')','[',']','{','}','$','\','\x0A','\xFF','%',' ' ',' " '
//僅僅在不成對時被轉義
<?php echo(escapeshellcmd($_GET['cmd']));?>執行結果:whoami^(
escapeshellarg():保證傳入命令執行函數裡面的參數確實是一字符串參數形式存在,不能被注入
將參數限制在一對雙括號裡,確保參數為一個字符串,會把雙引號替換為空格
<?php echo 'ls'.escapeshellarg('a"');?>執行結果:ls a
eval()和assert()函數:
<?php $a = 'aaa'; $b = 'bbb'; eval('$a = $b'); var_dump($a);?>執行結果:string(3)"bbb"
preg_replace()函數:對字符串進行正則處理
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit = -1[,int &$count]])
搜索$subject中匹配$pattern的部分,以$replacement進行替換,而當$pattern處即第一個參數存在修飾符/e時,$replacement的值會被當成PHP代碼執行
<?php preg_replace("/\[(.*)\]/e",'\\1',$_GET['str']); //從$_GET['str']變量裡搜索括號[]中間的內容作為第一組的結果,preg_replace()函數的第二個參數為'\\1'代表這裡用第一組結果填充,這裡可以直接執行代碼?>執行結果:PHP Version 5.3.28
call_user_func()函數:調用函數並且第二個參數作為要調用的函數的參數
mixed call_user_func(callable $callback[,mixed $parmeter[,mixed $..]])
<?php $b= "phpinfo()"; call_user_func($_GET['a'],$b);?>執行結果:PHP Version 5.3.28
動態函數執行:PHP特性-PHP的函數可以直接由字符串拼接
<?php $_GET['a']($_GET['b']);?>執行結果:PHP Version 5.3.28
命令執行函數{system()、exec()、shell_exec()、passthru()、pcntl_exec、popen()、popen_open()}以及反引號(`)
system()、exex()、shell_exec()、passthru()以及反引號(`)可以直接傳入命令並且函數會返回執行結果
system():函數會直接回顯結果列印輸出,不需要echo()也可以
<?php system('whoami');?>執行結果:desktop-htl6dmj\hackerone
pcntl()函數:是PHP的多進程處理擴展
void pcntl_exec(string $path[,array $args[,array $envs]])
$path為可執行程序路徑,如果是Perl或Bash腳本,則需要在文件頭加上#!/ bin/bash來標識可執行程序路徑,$args表示傳遞給$path程序的參數,$envs則是執行這個程序的環境變量
popen()、popen_open()函數:不會直接返回執行結果,而是返回一個文件指針,但命令已經執行
popen()函數需要兩個參數,一個是執行的命令;另一個是指針文件的連接模式,有r、w代表讀和寫
<?php popen('whoami >>D:/1.txt','r');?>執行結果:在D盤根目錄看到1.txt文件,內容為WebServer用戶名
反引號(`)命令執行:實際上反引號(`)執行命令是調用的shell_exec()函數
執行結果:desktop-htl6dmj\hackerone
在php.ini文件中把PHP安全模式打開,重啟WebServer重新加載PHP配置文件,再執行訪問代碼
執行結果:Warning:shell_exec()[function.shell_exec]:Cannot execute using backquotes in Safe Mode in D:\www\test.php on line 2
這個提示說明反引號(`)執行命令的方式是使用的shell_exec()函數