(1)用户提交的所有数据项都可提交给动态执行函数。其中最常见的数据项是cookie参数名称和参数值,以及作为前一项操作结果保存在用户资料中的永久数据。
(2)尝试轮流向目标参数提交下列值:
(3)监控应用程序的响应。如果字符串111111被单独返回(即它前面没有其他命令字符串),就表示应用程序可能易于受到脚本命令注入。
(4)如果字符串111111并未返回,寻找任何表示输入被动态执行的错误消息;另外,可能需要对语法进行调整,以实现注入任意命令的目的。
(5)如果攻击的应用程序使用PHP,可以使用测试字符串phpinfo()。如果它成功执行,应用程序将返回PHP环境的配置信息。
(6)如果应用程序可能易于受到攻击,与前面描述的查找OS命令注入漏洞时一样,注入一些造成时间延迟的命令确认这一点。例如:
通常来说,防止OS命令注入漏洞的最佳方法是完全避免直接调用操作系统命令。几乎Web应用程序所需要执行的每个任务都可以使用内置API完成,而且攻击者无法控制这些API,使其执行其他预料之外的命令。
如果无法避免要在传送给操作系统命令解释器的命令字符串中插入用户提交的数据,应用程序应实施严格的防御来防止漏洞发生。如果可能,应使用一份“白名单”限制用户只输入一组特殊的值。或者,应将输入范围限制为少数字符,例如,仅字母数字字符。应拒绝包含任何其他数据(包括任何元字符或空白符)的输入。
应用程序应使用命令API通过它的名称和命令行参数启动特殊的进程,而不是向支持命令链接与重定向的shell解释器传送命令字符串,从而实施另一层保护。例如,Java API Runtime.exec和ASP.NET API Process.Start并不支持shell元字符,如果使用得当,它们能够确保仅执行开发者想要执行的命令。请参阅第19章了解与命令执行API有关的详情。
通常而言,防止脚本注入漏洞的最佳方法是,避免将用户提交的输入或者来自用户的数据传送给任何动态执行或包含函数。如果由于某种原因必须传送用户提交的输入,那么应对相关输入进行严格的确认检查以阻止任何攻击。如有可能,使用一份由已知可靠的值组成的“白名单”,并拒绝任何没有出现在这个名单上的输入。如果无法做到这一点,应根据一组已知无害的字符[如字母数字字符(空白符除外)]检查在输入中使用的字符。