内联注释如何绕过SQL注入Web应用程序防火墙?

时间:2012-09-13 05:38:12

标签: mysql select sql-injection union firewall

可以使用WAF阻止正常的基于UNION的SQL注入,WAF会过滤UNION, SELECT之类的关键字。但我认为可以通过SQL的内联注释语句绕过它,例如/*!UNION*//*!SELECT*/

评论声明仅用于阅读目的,对吧?如果是这样,SQL服务器如何在注释中读取注入查询并执行它?

3 个答案:

答案 0 :(得分:1)

使用WAF过滤关键字毫无意义。它无法成功。看看这个绕过它的方法列表:http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/(我在谷歌的短短几秒内发现了这个链接。)

如果代码写得正确,则没有必要。

至于你的问题,MySQL的/*!语法是针对MySQL特定命令的。它旨在让您能够编写可移植的SQL(可以在任何数据库上运行),但仍然能够发送MySQL特殊命令。

答案 1 :(得分:0)

如果您使用支持数据占位符的数据库驱动程序,那么SQL注入根本不应成为问题。你试图用事后检测做的事情是徒劳的,比如试图用蹩脚的苍蝇拍消除蟑螂的侵扰。你不可能全部拿到它们。

最佳做法是确保首先无法将恶意数据注入您的查询。有many examples available on Booby Tables说明如何正确执行此操作。

答案 2 :(得分:0)

通过不关闭部分查询来注释部分查询可用于绕过黑名单,删除空格,混淆和确定数据库版本。

您提到的是MySQL的一种特殊注释语法。如果将代码放入此注释中,它将仅在MySQL中执行。此外,仅当服务器高于提供的版本时,您才可以使用它执行一些代码。例如:

经典内联注释SQL注入攻击示例

  async ngOnInit() {
    Promise.all([
      await faceapi.nets.tinyFaceDetector.loadFromUri('./models'),
      await faceapi.nets.faceLandmark68Net.loadFromUri('./models'),
      await faceapi.nets.faceRecognitionNet.loadFromUri('./models'),
      await faceapi.nets.faceExpressionNet.loadFromUri('./models')
    ]).then(() => {
      this.startVideo();
    })
  }

如果MySQL版本高于3.23.02,您将得到相同的响应