描述
当应用程序将用户可控数据纳入由shell命令解释器处理的命令时,就会出现操作系统命令注入漏洞。如果用户数据没有经过严格验证,攻击者可以使用shell元字符来修改被执行的命令,并进一步注入由服务器执行的任意的命令。
操作系统命令注入漏洞通常非常严重,可能导致托管应用程序的服务器或应用程序本身的数据和功能被破坏。也有可能利用服务器作为攻击其他系统的平台。确切的讲,利用方法取决于执行命令的安全上下文,以及该环境对服务器敏感资源的权限。
补救措施
如果可能的话,应用程序应避免将用户可控数据纳入操作系统的命令。几乎在每一种情况下,都有更安全的替代方法来执行服务器级别的任务,这些方法不能被操纵来执行比预期更多的其他命令。
如果认为将用户提供的数据纳入操作系统命令是不可避免的,应采用以下两层防御措施来防止攻击。
用户数据应该被严格验证。理想情况下,应该使用特定接受值的白名单。否则,应该只接受短的字母数字字符串。包含任何其他数据的输入,包括任何可能shell元字符或空格,都应该被拒绝。
应用程序应该使用命令API,通过其名称和命令行参数启动一个特定的进程,而不是将命令字符串传递给支持命令链和重定向的shell解释器。例如,Java API Runtime.exec和ASP.NET API Process Start不支持shell元字符。即使在攻击者规避输入验证防御的情况下,这种防御也能减轻攻击的影响。
参考资料
●网络安全学院。操作系统命令注入(burp官方portswiggerd的学苑)
漏洞分类
●CWE-77: 命令中使用的特殊元素中和不当('命令注入')
●CWE-78:操作系统命令中使用的特殊元素的不当中和('操作系统命令注入")
●CWE-116:输出的不正确编码或转义
●CAPEC-248: 命令注入
严重程度
高
类型索引
0x00100100