命令注入漏洞是特别危险的,因为它们允许未经授权的执行操作系统命令, 它们的存在,因为应用程序无法正确地验证和消毒,使用时调用shell的功能,如的参数。 攻击者与控制这些参数可以欺骗应用程序执行任何系统命令自己的选择。为了正确测试命令注入漏洞,应遵循以下步骤:
§ 第1步: 了解攻击场景
§ 第2步: 分析原因及对策
§ 第3步: 开始试验和探索
§ 第4步: 微调测试案例

第1步: 了解攻击场景
命令注入漏洞测试的第一步是要了解他们的攻击的情况下, 有两种常见的类型,命令注入漏洞:
§ 直接命令注入。
§ 间接命令注入。
方案1: 直接命令注入
最基本的形式包括直接提供的额外的易受攻击的应用程序的命令。命令注入 攻击者首先发现应用程序调用系统命令作为参数的命令,直接将用户提供的数据, 那么攻击者提供的恶意命令的预期参数。 应用程序执行原来的命令,然后恶意。
详细步骤如下:
1. 攻击者发现,该应用程序使用客户端输入来执行命令。
2. 攻击者提供的恶意客户端输入命令的一部分。
3. 攻击者观察应用程序执行其他命令。
 
方案2: 间接命令注入
这种情况下,命令注入,直接地或间接地提供额外的易受攻击的应用程序可以通过文件或环境变量的命令。 首先,攻击者减去的应用程序调用系统命令,从外部数据源,如文件或环境变量 然后,攻击者修改的内容的外部源中加入恶意的命令。 然后,攻击者等待或强制执行恶意命令,与原来的应用程序。
详细步骤如下:
1. 攻击者发现,该应用程序使用的数据存储在外部执行命令。
2. 攻击者编辑外部来源包括恶意命令。
3. 攻击者等待,直到应用程序执行原来的命令(或攻击者试图使该应用程序的状态将在其中提供的命令执行)。
4. 攻击者验证的应用程序的执行注入的命令。
 
第2步: 分析原因及对策
在此步骤中,你就会明白命令注入漏洞以及共同防御的原因。 这将帮助您寻找代码中的错误,并认识到安全的编码实践。
 
命令注入的原因
命令注入漏洞是一个单一的原因:可怜的输入验证。 建立任何应用程序,命令字符串中使用未消毒的数据容易受到此错误。下面的代码片段演示了命令注入漏洞。

下面的例子在C + +(由OWASP [I])运行在一个符合POSIX标准的类Unix环境,如 使用提供的命令行输入到系统并运行的cat命令:

命令注入对策
应用程序防御命令注入漏洞,通过做正确的输入验证和消毒。 开发人员必须看所有情况下,应用程序调用一个壳状系统功能,如执行或系统,避免执行,除非参数被正确地验证和消毒。 有两种可能的方法来验证这些参数:使用黑色列表或使用白名单。
黑名单检查,然后才允许执行恶意模式。 命令注入的情况下,一个黑色的命令列表可能包含分隔符,如分号(;)垂直划线(|),双破折号(| |),双放大器(&&)危险的命令,如RM,CP,猫,LS,在净参数,netstat,DEL,复制等, 但是,一个主要的缺点阻碍了这种对策是有效的,除非黑名单绝对是所有涉及危险的可能性,攻击者可以找到以外的黑名单的变化,来进行攻击。  
白名单与安全执行模式匹配, 如果有问题的数据不匹配任何安全模式,这是不允许的。 这危险的构造,因为任何新的(恶意)结构的新变化,不符合安全的解决了这个问题一种是系统自动封锁。 一个共同的方式来实现白名单是相匹配的输入与安全的命令格式的正则表达式表示。 然而,复杂的正则表达式可以写和解释。 开发人员必须确保他们了解如何编写和解释正则表达式之前实施这一防御。
第3步: 开始试验和探索
在此步骤中,您将开始测试您的应用程序的基本命令注入字符串,并观察应用程序如何反应。

第4步: 微调测试案例数据
彻底地测试您的应用程序对命令注入漏洞,你必须覆盖所有可能的入口点和命令注入是可能的情况下的。
尝试不同的切入点和场景
继续探索不同的应用程序的入口点。 测试的情况下,数据的格式会有所不同的入口点。

§ 重要的是,你考虑不同的编码方式和数据格式额外的命令注入的入口点,如:输入字段,URL参数,POST数据,Web服务方法,用户界面元素,环境变量,数据库的内容,注册表内容,文件的内容,第三党的API,和网络数据包。
§ 当间接命令注入进行测试时,重要的是你控制的源传递到目标函数的参数。 例如,如果你被攻击一个使用应用程序 ,你必须控制传递给这个函数的文件。 让我们说的应用程序使用而execfile /私营/ commands.txt的,在这里你不需要通过任何恶意的参数,你必须修改命令文件注入恶意指令,并等待(或强迫)注入要执行的命令。这是建议,进行测试时,直接喷射,您使用的环境监测工具。 

§ 结论
§ 命令注入漏洞存在,因为穷人的输入验证和消毒交互的功能与操作系统的shell所使用的参数。 任何攻击者控制这些参数可以强制应用程序执行不必要的系统命令。 命令注入漏洞进行对比测试,包括操纵原来的命令参数,命令注入的字符串,取决于要执行的操作的入口点下测试不同的组合。