5

在 MySQL 中,可以在关键字本身中插入注释,这提供了另一种绕过某些输入验证过滤器的方法,同时保留实际查询的语法。例如:

SEL/*foo*/ECT username,password FR/*foo*/OM users

但是怎么可能注释掉保留词之间的东西呢?有什么好处?为什么它是一种绕过?

好像有毛病!

4

2 回答 2

4

该引用来自 2007 年的一本书......对于早期版本的 MySql 可能是正确的,但我找不到该语法不返回错误的 MySQL 版本。

这种语法背后的最初想法是,如果应用程序试图将某些 SQL 关键字列入黑名单,那么这种攻击就会欺骗应用程序。

例如......如果应用程序试图阻止攻击者使用 Sql 注入从数据库中删除记录,则不允许的术语黑名单将过滤掉DELETE......但无法过滤掉DEL/**/ETE

但是,尝试在动态查询中创建禁止使用的术语黑名单是防止 SQL 注入的一种糟糕且无效的方法......并且有更简单有效的方法来防止 SQL 注入攻击,例如参数化查询,这会导致嵌入的注释语法即使仍然有效也无用。

来自 OWASP

几乎总是这样,黑名单充满了漏洞,使其无法有效防止 SQL 注入攻击。例如,攻击者可以:

  • 未引用的目标字段
  • 想办法绕过对某些转义元字符的需求
  • 使用存储过程隐藏注入的元字符
于 2013-03-22T22:51:20.437 回答
1

感谢迈克尔弗雷德里克森完美的答案。
查看 mysql 站点,您会看到所有版本的 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
于 2013-03-22T23:01:13.217 回答