在MySQL中,评论可以插入关键字本身, 这提供了另一种绕过某些输入验证的方法 过滤器,同时保留实际查询的语法。例如:
SEL/*foo*/ECT username,password FR/*foo*/OM users
但是如何在保留的单词之间注释掉东西呢?有什么好处? 为什么这是一种绕过?
看起来像马车!
答案 0 :(得分:4)
That quote is from a book from 2007 ...对于早期版本的MySql可能是这样,但我找不到MySQL版本,其中该语法不会返回错误。
这种语法背后的原始想法是,如果应用程序试图黑名单某些SQL关键字,那么这种攻击会欺骗应用程序。
例如......如果应用程序试图阻止攻击者使用Sql Injection从数据库中删除记录,则不允许的术语黑名单会过滤掉DELETE
...但是无法过滤掉DEL/**/ETE
。
然而,尝试在动态查询中创建一个不允许的术语黑名单是一种糟糕,无效的方法来阻止SQL注入...并且有更简单有效的方法来阻止SQL注入攻击,例如参数化查询,即使它仍然有效,也会使嵌入的注释语法无效。
几乎总是如此,黑名单上充满了漏洞 这使它无法防止SQL注入攻击。对于 例如,攻击者可以:
- 未引用的目标字段
- 找出绕过某些转义元字符需求的方法
- 使用存储过程隐藏注入的元字符
答案 1 :(得分:1)
感谢Michael Fredrickson perfect answer.
check out the mysql site,您会看到所有版本的mysql中都提到了这种评论方式。
在我的版本(5.5.24)中,如果您编写如下所示的查询:
sele/*ops*/ct name from tableName
您将收到此错误:
You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'sele/*ops*/ct name from
tableName' at line 1
但如果你改成它:
select na/*ops*/me from tableName
你会得到这个:
Unknown column 'na' in 'field list'
我认为它会评论其他字段名称。但是如果你像这样编写查询,它的工作没有任何问题:
select name/*ops*/ from tableName