php执行系统命令函数及防御

一、php命令执行函数

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]等进行转义。

你可能感兴趣的:(信息安全,php,安全,web安全,信息安全)