为什么多语句查询容易引发SQL注入全库拖库_在连接配置中禁用多语句执行

阿磊酱_1893

阿磊酱_1893

2026-06-04

574人浏览

原创

allowmultiqueries=true是高危开关,因它使分号被解析为语句分隔符,导致注入payload可执行多条sql(如select+drop+into outfile),将单表读取升级为全库拖库。

为什么多语句查询容易引发sql注入全库拖库_在连接配置中禁用多语句执行

多语句查询本身不是漏洞,但它是 SQL 注入从“单表读取”升级为“全库拖库”的关键跳板——只要数据库驱动和连接配置允许,攻击者一条注入 payload 就能 SELECT 出数据、UNION 拼接敏感表、再用 INTO OUTFILE 直接写文件导出,甚至执行 DROP DATABASE。

为什么 allowMultiQueries=true 是高危开关

MySQL JDBC 驱动默认禁用多语句,但很多老项目或调试环境会显式开启:jdbc:mysql://localhost:3306/db?allowMultiQueries=true。一旦开启,用户输入的 ; 不再被当作普通字符,而是被解析为语句分隔符。

  • 正常逻辑:用户搜 iphone → 执行 SELECT * FROM products WHERE name LIKE '%iphone%'
  • 注入后:用户搜 iphone'; DROP TABLE users; -- → 实际执行三条语句:SELECT ... + DROP TABLE users + 注释掉剩余逻辑
  • 更危险的是:配合 INTO OUTFILE,攻击者可把整张表导出到 Web 可访问路径,比如 SELECT * FROM users INTO OUTFILE '/var/www/html/dump.csv'

不同语言/驱动的多语句控制方式

不是所有客户端都支持多语句,也不是开了就一定危险,关键看底层驱动是否解析 ; 并交给服务端执行。

H2O EvalGPT
H2O EvalGPT

H2O EvalGPT是一款AI模型评测工具,H2O.ai 推出的基于 Elo 评级方法的大语言模型评估系统。

下载
  • Java(JDBC):allowMultiQueries=true 是显式开关,必须手动启用;MySQL 8.0+ 默认仍为 false
  • PHP(mysqli):mysqli_multi_query() 是独立函数,普通 mysqli_query() 即使传入分号也只执行第一条
  • Python(PyMySQL):cursor.execute() 默认不允许多语句;需设 cursor = conn.cursor(multi=True) 才能调用 nextset() 切换结果集
  • Node.js(mysql2):multipleStatements: true 必须在连接配置中声明,否则 ; 会被当作文本内容处理

禁用后,注入还能拖库吗

能,但难度陡增、路径受限。禁用多语句 ≠ 防住 SQL 注入,只是砍掉了最暴力的“一击脱库”能力。

  • 报错注入(如 updatexml())、布尔盲注、时间盲注依然有效,只是只能逐字段、逐行猜解,耗时且易被 WAF 拦截
  • UNION SELECT 仍可用,但要求前后查询字段数一致、类型兼容,且无法跨库查系统表(除非账号有 information_schema 权限)
  • LOAD_FILE() 和 INTO OUTFILE 被彻底禁用——这两个函数依赖服务端文件操作权限,而多语句是它们落地的常用载体
  • 真实案例中,某后台管理接口虽存在注入,但因连接串未配 allowMultiQueries=true,攻击者最终只导出了当前业务表的几百条记录,而非整个 information_schema 或其他库

检查与修复的实操步骤

别只改代码,要确认连接层、驱动层、服务端三层是否真正切断多语句通路。

  • 查应用连接字符串:grep -r "allowMultiQueries" ./src/;检查是否硬编码为 true,或通过环境变量注入
  • 查 MySQL 服务端配置:执行 SELECT @@global.sql_mode;,确认不含 PIPES_AS_CONCAT 等可能辅助绕过的模式(虽然不直接相关,但常共存)
  • 测试验证:用已知注入点尝试提交 1'; SELECT 1; --,观察是否返回多结果集或报错 Commands out of sync —— 后者说明多语句已被拦截
  • 额外加固:即使禁用多语句,也要确保数据库账号无 FILE 权限(REVOKE FILE ON *.* FROM 'app_user'@'%'),否则 LOAD_FILE() 仍可能被单语句利用

真正容易被忽略的是:有些 ORM(如旧版 MyBatis)在 <script></script> 标签里拼 SQL 时,底层仍走 JDBC 的 execute(),此时 allowMultiQueries 开关依然生效;而多数人只盯着自己写的 SQL,忘了框架封装层的执行路径。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

sql注入

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3763

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

811

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

989

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5561

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2543

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5560

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7261

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

990

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

872

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.2万人学习

Django 6.1 官方文档
Django 6.1 官方文档

共0课时 | 0人学习