可以使用内联注释序列来创建SQL代码段。这些代码段虽然在语法上有些怪异,但实际上却非常有效,能够避开多种输入过滤器。
可以使用这种方法来避开多种简单的模式匹配过滤器。例如,phpShop应用中最新的一个漏洞试图使用下列输入过滤器来阻止SQL注入攻击:
- if (strister($value,'FROM ') ||
- (strister($value,'UPDATE ') ||
- (strister($value,'WHERE ') ||
- (strister($value,'ALTER ') ||
- (strister($value,'SELECT ') ||
- (strister($value,'SHUTDOWN ') ||
- (strister($value,'CREATE ') ||
- (strister($value,'DROP ') ||
- (strister($value,'DELETE FROM ') ||
- (strister($value,'script ') ||
- (strister($value,'<> ') ||
- (strister($value,'= ') ||
- (strister($value,'SET '))
- die('Please provide a permitted value for '.$Key);
请注意,上述代码对每个SQL关键字后面紧跟的空格进行了检查。可以在不需要空白符的情况下使用内联注释来分隔每个关键字,这样就能很容易避开这种过滤。例如:
- '/**/UNION/**/SELECT/**/password/**/FROM/**/
tblUsers/**/WHERE/**/username/*
- */LIKE/**/'admin'--
(请注意,过滤器将等号字符(=)也过滤掉了。上述避开攻击使用LIKE关键字替换等号,在本例中可以得到相同的结果。)
当然,也可以使用该技术避开那些只是阻止各种空白符的过滤器。许多开发人员错误地认为,将输入限制为单个标号就可以防止SQL注入攻击,但是他们忘记了内联注释允许攻击者不使用任何空格即可构造任意复杂的SQL。
在MySQL 中,甚至可以在SQL关键字内部使用内联注释来避开很多常见的关键字阻塞过滤器。例如,如果将有缺陷的phpShop过滤器修改成只检查关键字而不检查附加的空白符(假设后台数据库为MySQL),则下列攻击依然有效:
- '/**/UN/**/ION/**/SEL/**/ECT/**/password/**/FR/**/OM/**/tblUsers/**/WHE/**
- /RE/**/username/**/LIKE/**/'admin'--
【责任编辑: 云霞 TEL:(010)68476606】
|