system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
eval()
assert()
用法:
1.system
2.passthru
3.exec
string exec ( string command [, array &output [, int &return_var ]] )
command是要执行的命令
output是获得执行命令输出的每一行字符串,return_var用来保存命令执行的状态码(检测成功或失败)
4.shell_exec
5.反引号
shell_exec() 函数实际上仅是反引号 操作符的变体,当禁用shell_exec时,
也不可执行
在php中称之为执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回
6.popen
7.proc_open()
8.pcntl_exec
void pcntl_exec ( string $path [, array $args [, array $envs ]] )
path是可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本
args是一个要传递给程序的参数的字符串数组。
pcntl是linux下的一个扩展,需要额外安装,可以支持 php 的多线程操作。
pcntl_exec函数的作用是在当前进程空间执行指定程序,版本要求:PHP > 4.2.0
9.eval会把字符串当php代码执行
10.assert
assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动
assert_options
'ASSERT_ACTIVE=1' // Assert函数的开关
'ASSERT_WARNING =1' // 当表达式为false时,是否要输出警告性的错误提示,issue a PHP warning for each failed assertion
'ASSERT_BAIL= 0' // 是否要中止运行;terminate execution on failed assertions
'ASSERT_QUIET_EVAL= 0' // 是否关闭错误提示,在执行表达式时;disable error_reporting during assertion expression evaluation
'ASSERT_CALLBACK= (NULL)' // 是否启动回调函数 user function to call on failed assertions
# PHP5
bool assert ( mixed $assertion [, string $description ] )
# PHP7
bool assert ( mixed $assertion [, Throwable $exception ] )
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval()类似, 不过eval($assertion)只是执行符合php编码规范的$code_str。
11.preg_replace函数 /e参数存在代码执行
preg_replace 使用了 /e 模式,导致可以代码执行,而且该函数的第一个和第三个参数都是我们可以控制的。我们都知道, preg_replace 函数在匹配到符号正则的字符串时,会将替换字符串(也就是上图 preg_replace 函数的第二个参数)当做代码来执行
参考链接
preg_replace代码执行
1、减少命令执行函数的使用,并在php配置文件php.ini中disable_functions条目中禁用
eg: disable_functions = system, shell_exec, passthru, exec, popen, proc_open, eval, pcntl_exec //这里断言没设置,因为开发调试等可能会用到
2、在进入命令执行的函数或方法之前,对参数进行过滤。
参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。
addslashes()函数会对参数中的单引号[’],双引号["],反斜杠[],空字符[NULL]等进行转义。