介绍
OS命令注入(又称Shell注入)是一种注入漏洞,攻击者注入的命令在主机操作系统上作为系统命令执行。
OS命令注入攻击是由于输入验证不足引起的,尽管只有当web应用程序代码在执行过程中集成了操作系统调用并且将用户的输入作为系统调用的参数或命令本身时,才有可能发生这种攻击。
不要与代码注入混淆,OS命令注入扩展了web应用程序的预设功能来执行系统命令,而代码注入攻击是指攻击者添加恶意代码由web应用程序执行。在某些情况下,代码注入可以通过使用该语言提供的功能升级为OS命令注入。
OS命令注入漏洞与语言无关,可能出现在任何带有调用系统shell命令的语言中。不幸的是许多编程语言、应用程序开发框架和数据库平台都存在这一功能,初衷是为了提供操作系统命令执行环境作为应用程序设计人员实现新功能特性技术支撑。
命令注入是大量注入攻击中的一种,所有这些攻击都非常普遍,能够达到极高的破坏程度。事实上,自2013年以来,OWASP已经将注入攻击列为最危险的web应用程序安全风险之一。
影响及危害
恶意攻击者可以利用OS命令注入漏洞在宿主基础设施中获得立足点,然后通过横向移动尝试入侵组织的内网中其他服务器和系统,执行未经授权的命令,并完全破坏应用程序和底层系统的机密性、完整性和可用性。
没有什么比臭名昭著的Equifax漏洞更能说明成功执行操作系统命令注入所带来的灾难性后果了。攻击者能够通过命令注入攻击渗透Equifax的系统,这是一个非常流行的web框架中的高危漏洞。
场景
OS命令注入的漏洞在Windows和Unix系统上都可以触发,它们通过任何开发语言(PHP,ASP,JS等)来调用系统的shell命令。
经典的场景是一个存在漏洞的程序调用system()函数,通过接收未过滤、未安全检测过的输入来执行命令。下面的示例演示如何通过执行zip命令来压缩用户通过filename变量提供的文件,从而创建压缩文件。
system("zip archive.zip " + filename)
攻击者可以利用特殊的shell字符在原始命令的末尾附加任意命令,从而利用这段有漏洞的代码执行。
下面的例子说明详细介绍了此类攻击; 在上面代码段中的filename参数里,我们输入x;rm important_file 这样的化system shell命令最终将拼接成如下结果:
zip archive.zip x; rm important_file
由于";"符号用于分割多个命令,在本例中,攻击者将终止第一个命令,然后注入第二个恶意命令并执行,试图从磁盘中删除一个重要文件(important_file 按实际情况改成文件路径)。
防护措施
开发人员必须使用结构化的机制来实现数据和代码之间的分离。
重要的是,如果开发人员能够严格避免从应用层调用操作系统命令,那么就可以完全比秒OS命令注入漏洞。当然也有一些其他的手段来缓解此类漏洞被利用。
如果不可避免地调用命令shell,尽量不要使用使用单个字符串调用的函数;相反,应该选择需要含有参数列表的函数。这些函数通常会做一些适当的参数引用和筛选。