##介绍
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system、exec、shell_exec、passthru、popen、proc_popen等函数可以执行系统命令。当黑客能控制这些函数的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
##问题代码
<?php echo system("ping -n 2 " . $_GET['ip']); ?>
##运行代码
按照正常情况,用户提交ip地址,只能进行一个简单的ping命令。
但是,若用户使用管道符”|” 提交一些恶意的命令,则会造成不想发生的结果。
由上图可见, 没有执行ping命令,而是执行了ipconfig的命令。
##Windows支持的管道符
“|”:直接执行后面的语句。
“||”:如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。
“&”:如果前面的语句执行为错则直接执行后面的语句,前面的语句可真可假。
“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。
##Linux系统支持的管道符
“;”:执行完前面的语句再执行后面的。
“|”:显示后面语句的执行结果。
“||”:当前面的语句执行出错时,执行后面的语句。
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
“&&”:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。
##漏洞修复建议
- 尽量不要使用命令执行函数。
- 客户端提交的动态变量在进行执行命令函数前要做好过滤和检测。
- 在使用动态函数之前,确保使用的函数是指定的函数之一。
- 对PHP语言来说,不能完全控制的危险函数最好不要使用。