漏洞概述 CWE-88: 命令中的参数注入(Argument Injection) 该漏洞发生在产品构建一个字符串命令以由另一个控制组件执行时,但没有正确分隔预期的参数、选项或开关。攻击者可以通过注入包含参数分隔符的未预期输入来改变命令的行为,导致执行额外的参数,从而可能引发安全相关后果。 影响范围 执行未经授权代码或命令 执行后逻辑改变 读取应用程序数据 修改应用程序数据 修复方案 1. 策略:参数化 - 尽可能避免构建包含命令及其参数的单个字符串。使用支持指定独立参数的函数或框架,例如在PHP中使用 来转义单个参数。 2. 策略:输入验证 - 假设所有输入都是恶意的,使用“接受已知好”的输入验证策略,即使用严格符合规范的输入列表,拒绝不符合规范的输入。 - 不要仅依赖恶意或畸形输入的检测,因为这可能会错过一些不良输入。 3. 策略:类型转换 - 直接将输入类型转换为预期的数据类型,例如使用转换函数将字符串转换为数字。 4. 策略:解码和规范化 - 在验证之前,将输入解码并规范化到应用程序的当前内部表示。确保在解码后再次验证输入。 5. 策略:字符编码 - 在组件间交换数据时,确保双方使用相同的字符编码。 6. 策略:验证 - 当应用程序从多个来源组合数据时,在组合后执行验证。 7. 测试 - 使用动态工具和技术与产品交互,使用大量不同输入进行测试,如模糊测试、鲁棒性测试和故障注入。 POC代码示例 相关漏洞示例 CVE-2016-10033: PHPMailer中的漏洞,允许通过额外的“-o”参数执行任意命令。 CVE-2002-0985: PHP邮件函数中的漏洞,允许绕过安全限制并修改命令行参数。 CVE-2003-0907: Windows帮助和支持中心中的漏洞,允许通过URL中的引号执行任意代码。 检测方法和功能区域 自动化静态分析:通过静态应用安全测试(SAST)检测潜在漏洞。 功能区域:程序调用、系统进程。 相关标准和规范 CERT C Secure Coding Standard (2008) OWASP Top Ten 2013 Category A1 - Injection SEI CERT C Coding Standard - Guidelines 10: Environment (ENV) 参考链接 Steven Christey: "Argument injection issues" Mark Dowd, John McDonald, and Justin Schuh: "The Art of Software Security Assessment" Dawid Golunski: "PHPMailer < 5.2.18 Remote Code Execution" Dawid Golunski: "Pwnin' PHP mail() function"