(1)如果有任何价格或其他敏感价值需要根据用户控制的数据或操作确定的标准进行调整,首先应了解应用程序使用的算法以及需要调整的逻辑。确定这些调整是一次性行为,还是需要根据用户执行的其他操作进行修改。
(2)发挥想象,努力想出操纵应用程序行为的办法,使应用程序进行的调整与开发者最初设定的标准相互矛盾。如前所述,在应用折扣后再从购物车中取出商品就是最典型的示例。
我们曾在各种Web应用程序中遇到过这种逻辑缺陷,包括一款网络入侵检测产品使用的Web管理界面。
1.功能
应用程序的设计者决定执行某种功能,该功能需要以自变量的形式向操作系统命令提交用户控制的输入。应用程序的开发者知道这种操作包含着内在的风险(请参见第9章了解相关内容),并决定净化用户输入中出现的任何潜在的恶意字符,从而防御这种风险。下面的字符都需要使用反斜线(\)进行转义:
以这种方式进行转义后,shell命令解释器就把它们当做提交给被调用命令的自变量的一部 分,而非shell元字符。后者可用于注入其他命令或自变量、重定向输出等。
2.假设
开发者确信,他们设计的方法可有效防御命令注入攻击。他们考虑到了每一个可能被攻击者利用的字符,并确保对它们进行了适当的转义处理,因而它们不会造成风险。
3.攻击方法
开发者忘记了对转义字符本身进行转义。
通常,攻击者在利用简单的命令注入漏洞时并不直接使用反斜线,因此开发者认为它并非恶意字符。然而,正是由于没有对它进行转义,攻击者就可以完全破坏应用程序的净化机制。
假设攻击者向易受攻击的功能提交以下输入:
如前所述,应用程序对其进行适当的转义处理,因此攻击者的输入变成:
当这个数据作为自变量提交给操作系统命令时,shell 解释器把第一个反斜线作为转义字符,而把第二个反斜线当做字面量反斜线处理;反斜线不是一个转义字符,而是自变量的一部分。然后它遇到分号字符,该字符明显没有进行转义。解释器把分号作为一个命令分隔符,因此继续执行攻击者注入的命令。