刚接触pikachu靶场时,我其实有点轻敌。反射型XSS嘛,不就是输入一段script标签然后等着弹窗?结果真正卡住我的不是payload,而是POST这三个字母。以前练反射型XSS,我习惯在URL里改参数,因为GET型的数据都在地址栏,改完回车就能看到效果。但pikachu里这道“反射型XSS(post)”考点不一样:数据不在地址栏,而在请求体里,浏览器默认不给你编辑请求体的入口。为了通关,我被迫去抓包、去理解POST请求的结构、去复现一条从前端页面到Burp再到服务端返回的完整链路。这篇就把我从零搭环境到成功弹出alert(1)的全过程写下来,适合刚入门Web安全、正在刷pikachu靶场、或者面试前突击XSS知识点的朋友。
1. 为什么先把反射型XSS(POST)单拎出来练
1.1 靶场里这个题目到底在考什么
pikachu是一个运行在本地的PHP漏洞练习平台,集成了XSS、SQL注入、CSRF、SSRF、RCE这类常见Web漏洞类型。它的“反射型XSS(post)”位于XSS模块下,和另一个“反射型XSS(get)”是对应关系。这个名字已经告诉了你三件事:漏洞类型是反射型XSS,数据传输方式是POST,练习目的是观察输入怎么被反射并执行。如果你能在本地把这个实验完整跑通,对HTTP协议中request body、响应内容以及浏览器解析脚本的关系,会建立非常直观的感觉。
为什么我建议学习顺序里不要跳过这一题?因为GET型太容易形成路径依赖。你只要在URL后加?message=<script>alert(1)</script>就能复现,很多新手会误以为反射型XSS就是“在地址栏拼参数”。POST型会把你的视线逼到请求体上,逼你去理解一个HTTP事务的全貌。这就引出一个核心问题:你以为你在测XSS,其实你是在练HTTP协议的基础功。
1.2 反射型XSS的原理,三句话就能讲清楚
反射型XSS的链路可以压缩成三句话。第一,服务端没有对用户输入做严格校验或输出编码;第二,用户提交的内容被原样拼进了返回的HTML;第三,浏览器解析这段HTML时执行了攻击者塞进来的脚本。数据是“反射”回来的,不像存储型那样写进数据库,所以每次触发都需要受害者构造或提交一个特定请求。
POST只是传输载体的一个选择。你把<script>alert(1)</script>放在URL参数里,就是GET型;把它放在请求体里,就是POST型。漏洞根源完全一致,但利用姿势完全不同。尤其要注意:POST型不能简单做成一个链接丢给受害者点击,得配合页面自动提交,比如用一个HTML表单。下面这段报文,就是你提交恶意输入时Burp里看到的样子:
http复制POST /pikachu/vul/xss/xss_post.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
message=%3Cscript%3Ealert(1)%3C%2Fscript%3E&submit=submit
后面所有操作,本质上都是在改body里的message字段。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备阶段最容易翻车的几个点
2.1 pikachu靶场下载和运行环境的选择
pikachu是PHP写的,所以需要一个LAMP或者Windows下的集成环境。源码一般从官方仓库下载压缩包,解压后放到Web根目录。我自己试下来,用phpstudy的Apache+PHP 7.x+MySQL 5.7最省事,因为老教程里常见的PHP 5.x虽然能跑,但某些函数在新版本里已经有兼容性问题。如果你下载的版本比较新,务必确认PHP版本不低于7.0,否则数据库连接和部分错误提示可能不按预期走。
