命令执行漏洞形成的原因
脚本语言(如PHP)优点是简洁、方便,但也伴随着一些问题,如速度慢、无法接触系统底层,如果我们开发的应用(特别是企业级的一些应用)需要一些除去web的特殊功能时,就需要调用一些外部程序。当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system、exec、shell_exec等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击。
命令执行漏洞相关函数
system()函数:system()函数是一个可执行系统命令的函数,可以在命令行终端中执行命令,例如system("ls")执行Linux系统中的"ls"命令。
exec()函数:exec()函数可以用来执行外部程序,与system()函数类似,只不过exec()函数的参数是一个数组。
shell_exec()函数:shell_exec()函数用于执行Linux系统命令,并将结果以字符串形式返回。
passthru()函数:passthru()函数用于执行Linux系统命令,并将结果直接输出到浏览器上。
popen()函数:popen()函数可以打开一个进程,并建立一个管道通讯,用于读取和写入进程的输入输出,可以执行Linux系统命令。
proc_open()函数:proc_open()函数与popen()函数类似,但是更加灵活,可以指定进程的标准输入、输出、错误以及工作目录等参数。
eval()函数:eval()函数用于将一个字符串作为PHP代码执行。
preg_replace()函数:当preg_replace()函数中的正则表达式使用/e修饰符时,将会将替换字符串作为PHP代码执行。
命令执行漏洞修复方案
能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用之。
对于可控点是程序参数的情况,使用escapeshellcmd函数进行过滤。
对于可控点是程序参数的值的情况,使用escapeshellarg函数进行过滤。
参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。