1. 实验背景与目标解析
这个SQL注入实验来自PortSwigger的Web Security Academy平台,属于学徒级(Apprentice)难度。作为网络安全领域的经典入门实验,它完美展示了Web应用中最常见的安全漏洞之一——SQL注入的实际利用场景。
实验模拟了一个电商网站的产品分类筛选功能。当用户点击不同商品分类时,网站后端会执行类似这样的SQL查询:
sql复制SELECT * FROM products WHERE category = 'Gifts' AND released = 1
其中released = 1表示只显示已发布的产品。问题在于,category参数直接从用户输入拼接而来,没有任何过滤或转义处理。这种粗糙的实现方式,使得攻击者可以通过精心构造的输入改变SQL语句的原始逻辑。
关键点:字符型注入与数字型注入的最大区别在于参数是否被引号包裹。本例中参数被单引号包裹('Gifts'),属于典型的字符型注入场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞原理深度剖析
2.1 SQL语句拼接的致命缺陷
现代Web应用通常采用三层架构:表示层(前端)、业务逻辑层(后端)和数据层(数据库)。当后端代码这样拼接SQL时:
python复制query = "SELECT * FROM products WHERE category = '" + user_input + "' AND released = 1"
攻击者只需在user_input中插入单引号,就能破坏原有SQL语法结构。例如输入Gifts' -- ,生成的SQL会变成:
sql复制SELECT * FROM products WHERE category = 'Gifts' -- ' AND released = 1
这里--是SQL的单行注释符,它使得后面的AND released = 1条件失效,导致未发布的产品也被查询出来。
2.2 注释符的多种形式
不同数据库系统的注释语法略有差异:
- MySQL/PostgreSQL:
--(注意末尾空格)、# - Oracle:
-- - SQL Server:
--、/* */
在URL中传递时,空格需要编码为+或`%
