任意命令执行漏洞
1、简介
- 原理
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如php中的system、exec、shell_exec等,如果用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常的命令中,造成命令执行漏洞。 - 利用条件
- 应用调用执行系统命令的函数
- 将用户输入作为系统命令的参数拼接到了命令行中
常见的命令拼接符:
&& :执行两个命令,若前面出错,后面不会执行
& : 执行两个命令,若前面出错,后面还是会执行
|| : 执行正确的那个命令,前面的失败,后面也会执行,前面成功,后面不会执行
| : 只会执行后面的命令
- 没有对用户输入进行过滤或过滤不严
2、漏洞分类
- 代码层过滤不严
使用户输入命令执行
防御:
- 尽量少用执行系统命令的函数,并在disable_functions中禁用
- 对用户输入的参数,使用escapeshellcmd(去除字符串中的特殊符号)与escapeshellarg(给字符串增加一个单引号并能引用或者转码任何已经存在的单引号)
- 接受的参数变量尽量用引号包裹,并在拼接前调用addslashes进行转义
- 系统的漏洞造成命令注入
bash破壳漏洞 - 调用第三方组件中存在代码执行漏洞
wordpress:imagemagick漏洞
java : struts2漏洞
3、安全防御
- 尝试对所有输入提交可能执行命令的构造语句进行严格的检查或者控制外部输入,系统命令执行函数禁止外部传参
- 验证数据类型、格式、长度、范围和内容
- 客户端与服务端都需要做验证与过滤
- 对输出的数据也要做安全检查