伪装的SQL注入

伪装的SQL注入,sql,security,sql-injection,Sql,Security,Sql Injection,有时,SQL注入查询可能会通过使用您习惯的不同字符集来伪装。但即使在这些伪装模式中,查询字符串仍将包括熟悉的单词,如union、cast和varchar等 我的问题是, 有没有可能把这些话也伪装起来?换句话说,“union”或“cast”也可以伪装吗?SQL注入不需要包含任何关键字 比如说, DELETE FROM Table WHERE ID=<<<Injected Payload>>> SQL标准要求关键字使用拉丁字符A到Z或A到Z、数字0到9以及特定字

有时,SQL注入查询可能会通过使用您习惯的不同字符集来伪装。但即使在这些伪装模式中,查询字符串仍将包括熟悉的单词,如union、cast和varchar等

我的问题是,


有没有可能把这些话也伪装起来?换句话说,“union”或“cast”也可以伪装吗?

SQL注入不需要包含任何关键字

比如说,

DELETE FROM Table WHERE ID=<<<Injected Payload>>>

SQL标准要求关键字使用拉丁字符A到Z或A到Z、数字0到9以及特定字符。请参阅“SQL-99完成,真的”

也就是说,单个实现(例如Oracle、Microsoft SQL Server、MySQL)可能并不完全符合标准。最好的确定方法是测试您使用的RDBMS的品牌和版本


回复您的评论:MySQL允许在关键字中嵌入
/**/
评论,但在其他品牌的数据库中,内联评论或多或少类似于空白。
所以
SEL/**/ECT
就像
SEL ECT
一样,当然它不是一个有效的关键字,所以它会失败

我假设注释分隔符也必须是ascii范围内的字符,但我还没有对此进行测试以确定。而且它可能因RDBMS的品牌而异,具体取决于实现。所以答案必须考虑到这一点(提示:您还没有告诉我们您使用的是什么品牌的数据库)

另一种“伪装”可能是URL编码。也就是说,对单个字符使用HTML实体或HTML十六进制编码。SQL无法识别这些信息,但如果在解码之前过滤原始输入,则可能会有一些信息漏掉检查

最终,我的最佳实践政策是:

  • 永远不要让用户输入作为代码运行(这也适用于从文件甚至数据库本身读取的任何不受信任的内容)。使用参数化或至少可靠的转义函数,而不是将内容直接插入SQL字符串

  • 如果希望根据用户输入使SQL的其他部分成为动态的,那么参数化就没有帮助。例如,让用户选择如何对结果进行排序:

    SELECT * FROM MyTable ORDER BY $ColumnOfUsersChoice $AscVsDesc
    
在这种情况下,我的做法是使用白名单,因此我们将用户输入与一组固定的有效选项进行比较,而不是尝试使用正则表达式的模式匹配。白名单的优点是,如果恶意用户尝试任何巧妙的操作,他们的输入将被忽略

有关白名单的示例,请参阅我的演示文稿或我的书


下面是我介绍SQL注入神话和谬论谈话的视频记录:但自从制作该视频以来,我继续改进幻灯片,因此会有一些不同。

您从错误的方向处理问题。防止SQL注入的唯一可靠方法是通过正确解析或转义数据,确保数据永远不会作为代码执行

使用参数化查询将有助于您进行转义,因为这是很难正确完成的


在输入中查找关键字只是作为第二种措施,以保护完全没有任何保护的写得不好的代码。

如果只使用参数化查询,这个问题绝对没有意义。@Andrew:太正确了,虽然知道什么时候设置蜜罐可能很有用。@sarnold:如果你想诱使黑客,那么你可能对自己的所作所为有所了解。@AndrewBarber.。而且你有善意的愿望。@paislee好吧,这比恶意的愿望好。。。虽然我怀疑你的意思有点不同,明白了,明白了,比尔。我会注意接受答案。。。我不知道我必须接受答案。现在我知道了,我不会跳过这个。尽管有些人认为有必要关闭此线程,但我还是会添加我的评论和我从中学到的东西,以确保我的理解是正确的。我认为你的答案是否定的。因此,作为一个例子,如果不实际使用cast这个词,就不可能进行cast。但另一方面,知道这一点也无济于事。因为我相信有一种方法可以通过使用/**/(sql注释)来编写CAST或SELECT,从而将CAST这个词伪装成类似于C/**/AST的东西。请核实。只是好奇。。。我见过一些人这样做。当然,我们可以先从组织中删除/*和*/。查询(通过替换),然后检查它是否包含单词CAST。。但是如果/*和*/也会出现不安的话,那将带来下一个问题。从这里,我了解到寻找某种黑名单中的某些单词是一种不好的看待事物的方式。。正如下面的GUFFA正确地怀疑的那样。他确实明白这个问题的目的。迈克·塞缪尔(MIKE SAMUEL)非常有趣的片段也证明了,你甚至不需要A-z来制造混乱。哇!很好的片段,让人大开眼界。。。谢谢大家帮我把这个钉上。你们都应该被接受。但我想我只能选一个。。。所以我会直接回答我的问题,这也是第一个问题,那就是你。。。但是我也从Mike的回答中受益匪浅…@John只是使用参数化查询;“问题解决了!”比尔,回答得很好。。这很有趣;上个星期左右,我看了那个演讲,但我被它迷住了。因此,我在半路上点击了一下,而富尔特却没有从中受益。毫无疑问,这是一个很好的资源,不管怎样,我能得到它的mp3版本吗?你仍然可以从听演讲中学到很多东西。
SELECT * FROM MyTable ORDER BY $ColumnOfUsersChoice $AscVsDesc