首页 > 数据库 >记录一个利用数据库引擎格式化异常sql的思路

记录一个利用数据库引擎格式化异常sql的思路

时间:2024-03-08 21:12:16浏览次数:36  
标签:格式化 name 数据库 sql tbl mysql id schema

这个思路主要解决MySQL 中的科学记数法漏洞使 AWS WAF 客户端易受 SQL 注入攻击这篇文章中的问题

目前基本上都使用阿里巴巴的druid并开启sql防火墙模式以语义层面拦截sql注入,如果极端情况下对sql解析结果不一致还是会产生sql注入

于是尝试了一下mysql自带的功能

1)EXPLAIN

2)optimizer_trace

SET optimizer_trace = "enabled=on"; 
EXPLAIN
SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE table_schema = DATABASE();
SELECT TRACE
FROM information_schema.OPTIMIZER_TRACE;
SET optimizer_trace = "enabled=off";

 EXPLAIN保证sql不会对数据库造成污染

optimizer_trace主要保证获取sql在数据库中的实际内容

在information_schema的OPTIMIZER_TRACE中

QUERY是执行的sql而TRACE是sql引擎跟踪后的内容使用json表达

注意,内容非常的长啊!所以我们只截取我们比较关心的部分

"expanded_query": "/* select#1 */ select group_concat((`mysql`.`tbl`.`name` collate utf8mb3_tolower_ci) separator ',') AS `GROUP_CONCAT(TABLE_NAME)` from <constant table> join ((((((`mysql`.`tables` `tbl` join `mysql`.`schemata` `sch` on((`mysql`.`tbl`.`schema_id` = `mysql`.`sch`.`id`))) join `mysql`.`catalogs` `cat` on((`mysql`.`cat`.`id` = `mysql`.`sch`.`catalog_id`))) left join `mysql`.`collations` `col` on((`mysql`.`tbl`.`collation_id` = `mysql`.`col`.`id`))) left join `mysql`.`tablespaces` `ts` on((`mysql`.`tbl`.`tablespace_id` = `mysql`.`ts`.`id`))) left join `mysql`.`table_stats` `stat` on(((`mysql`.`tbl`.`name` = `mysql`.`stat`.`table_name`) and (`mysql`.`sch`.`name` = `mysql`.`stat`.`schema_name`))))) on(((0 <> can_access_table(`mysql`.`sch`.`name`,`mysql`.`tbl`.`name`)) and (0 <> is_visible_dd_object(`mysql`.`tbl`.`hidden`)))) where ((`mysql`.`sch`.`name` collate utf8mb3_tolower_ci) = database())"

这个思路的好处是:

1)避免sql中间件解析sql和实际数据库产生差异

2)可以充分避免注释、bug、花式技巧导致的sql注入bypass,因为optimizer_trace追踪后的输出都是统一格式化后的sql

例如,1e1的解析:

EXPLAIN
SELECT GROUP_CONCAT(TABLE_NAME),1e1FROM/* 
*/ information_schema.tables WHERE table_schema = DATABASE()
#解析为
"expanded_query": "/* select#1 */ select group_concat((`mysql`.`tbl`.`name` collate utf8mb3_tolower_ci) separator ',') AS `GROUP_CONCAT(TABLE_NAME)`,1e1 AS `1e1` from <constant table> join

 

标签:格式化,name,数据库,sql,tbl,mysql,id,schema
From: https://www.cnblogs.com/k4n5ha0/p/18061870

相关文章

  • mysqldump+binlog备份脚本
    mysqldump是一种逻辑备份工具,可以对数据库进行全量备份,和binlog增量备份共同使用可以进行数据库备份,基于此写了一个备份的脚本#!/bin/bashall_path="/opt/mysql_bakup/all"#MySQL全量备份目录add_path="/opt/mysql_bakup/add"#MySQL增量备份目录old_all_path="/o......
  • [Redis] 02-缓存和数据库数据一致性问题
    经过一番排查,确认服务器的性能瓶颈是在数据库。给服务器加上Redis,让其作为数据库的缓存。这样,在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用再去查询数据库,从而减轻数据库的压力,提高服务器的性能。一、缓存模型二、数据库和缓存的数据不一致问题更新数据时,数据......
  • MySQL(六):MySQL之MVCC
    1、事务的引入事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可再进行分割),由一个有限的数据库操作序列构成(多个DML语句),要不全部成功,要不全部不成功。如:A给B划钱,A的账户-100元,B的账户就要+100元,这两个update语句必须作为一个整体来执行,不然A扣钱了,B没有加......
  • SQL语句On和Where语句的区别
    前面我们讲解了Join的底层驱动表选择原理,也知道了基本的内连接外连接两种SQL查询表连接方式但是我们再查询多表的时候on和where语句到底有什么区别?where是过滤条件,不满足where的一定不会出现在结果中on是连接条件,对于内连接来说on和where效果一致对于外连接来说,如果在被......
  • PostgreSQL应该用哪个时区表示符?
    PG中国用哪个时区标识符?在linux中使用timedatectl查看时间,可以看到localtime中时区是CST。$timedatectlLocaltime:Mon2024-03-0418:19:54CSTUniversaltime:Mon2024-03-0410:19:54UTCRTCtime:Mon2024-03-0410:19:53Timezone:Asia/Shanghai(CST,+......
  • 如何避免MYSQL主从延迟带来的读写问题?
    在MYSQL部署架构选型上,许多公司都会用到主从读写分离的架构,如下是一个一主一从的架构,主库master负责写入,从库slave进行读取。但是既然是读写分离,必然会面临这样一个问题,当在主库上进行更新后,有可能数据还没来得及同步到从库,但是这个时候又有读数据的需求,为了能正确读取出数据,这......
  • oracle数据库rpm安装
    Oracle19C的安装与配置把19C的安装包传送到我们的虚拟机(Oracle19C)oracle19C默认安装到/opt/目录下,要保证该目录空间足够 rpm-ivhcompat-libstdc++-33-3.2.3-72.el7.x86_64.rpmrpm-ivhoracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm###yum自动解决依赖......
  • EF Core 显示SQL语句
     1.使用Nuget引入如下两个包:Microsoft.Extensions.LoggingMicrosoft.Extensions.Logging.Console 2.在DbContext.cs中加入以下代码publicstaticreadonlyLoggerFactoryLoggerFactory=newLoggerFactory(new[]{newDebugLoggerProvider()});......
  • MySQL(四):InnoDB引擎底层解析
    官方文档地址:https://dev.mysql.com/doc/refman/8.3/en/innodb-storage-engine.html。InnoDB存储引擎有三大特性:双写机制、BufferPool、自适应Hash。InnoDB存储引擎架构的内存和磁盘结构如下:上述架构图描述了数据在内存和磁盘上的流转和存储流程,在实际开发......
  • 笔记(五):MySQL之事务概述
    一、什么是事务事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。二、事务的四大特性1、原子性(Atomicity)原子性是指事务包含的所有操作要么......