命令执行漏洞原理
命令执行漏洞指攻击者可以随意调用执行操作系统命令。
注:与代码执行漏洞区分开,代码执行漏洞是靠执行脚本代码调用操作系统命令,用户提交的参数被服务器当作动态代码执行或当作一个被包含的文件,如:eval(system('rm -rf /tmp/');); eval($_GET['cmd']);
任何脚本语言都可以调用操作系统命令。
php提供部分函数用来执行外部应用程序,system()、shell_exec()、exec()、proc_open()、shell_exec() 和passthru()。
python提供:os.system()、commands.getoutput()、commands.getstatusoutput()、os.popen()等。
php函数代码执行漏洞:preg_replace()、ob_start()、array_map()、assert()、create_function等。
命令执行漏洞防范
- 尽量不要使用系统执行命令;
- 在进入执行命令函数或方法之前,对变量和参数做好过滤,对敏感字符进行转义;
- 在使用动态函数之前,确保使用的函数是指定的函数之一;
- 可以设置黑白名单进行过滤;
- python可以改用subprocess模块,且不能设置shell=True;
- php内置的两个函数可以有效防止命令执行。
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号;escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义;
htmlspecialchars()主要就是转换&、<、>等。
简言之,如果外部可输入,就可能存在安全漏洞,即有输入的地方就有可能存在漏洞。