绕过MySQL查询

时间:2013-03-22 22:27:58

标签: php mysql sql-injection

  

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

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

但是如何在保留的单词之间注释掉东西呢?有什么好处? 为什么这是一种绕过?

看起来像马车!

2 个答案:

答案 0 :(得分:4)

That quote is from a book from 2007 ...对于早期版本的MySql可能是这样,但我找不到MySQL版本,其中该语法不会返回错误。

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

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

然而,尝试在动态查询中创建一个不允许的术语黑名单是一种糟糕,无效的方法来阻止SQL注入...并且有更简单有效的方法来阻止SQL注入攻击,例如参数化查询,即使它仍然有效,也会使嵌入的注释语法无效。

From OWASP

  

几乎总是如此,黑名单上充满了漏洞   这使它无法防止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