当在应用程序中探查命令注入及其他缺陷时,尝试在受控制的数据插入相关字符后,戒指在每个字符前面插入一个反斜线,测试前面描述的逻辑缺陷。为防御跨点脚本的攻击,许多应用程序使用的反斜线对出现在用户输入中的引号进行转义。我们曾在各种WEB应用程序中遇到这种逻辑,包括网络入侵检测产品使用的Web管理界面。下面深圳方圆网络为大家介绍在WEB应用程序中避免转义的几个要点。
1.功能
应用程序的设计者决定执行某种功能,该功能需要以自变量的形式向操作系统命令提交用户控制的输入。
深圳网站制作公司应用程序的开发者知道这种操作包含着内在的风险并决定净化用户输入出现的任何潜在恶意字符,从而防御这种风险,如下面的字符都需要使用反斜线(\)进行转义:
; | & < > '空格和换行符
以这种方式进行转义后,shell命令解释器就把它们当做提交给被调用命令的自变量的一部分,而非shell元字符。后者可用于注入其他命令或自变量、重定向输出等。
2.假设
深圳建站公司的开发者确信,它们设计的方法可有效防御命令注入攻击。他们考虑了每一个可能被攻击者利用的字符,并确保对它们进行了适当的转义处理,因此而它们不会造成风险。
3.攻击方法
开发者忘记了对转义字符本身进行转义。通常,攻击者在利用尖端命令注入漏洞时并不直接使用反斜线,因此开发者认为它并不非恶意字符,然而,正是由于没有对它进行转义,攻击者就可以完全破坏应用程序的净化机制。
假设攻击者向易受攻击者的功能提交以下输入:
foo\\;ls
如前所述,应用程序对其进行适当的转义处理,因此攻击者的输入变成:
foo\\;ls
当这个数据作为自变量提交操作系统命令时,shell解释把第一个反斜线作为转义字符,而把第二个反斜线当做字面量反斜线处理;反斜线不是一个转义字符,而是自变量的一部分。然后它遇到分号字符,该字符明显没有进行转义。解释把分号作为一个命令分隔符,因此继续执行攻击者注入命令。