7

我正在研究 SQL入侵检测系统 (IDS),我需要解析传入的 SQL 查询。编写自己的 SQL 解析器是一项长期任务,它永远不会准确反映原生解析器中使用的逻辑。我发现 MySQL 有一个带有主源文件的词法分析器sql/sql_lex.cc和一个用来自sql/sql_yacc.y. 我对重用这个强大的解决方案非常感兴趣。我正在用 C/C++ 构建我的 IDS,所以我正在寻找某种方法将 MySQL 解析器与我的检测系统连接起来。

我想知道是否可以重用 MySQL 解析器(词法+语法分析器)以某种逻辑形式(例如语法树)获取 SQL 查询的结构。这有没有可能?是否有一些相关的文本、教程或项目?

谢谢

4

2 回答 2

9

作为我本科项目的一部分,我已经完成了我的 IDS 的第一个版本。它被实现为 MySQL 的插件。

我将在下面列出我理解 MySQL 内部结构的主要来源。然后我简要描述了我在 IDS 中使用的方法。

MySQL 文档文本

  • 我发现Charles BellExpert MySQLSasha Pachev的Understanding MySQL Internals (正如 user3822447 所写)是理解 MySQL 内部的很好的切入点。
  • Andrew Hutchings 和 Sergei GolubchikMySQL 5.1 Plugin Development也非常有用。
  • MySQL Internals Manual还包含一些很好的基本信息。
  • 在阅读完所有内容后,我做了一些调试(使用 VS)并发现了查询树结构的样子。

我的 IDS 解决方案

我的解决方案的源代码可以在sourceforge找到。我打算在它的 wiki 中记录更多内容。

主要入口点audit_ids_notify()audit_ids.cc. 该插件采用内部 MySQL 解析器生成的查询树,使其简化版本(以节省内存)。然后它进行异常检测——它有一个已知查询树结构的列表,并保留有关每个查询树结构的每个参数化部分的一些统计信息。输出被写入 MySQL 数据目录中的特殊日志文件。

我试图使解决方案模块化和可扩展。初始版本是一种演示,性能没有优化,特别是在 SQL 存储模块中。

MySQL 插件类型

我确定了两种可能的方法并使用了第一种。

  1. 审计插件
    • 我的解决方案插件中的包装器类型是audit plugin
    • 尽管用于报告服务器操作(例如记录查询或错误),但我还是使用了这种类型的插件。
    • 我之所以选择这种类型的插件,是因为我发现这是唯一一个本机支持的插件,当查询树在完成(即解析)之后和从内存中释放之前(对于 MySQL 5.6.17)被调用。
    • 缺点:在 MySQL 的未来版本中不能完全保证上述内容,但在我看来,这在不久的将来应该不会改变。
    • 优点:MySQL不需要重新编译。构建和安装插件就足够了。

  1. 查询重写插件
    • 还有一种替代方法是使用非本地插件类型query-rewrite来做到这一点。它提供了用于修改查询的插件 API,因此也用于读取它。
    • 缺点:要支持这个插件 API,MySQL 服务器必须使用 API 重新编译。我认为可能会成为 MySQL 生产发行版的一部分。
    • 优点:设计用于读取/重写内部查询树的插件类型。

如果有一些与此主题相关的问题/问题,我可以随时回答;)

于 2014-10-23T19:36:49.350 回答
1

我相信这是可能的。试试高级 MySQL 内部书籍,例如 Charles Bell 的“Expert MySQL”或 Sasha Pachev 的“Understanding MySQL Internals”。MySQL 使用自定义的手工构建的词法分析器和通用的 Bison 兼容解析器,它们的词法分析器与之兼容。

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

  • 策略#1:扔掉查询,只看查询中字符串的内容。寻找可能的攻击媒介,例如 SQL 关键字。这可以检测攻击企图。
  • 策略#2:丢弃所有用户输入并列出其余查询内容。列出所有关键字的查询模式,并将它们相互比较。查找具有异常结构的查询,表明有人成功修改了查询。

我不是 SQL 专家,但最基本的策略就是使用参数化查询并忽略渗透尝试。Internet 上的大多数此类尝试都是通用的随机查询,旨在探测明显的弱点,如果您在任何地方都遵循基本的安全实践,可以安全地忽略它们。

于 2014-09-14T21:19:54.023 回答