PHP代码审计————8、 PHP代码审计之命令注入

在PHP中,可以实现执行外部程序或函数的命令执行函数主要包括以下5个函数

System函数

可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:

string system(string command, int &return_var)

参数说明:

command是要执行的命令,return_var存放执行命令的执行后的状态值。

按照PHP程序员的想法,命令执行函数的主要作用是可以通过命令执行函数与Web应用程序进行交互,通过Web应用程序执行外部程序或系统命令,如Web应用程序员想通过system函数获取IP地址、用户等信息,那么他可以通过构造如下代码实现。

http://localhost/test.php?cmd=ipconfig

exec函数

可以用来执行一个外部的应用程序,函数原型如下: 

string exec ( string $command [, array &$output [, int &$return_var ]] ) 

其中command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。

passthru函数

可以用来执行一个系统命令并显示原始的输出,当系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下: 
void passthru (string command, int &return_var), 

其中command是要执行的命令,return_var存放执行命令后的状态值。可以通过构造如下PHP代码进行测试。

shell_exec函数

执行shell命令并返回输出的字符串,函数原型如下: 

string shell_exec (string command)

command是要执行的命令。

“反引号

与shell_exec功能相同,执行shell命令并返回输出的字符串。

 Popen函数

popen() 函数打开进程文件指针,即打开一个指向进程的管道,该进程由派生指定的 command 命令执行而产生。返回一个文件指针,只不过它是单向的(只能用于读或写)并且必须用pclose()来关闭。若出错,则返回 false。

函数原型如下:

popen(string $command,string $mode)

其中,command为规定要执行的命令,mode规定连接模式,r为只读,w为只写。

 proc_open函数

用于执行一个命令,并且打开用来输入/输出的文件指针。与popen()函数类似,但是 proc_open()提供了更加强大的控制程序执行的能力。

函数原型如下:

resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env])

pcntl_exec函数

pcntl_exec函数在当前进程空间执行指定程序。当发生错误时返回 FALSE,没有错误时没有返回。

函数原型如下:

void pcntl_exec ( string $path [, array $args [, array $envs ]] )

其中,path必须是可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径标头的脚本;args是一个要传递给程序的参数的字符串数组;envs是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。

preg_replace()函数

代码执行注入。函数原型为

preg_replace(pattern,replacement,subject,limit,count)

其中pattern为正则表达式(字符串或者字符串),replacement是用于替换的字符串或字符串数组,replacement可以包含\n形式或者$n形式的逆向引用,首选使用后者。每个此种引用将被替换为与第n个被捕获的括号内的子模式所匹配的文本。n可以从0到99,其中\0或者$0指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从1开始)以取得子模式的数;subject为要进行搜索和替换的字符串或者字符串数组;limit,可选,是每个模式在subject上进行替换的最大次数。默认是-1(无限);count,可选,完成的替换次数。

防御函数

当用户输入的数据作为函数参数时,可以使用escapeshellarg()或escapeshellcmd()函数来过滤用户输入的数据,防止用户欺骗系统执行任意命令。

escapeshellcmd()函数

除去字符串中的特殊符号,会转义命令中的所有shell元字符来完成工作。这些元字符包括:

# & ;``,| * ? ~ < > ^ ( ) [ ] { } $ \\

函数原型如下:

string escapeshellcmd(string command)

本函数除去了字符串中的特殊符号,可以防止使用者恶意破解服务器系统。

escapeshellarg函数

该函数把字符串转码为可以在shell命令里使用的参数。escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。可以用到php的安全中,会过滤掉arg中存在的一些特殊字符。在输入的参数中如果包含中文传递给escapeshellarg,会被过滤掉。

函数原型如下:

string escapeshellarg ( string $arg )

其中arg为需要被转码的参数。

你可能感兴趣的:(【信息安全】,【代码审计】,———代码审计系列)