SQL注入之突破WHERE限制的SQL子句,显示表内全部内容
字数 1079 2025-08-10 16:34:28

SQL注入突破WHERE限制的教学文档

实验概述

本实验演示了如何利用SQL注入漏洞突破WHERE子句的限制,显示数据库表中所有内容(包括隐藏数据)。实验场景是一个电子商务网站,存在产品类别筛选器的SQL注入漏洞。

前置知识

  1. 不安全SQL拼接:网站直接将用户输入拼接到SQL语句中执行查询
  2. 典型漏洞场景:当用户访问https://insecure-website.com/products?category=Gifts时,后端执行:
    SELECT * FROM products WHERE category = 'Gifts'
    
  3. 注释符使用:在SQL注入中常用--注释掉原查询的剩余部分

实验目标

  • 目标SQL查询:
    SELECT * FROM products WHERE category = 'Gifts' AND released = 1
    
  • 攻击目标:修改查询以显示所有产品(包括未发布的产品,即released = 0的记录)

详细攻击步骤

1. 识别注入点

  1. 分析网站功能,发现产品分类筛选器:

    • 原始请求:/filter?category=Accessories
    • 对应SQL:
      SELECT * FROM products WHERE category = 'Accessories' AND released = 1
      
  2. 测试注入点:

    • 输入单引号'测试:
      SELECT * FROM products WHERE category = ''' AND released = 1
      
    • 观察结果:服务器返回500错误,确认存在SQL注入漏洞

2. 构造注入payload

  1. 基本思路:

    • 闭合原查询中的字符串
    • 添加OR 1=1使条件恒为真
    • 注释掉原查询的剩余部分
  2. 构造的payload:

    ' OR 1=1 -- 
    
    • URL编码后:
      '%20OR%201=1%20--%20
      
  3. 最终请求:

    GET /filter?category=Accessories'%20OR%201=1%20--%20 HTTP/2
    

3. 结果分析

  1. 注入后的SQL语句:

    SELECT * FROM products WHERE category = '' OR 1=1 -- ' AND released = 1
    
    • 实际执行:
      SELECT * FROM products WHERE 1=1
      
    • 效果:查询products表中的所有记录,忽略released限制
  2. 结果:页面显示所有产品,包括未发布的产品,实验成功

关键知识点总结

  1. 注入点识别

    • 寻找用户输入直接拼接到SQL查询中的参数
    • 通过输入特殊字符(如单引号)测试是否引发SQL错误
  2. payload构造原则

    • 正确闭合原查询中的字符串或括号
    • 使用恒真条件(如1=1)绕过限制
    • 注释掉原查询的剩余部分(特别是可能限制结果的WHERE条件)
  3. URL编码注意事项

    • 空格编码为%20
    • 其他特殊字符也需要相应编码
  4. 防御措施

    • 使用参数化查询(预编译语句)
    • 实施输入验证和过滤
    • 最小权限原则,限制数据库用户权限
    • 错误处理,避免泄露敏感信息

扩展思考

  1. 其他绕过方式

    • 使用' OR ''='代替OR 1=1
    • 使用;多语句执行(取决于数据库支持)
  2. 不同数据库的注释语法

    • MySQL: -- (注意末尾空格)或#
    • Oracle: --
    • SQL Server: --/* */
  3. 进阶利用

    • 联合查询获取其他表数据
    • 基于时间的盲注
    • 布尔盲注

通过本实验,我们掌握了基本的SQL注入技术,特别是如何突破WHERE子句的限制获取隐藏数据。理解这些技术有助于更好地防御此类攻击。

SQL注入突破WHERE限制的教学文档 实验概述 本实验演示了如何利用SQL注入漏洞突破WHERE子句的限制,显示数据库表中所有内容(包括隐藏数据)。实验场景是一个电子商务网站,存在产品类别筛选器的SQL注入漏洞。 前置知识 不安全SQL拼接 :网站直接将用户输入拼接到SQL语句中执行查询 典型漏洞场景 :当用户访问 https://insecure-website.com/products?category=Gifts 时,后端执行: 注释符使用 :在SQL注入中常用 -- 注释掉原查询的剩余部分 实验目标 目标SQL查询: 攻击目标:修改查询以显示所有产品(包括未发布的产品,即 released = 0 的记录) 详细攻击步骤 1. 识别注入点 分析网站功能,发现产品分类筛选器: 原始请求: /filter?category=Accessories 对应SQL: 测试注入点: 输入单引号 ' 测试: 观察结果:服务器返回500错误,确认存在SQL注入漏洞 2. 构造注入payload 基本思路: 闭合原查询中的字符串 添加 OR 1=1 使条件恒为真 注释掉原查询的剩余部分 构造的payload: URL编码后: 最终请求: 3. 结果分析 注入后的SQL语句: 实际执行: 效果:查询products表中的所有记录,忽略released限制 结果:页面显示所有产品,包括未发布的产品,实验成功 关键知识点总结 注入点识别 : 寻找用户输入直接拼接到SQL查询中的参数 通过输入特殊字符(如单引号)测试是否引发SQL错误 payload构造原则 : 正确闭合原查询中的字符串或括号 使用恒真条件(如 1=1 )绕过限制 注释掉原查询的剩余部分(特别是可能限制结果的WHERE条件) URL编码注意事项 : 空格编码为 %20 其他特殊字符也需要相应编码 防御措施 : 使用参数化查询(预编译语句) 实施输入验证和过滤 最小权限原则,限制数据库用户权限 错误处理,避免泄露敏感信息 扩展思考 其他绕过方式 : 使用 ' OR ''=' 代替 OR 1=1 使用 ; 多语句执行(取决于数据库支持) 不同数据库的注释语法 : MySQL: -- (注意末尾空格)或 # Oracle: -- SQL Server: -- 或 /* */ 进阶利用 : 联合查询获取其他表数据 基于时间的盲注 布尔盲注 通过本实验,我们掌握了基本的SQL注入技术,特别是如何突破WHERE子句的限制获取隐藏数据。理解这些技术有助于更好地防御此类攻击。