我的工作SQL 入侵检测系统(IDS) 我需要做分析传入SQL查询。书写自己的SQL parser是一个长期任务,它将永远不会确切地反映了所使用的逻辑在当地的分析器。我发现MySQL有一个词汇分析与主要来源文件 sql/sql_lex.cc 和一个语法分析建立与从野牛 sql/sql_yacc.y.我真的很感兴趣,重新利用这一强大的解决方案。我建立我的ID C/C++,所以我在寻找一些方法来连接MySQL解析我的检测系统。

我想知道,如果它能够重复使用的MySQL分析器(词汇+语法分析)得到的结构SQL query在一些合乎逻辑的形式,例如语法树。它会是可能的?都有一些相关文本、指南或项目?

感谢

有帮助吗?

解决方案

我已经完成的第一个版本的我的ID作的一部分我的学士学位项目。它是实现为插件MySQL.

我将列出我的主要来源于理解MySQL内部波纹管。然后,我不久描述的方法我用我的ID。

MySQL文件的案文

  • 我找到的书籍 专家MySQL 通过 查尔斯*贝尔了解内部MySQL 通过 萨沙Pachev (作为user3822447写)可以很好的入境点对于理解的内部MySQL.
  • MySQL5.1插件开发 通过 安德鲁*哈钦斯&谢尔盖Golubchik 也是非常有用的。
  • MySQL内部手册 还包含一些基本信息的良好开始。
  • 之后所有的阅读我som 调试 (使用VS),并发现了如何查询树的结构看起来像。

我的解决方案的ID

源代码的我的解决方案可以发现在 sourceforge.我计划文件,它在其wiki。

主要切入点是 audit_ids_notify() 功能 audit_ids.cc.插件需要查询树所产生的内部分析器MySQL一个使的简化版本(保存存储器)。然后它并anomally检测-它有一个已知的查询树的结构和保留某些统计信息有关的各个参数化的一部分,每个查询树形结构。输出被写入特殊的登录文件的MySQL数据目录。

我试图让的解决方案模块化和扩展。最初的版本是一种示范和性能不是最优化的,尤其是在SQL储存模块。

MySQL插件类型

我确定了2个可能的办法和使用的第一个。

  1. 审计的插件
    • 的类型包装在我的解决方案的插件 审计的插件.
    • 我用这种类型的插件,尽管是用于报告服务器的操作(例如登录查询或误差)。
    • 我选择了这种类型的插件,因为我发现,这是唯一的当地支持的插件,它被称为当的查询树后完成(即分析)和在它之前被释放,从存储器(MySQL5.6.17).
    • 缺点:上述是不充分的保证在将来的版本的MySQL,但在我看来,这不应该改变在附近的未来。
    • 优点:MySQL不需要重新编译。它足以构建和安装的插件。


  1. 查询的改写插件
    • 此外,还有一个替代办法,这样做使用非本地的插件类型 查询的改写.它provised插件API修改的查询,因此也为阅读它。
    • 缺点:支持这个插件API MySQL server必须重新编译与API。我觉得可能成为其中的一部分,MySQL生产分布。
    • 优点:插件类型设计的读写的内部查询树。

如果有一些问题/问题与此相关的主题,我可以回答感到自由问)

其他提示

我相信这是可能的。尝试高级MySQL内部书籍,例如Charles Bell或“了解SASHA Pachev”了解MySQL Internals“的”专家MySQL“。 MySQL使用自定义手工制造的Lexer和一个通用的Bison兼容的解析器,其Lexer兼容了它们的解释器。

除此之外,您可能会发现比解析查询更简单的解决方案,例如:

  • 策略#1:丢弃查询,只需查看查询内的字符串的内容。寻找可能的攻击向量,如SQL关键字。这可能会发现攻击尝试。
  • 策略#2:丢弃所有用户输入并列出其余的查询内容。列出所有查询模式的关键字,并将它们相互比较。寻找具有异常结构的查询,表示有人成功修改了查询。

我不是SQL Guru,但最基本的策略只是使用参数化查询并忽略渗透尝试。互联网上大多数此类尝试是通用的,随机查询,用于探测显而易见的弱点,如果您到处遵循基本安全练习,可以安全地忽略。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top