我爱换客网红队成长之路
← 返回路线图 登录
靶场实战 · 开工准备

开工准备:环境 + 工具

零基础友好 · 概念扫盲 + PHPStudy 搭建 + Burp/蚁剑 · 约 2 小时开工
📚 靶场目录 开始第 1 关 → 📋 打卡表

先建立一个整体画面。你在浏览器输入网址、按下回车,一秒后页面出现。这一秒里发生了什么?

你的浏览器(客户端)         网站服务器           数据库
      │                         │                  │
      │ ①发送请求"给我首页" ───→│                  │
      │                         │ ②向数据库要数据 →│
      │                         │ ←③返回数据       │
      │ ←④返回网页 HTML ────────│                  │
      │                         │                  │
      │ ⑤浏览器把 HTML 渲染成你看到的页面

三个角色的生活类比——点外卖:

记住一个关键事实:你浏览器里看到的网页,本质上都是服务器发给你的一串文本(HTML 代码),浏览器把它"翻译"成了好看的页面。你随时可以看这串文本——按 F12 或右键"查看网页源代码"。攻击者能"看见"的东西,和你能看见的完全一样:网页上的一切对所有人都是公开的,包括 HTML 注释、隐藏字段、JS 代码。第 3.11 关(敏感信息泄露)学的就是这个道理。

0.2IP 地址、localhost、端口

IP 地址 = 电脑在网络上的"门牌号"。形如 192.168.1.100。每个联网设备都有一个。

端口 = 同一栋楼(同一个 IP)里的"房间号"。服务器上可以同时跑很多服务,靠端口区分:

端口常见用途
80网站默认端口(HTTP)
443加密网站(HTTPS)
8080备用网站端口、代理工具常用
3306MySQL 数据库

网址里没写端口时,默认访问 80。所以 http://127.0.0.1/pikachu/ 实际是 http://127.0.0.1:80/pikachu/。如果 PHPStudy 里 Apache 端口改成 8080,就要写 http://127.0.0.1:8080/pikachu/——这就是排障表里那条"端口 80 被占用"的由来。

0.3文件路径与"目录穿越"

文件路径 = 文件在电脑里的位置。Windows 用反斜杠 \,形如:

D:\phpstudy_pro\WWW\pikachu\index.php
│                │            └── 文件名
│                └── 网站根目录(放网页的地方)
└── 盘符(D 盘)

相对路径 = 不写盘符、从"当前位置"出发的路径。两个特殊符号:

举例:你站在 D:\phpstudy_pro\WWW\pikachu\vul\fileinclude\ 这个目录里(Pikachu 的"文件包含"关卡就站在这):

"目录穿越"攻击就是利用这一点:网站的"读取文件"功能如果不检查,你传 ..\..\..\..\windows\win.ini,网站就一路往上爬出网站目录,读到了 Windows 系统自己的配置文件。后面文件包含(3.6)、文件下载(3.8)、目录遍历(3.10)三个模块全是这个套路。多写几个 .. 不会出错——已经到根目录了再多写也没事,所以教程里的 payload 常写 4 个 .. 保险。

Linux/macOS 系统用正斜杠 /,根目录就是 /,系统账号文件是 /etc/passwd。所以同样一道"读系统文件"的题,Windows 同学读 c:\windows\win.ini,Mac 同学读 /etc/passwd。两种写法在相应关卡都会给出。

0.4HTTP 请求与响应:浏览器和服务器怎么说话

浏览器和服务器之间只靠"请求-响应"对话,这种对话规则叫 HTTP 协议。一次网页访问 = 浏览器发一个"请求"、服务器回一个"响应":

请求(Request):浏览器发给服务器的话
POST /pikachu/vul/burteforce/bf_form.php HTTP/1.1   ← 第一行:方式 + 路径 + 协议版本
Host: 127.0.0.1                                     ← 请求头:发给哪台主机
User-Agent: Mozilla/5.0 ...                         ← 请求头:我的浏览器型号
Cookie: PHPSESSID=xxxxxxxx                          ← 请求头:我的身份凭证(见 0.5)
Content-Type: application/x-www-form-urlencoded     ← 请求头:请求体的格式

username=admin&password=123456&submit=Login         ← 请求体(POST 的数据放在这)

响应(Response):服务器的回答
HTTP/1.1 200 OK                                     ← 状态码 200 = 一切正常
Set-Cookie: PHPSESSID=yyyyyyyy                      ← 响应头:服务器发来"号码牌"
Content-Type: text/html                             ← 响应头:下面内容是 HTML

<html>...页面内容...</html>                          ← 响应体(真正的网页内容)

两个必须分清的概念:GET 和 POST

GETPOST
数据在哪URL 里(?id=1)请求体里(表单提交)
生活类比明信片(内容写在地址栏,谁都能看见)密封信(内容在信封里)
你能直接改吗能,直接改地址栏不能,要用 Burp 改

状态码 = 服务器回答的"第一句话",常见四个:

只要记住三件事:

  1. GET 参数在 URL 里,POST 参数在请求体里
  2. Cookie 是"号码牌",浏览器每次自动带着(下一节细讲)
  3. 改请求才能测漏洞:地址栏只能改 GET 参数;改 POST 参数、改请求头,都要靠 Burp(见 2.2)

HTTP 请求与响应

0.5Cookie 与 Session:为什么"偷到 Cookie ≈ 偷到账号"

问题:HTTP 协议本身是"无记忆"的——服务器每次收到请求都不知道你是谁。那"已登录"状态是怎么保持的?

答案:用"号码牌"机制,生活类比——银行取号:

  1. 你去银行办业务,出示身份证(账号密码)→ 柜员验证后发你一张排队小票,上面有号码
  2. 之后每次走到窗口,出示小票即可,不用再掏身份证
  3. 小票丢了被别人捡到 → 别人拿你的小票也能办你的业务

对应到网站:

所以:

0.6网页三件套:HTML / CSS / JavaScript

网页 = 三样东西的组合。生活类比——盖房子:

技术角色类比
HTML结构毛坯房:墙、门、窗在哪
CSS样式装修:颜色、大小、布局
JavaScript(JS)行为电路和机关:点按钮弹窗、提交表单

XSS 模块(3.2)主要和 HTML、JS 打交道,你需要懂几个概念:

标签:HTML 用尖括号标签描述内容。<script>代码</script> 表示"这是一段 JS 代码,浏览器请执行它";<img src=图片地址> 表示"显示一张图片"。

属性:标签的附加说明。<img src=x onerror=alert(1)> 里的 onerror 就是一个属性,意思是"如果图片加载失败,就执行后面的 JS 代码 alert(1)"。攻击者故意给一个不存在的图片地址 src=x,让加载必然失败,从而触发 onerror 里的代码——这就是 XSS 最常用的 payload 形式。

JS 能干什么:弹窗(alert(1))、读当前网站的 Cookie(document.cookie)、跳转页面等。XSS 的本质就是让受害者浏览器执行攻击者的 JS。

事件:用户在页面上的动作(点击、鼠标移入、图片加载失败)都叫事件,HTML 用 onXXX 属性绑定 JS 代码。常见攻击面:onerror、onload、onclick。

为什么要 URL 编码:URL 里有些字符有特殊含义,直接写会被浏览器处理掉。比如 < 要写成 %3C、> 写成 %3E、空格写成 %20。你在地址栏输入 payload 没反应时,很可能是特殊字符没编码——这也是为什么教程里推荐在 Burp 里改参数(Burp 里写原文即可,它帮你处理)。

0.7数据库与 SQL 十分钟入门

数据库 = 存数据的仓库,组织成"表"。生活类比——Excel 表格:

SQL = 操作数据库的"命令语言"。数据库不像 Excel 靠鼠标点,而是靠命令查。本手册 SQL 注入模块(3.4)用到的语法就这几条,十分钟掌握:

-- 查数据:从 member 表查所有列,条件是 id 等于 1
select * from member where id=1;

-- 条件组合:and(并且)、or(或者)
-- or 1=1 是"或者 1 等于 1"——1=1 永远成立,所以整个条件永远成立 → 查出所有行!
select * from member where id=1 or 1=1;

-- 注释:-- 或 # 后面的内容被数据库忽略("干掉后面的代码"就用它)
select * from member where id=1;  -- 我是注释,不执行

-- union:把两条查询结果拼在一起
select id from member where id=1 union select 1,2,3;

SQL 注入的本质:网站程序把用户输入直接拼进 SQL 语句。你输入的内容本来应该是"数据",却因为拼接,变成了"代码的一部分"。生活类比——餐厅点菜:

服务员问"您点什么菜?" 正常情况下你回答"宫保鸡丁"。但如果你回答:"宫保鸡丁,顺便把菜单上所有菜都上一遍",服务员一字不差地把这句话报给厨房,厨房真的把所有菜全做了——因为服务员没有区分"点菜内容"和"额外指令"。

网站程序就是那个"一字不差转述的服务员",攻击者就是那个"在点菜里夹带指令的顾客"。防御(参数化查询)就是让服务员把你说的话只当菜名,绝不执行其中的指令。

0.8常用术语速查表

术语一句话解释
靶场专门用来练习攻击的"沙盒"网站,打坏了也没关系(Pikachu 就是靶场)
漏洞程序里能被攻击者利用的缺陷
payload攻击者构造的那段"带毒输入"(比如 <script>alert(1)</script>)
注入点用户输入能进入 SQL/命令/HTML 的位置
编码把字符换一种写法,绕过过滤(< 写成 %3C)
webshell传到服务器上的"遥控器"脚本,执行它就能远程控制服务器
一句话木马只有一行代码的 webshell:<?php @eval($_POST['cmd']); ?>
蚁剑(AntSword)连接一句话木马的图形化工具(3.7 文件上传关用)
抓包用工具(Burp)拦截并查看浏览器和服务器之间的请求
重放把抓到的请求原样再发一次(Burp 的 Repeater 功能)
爆破用字典自动尝试大量密码(Burp 的 Intruder 功能)
白盒 / 黑盒看得见源码测试 / 看不见源码盲测(靶场练习都是白盒,源码全给你看)
提权从低权限用户变成管理员
目标:把靶场跑起来。跟着做,每步做完有"验证动作",看到验证动作里的现象才说明做对了,再进下一步。

1.1Windows + PHPStudy 部署(每一步都带你点)

步骤 1:安装 PHPStudy(小皮面板)

  1. 浏览器打开官网 https://www.xp.cn,点击下载 Windows 版 phpStudy V8.1(软件全名"小皮面板")
  2. 双击安装包,安装路径建议全英文且无空格,例如 D:\phpstudy_pro。注意:不要装到含中文的路径(如 D:\软件\),否则后面容易出奇怪问题
  3. 安装完启动面板

验证动作:面板主界面能看到 Apache 和 MySQL 两个服务条目(可能显示"未启动",没关系,先看到它们)。

步骤 2:安装 PHP 5.6 版本(关键步骤,很多人卡在这)

先解释为什么:Pikachu 是很多年前用 PHP 老语法写的,用了 mysql_connect() 等旧函数。PHP 7 以上删掉了这些函数,直接跑会报:

Fatal error: Uncaught Error: Call to undefined function mysql_connect()

所以必须用 PHP 5.x。操作:

  1. phpStudy 面板左侧找 软件管理(或"环境")→ 找到 PHP 5.6 → 点安装(如果列表里没有 5.6,找 5.4 也行)
  2. 装好后回到主界面:点 Apache 旁边的设置 → PHP 版本 → 选择 php 5.6(不同版本面板菜单名略有差异,找不到就点 Apache 那一行到处看看,宗旨就是"给 Apache 换一个 5.6 的解释器")
  3. 启动 MySQL(MySQL 版本随意,5.7 即可)

验证动作:主界面 Apache 和 MySQL 都是绿色"已启动"状态;Apache 那一行显示的 PHP 版本是 5.6.x。

步骤 3:部署 Pikachu 源码

  1. 获取源码:GitHub 地址 https://github.com/zhuifengshaonianhanlu/pikachu,点绿色 Code → Download ZIP 下载(如果网络访问 GitHub 困难,找老师要提前下载好的 zip 包)
  2. 解压 zip,得到一个 pikachu-master 文件夹,把它重命名为 pikachu
  3. 把整个 pikachu 文件夹放进网站根目录:D:\phpstudy_pro\WWW\

验证动作:确认文件 D:\phpstudy_pro\WWW\pikachu\index.php 存在。打开 pikachu 文件夹应该能看到 index.php、inc、vul 等一堆文件和文件夹。

步骤 4:配置 php.ini(为后面"远程文件包含"关卡做准备)

  1. phpStudy 面板 → 网站 → 管理 → 打开 php.ini(找不到就点"设置 → 配置文件 → php.ini")
  2. 用记事本搜索 allow_url_fopen 和 allow_url_include,把等号右边都改成 On:
allow_url_fopen = On
allow_url_include = On
  1. 保存文件 → 回面板重启 Apache(点 Apache 后面的"重启"按钮)

验证动作:面板 Apache 重启后仍显示绿色"已启动"。(这一步不做的话,第 3.6.2 关"远程文件包含"永远打不通——到时候再来配也行,但提前配好省事。)

步骤 5:访问并初始化靶场

  1. 浏览器打开 http://127.0.0.1/pikachu/
  2. 首次访问会自动进入"安装/初始化"页面,点击 安装/初始化 按钮
  3. 出现绿色提示"创建数据库成功"即完成(程序自动建了名为 pikachu 的库和若干表)
  4. 回到首页,顶部应有一排导航:暴力破解 / Cross-Site Scripting / CSRF / Sql-Inject / RCE / File Inclusion / 文件上传 / 越权漏洞 ……

验证动作:看到顶部完整导航栏 + 左侧是黄色皮肤样式。点导航里的"暴力破解"能进入模块页面,说明部署成功。

📷 练习截图:靶场首页(顶部完整导航栏)】【练习截图:初始化成功提示页

1.2Mac 同学部署方案

方案 A(推荐):PHPStudy Mac 版,与 Windows 同学体验一致

  1. 官网 https://www.xp.cn 下载 macOS 版小皮面板
  2. 启动后在面板里安装 Apache + MySQL + PHP 5.6(Mac 版同样支持多 PHP 版本切换)
  3. 网站根目录默认在 ~/phpstudy/www(面板里可查),把 pikachu 文件夹放进去
  4. php.ini 同样开启 allow_url_include = On,重启 Apache
  5. 访问 http://127.0.0.1/pikachu/ 初始化

方案 B(备选):Docker 一键起环境

装了 Docker Desktop 的话,可用容器:

docker run -d --name pikachu-php -p 8080:80 -v "$HOME/Desktop/pikachu:/var/www/html" php:5.6-apache
docker run -d --name pikachu-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7

容器网络要互通(同一自定义 network),适合对 Docker 熟悉的同学。

平台差异提示:部分关卡读取系统文件时路径不同—— - Windows:c:\windows\win.ini - macOS / Linux:/etc/passwd 练习时按自己的系统选对应的 payload,两种写法在相应关卡都会给出。

1.3靶场账号体系(建议记下来,练习中经常用到)

账号密码角色用在哪
admin123456管理员暴力破解、XSS 盲打后台、http header 注入等需登录关卡
pikachu000000普通用户垂直越权演示(低权限账号)
testtest测试账号备用
vince / allen / kobe / grady / kevin / lucy / lili均为 123456普通用户组CSRF、水平越权等需要"多账号"的关卡

1.4常见故障排查表(出问题先查这里)

现象原因解决
打开 127.0.0.1 显示 Apache 默认页pikachu 没放对目录确认路径 WWW\pikachu\index.php 存在
打开 127.0.0.1 显示"无法访问"Apache 没启动面板启动 Apache
报 mysql_connect undefinedPHP 版本 ≥7切回 PHP 5.6/5.4 并重启 Apache
端口 80 被占用(Apache 启动失败)迅雷/QQ/IIS/系统服务占 80面板把 Apache 端口改成 8080,访问 http://127.0.0.1:8080/pikachu
初始化时报数据库连接失败MySQL 没启动面板启动 MySQL
远程文件包含关卡没反应allow_url_include 没开php.ini 改 On 并重启 Apache
文件上传关上传失败upload 目录不可写检查 pikachu\pkxss\ 下 upload 目录权限(Windows 一般没问题,Mac/Linux 需 chmod -R 777 upload)
时间盲注 sleep 不生效PHP 脚本超时过短默认 30s 足够,确认 MySQL 正常即可
登录页验证码不显示PHP GD 扩展未开php.ini 开启 extension=gd
页面提示"数据库连接失败"但 MySQL 是绿的端口/密码配置不对检查 inc/config.inc.php 里的数据库配置
四样工具:浏览器 F12(内置免费)、Burp Suite(抓包改包,免费社区版)、中国蚁剑(文件上传关用)、Python(token 关脚本用)。每样都配了"第一个练习",做完即会。

2.1浏览器 F12 开发者工具(每关练习都会用)

任何网页按 F12(Mac 是 Command+Option+I)打开开发者工具,四个常用面板:

面板用途你会怎么用它
Elements看/改网页源代码改 input 的 maxlength 限制(3.2.1 关)、找注释里的隐藏信息(3.11 关)
Console执行 JS、看报错输入 alert(1) 弹窗——XSS 最基础原理
Network看每个请求的细节看请求方法、参数、Cookie、响应(点开一条请求看 Headers)
Application看/改 Cookie 和本地存储看自己的 PHPSESSID、手动改 Cookie

第一个练习(10 分钟):

  1. 打开百度,按 F12 → 切到 Network 面板 → 刷新页面
  2. 点开任意一条请求,找到它的请求方法(GET/POST)、状态码、有没有 Cookie
  3. 切到 Console 面板,输入 alert(1) 回车,观察弹窗——这就是 XSS 最基础的原理,后面整章 XSS 都在干这件事

2.2Burp Suite 从安装到第一次抓包

Burp 是什么:抓包工具。"抓包"=把浏览器和服务器之间来回的请求拦截下来,你可以看、改、重发。暴力破解(爆破)、SQL 注入改参数、CSRF 改包,全都靠它。它是零基础自学最重要的一件工具,这一节请完整做一遍。

2.2.1 下载安装

  1. 打开 https://portswigger.net/burp/communitydownload,下载 Community 社区版(免费够用)
  2. 双击安装,一路下一步。Burp 需要 Java 环境:如果启动报错"找不到 Java",先装 Java(搜索"Java 8 下载"或"JDK 17 下载"安装即可,社区版对版本要求不严)

2.2.2 第一次启动与界面认识

启动 Burp 后:

2.2.3 让浏览器的流量经过 Burp(关键步骤)

Burp 在 127.0.0.1:8080 开了个"检查站",要让浏览器把请求先送检查站,需要给浏览器设代理:

方法一(推荐):SwitchyOmega 插件

  1. Chrome/Edge 应用商店搜 SwitchyOmega 安装
  2. 新建情景模式 → 代理协议选 HTTP → 地址 127.0.0.1 端口 8080
  3. 工具栏点插件图标切换到这个情景模式(用完记得切回"直接连接",否则关掉 Burp 后浏览器上不了网)

方法二:系统代理

  1. Windows 设置 → 网络和 Internet → 代理 → 手动设置代理 → 地址 127.0.0.1 端口 8080 → 保存
  2. 用完记得关闭

2.2.4 第一个抓包实验

  1. 确认 Burp 里 Proxy → Intercept 是 On(按钮亮着,写着"Intercept is on")
  2. 浏览器打开 http://127.0.0.1/pikachu/
  3. 切回 Burp → Proxy → HTTP history 面板,看到一排请求记录

验证动作:history 里能看到 GET /pikachu/ 这条请求。点开它,你能看到请求头、响应内容——恭喜,抓包成功。此时浏览器页面可能"一直转圈":那是因为请求被 Burp 拦住了,去 Burp 点 Forward(放行)就好。

2.2.5 三个必会操作(每关反复用)

  1. 抓包改包:Intercept is on 状态下 → 浏览器操作 → Burp 里改参数 → Forward 放行
  2. 重放:Proxy → HTTP history 里右键某请求 → Send to Repeater → 切到 Repeater 标签 → 改参数 → 点 Send,反复看响应(测 XSS、SQL 注入全靠这个)
  3. 爆破:history 里右键请求 → Send to Intruder → 切到 Intruder 标签 → Positions 子标签里点 Clear §,然后选中要替换的参数值点 Add §(参数会被两个 § 夹住)→ 切到 Payloads 子标签粘贴字典 → 点右上角 Start attack(暴力破解模块的主角)
抓 HTTPS 网站(如百度)会报证书错误:浏览器访问 http://burp → 下载 CA 证书 → 浏览器设置里导入并信任。本靶场全是 HTTP,不装证书也能正常抓,可以先跳过。
📷 练习截图:Burp 代理监听设置】【练习截图:浏览器代理配置(SwitchyOmega)

2.3中国蚁剑(文件上传关用)

蚁剑是什么:图形化"遥控器"。当你在文件上传关把一句话木马传到服务器后,用蚁剑连接它,就能像操作自己电脑一样执行命令、看文件。

  1. 下载:https://github.com/AntSwordProject/antSword(Release 里下载 antSword.zip 加载器版本,另按页面说明下载核心源码 antSword-4.x.zip)
  2. 解压后首次启动会提示"初始化",选择刚才下载的核心源码 zip 即可
  3. 使用:右键"添加数据" → URL 填木马完整地址(如 http://127.0.0.1/pikachu/unsafeupload/uploads/evil.php)→ 连接密码填木马里 $_POST['cmd'] 的 cmd → 添加
  4. 双击连接 → 看到文件管理界面即成功,可开"虚拟终端"执行命令(输入 whoami)

验证动作:文件管理界面能看到服务器目录结构(你的 Windows 目录)。连不上先检查:URL 拼对没、木马文件上传成功没、PHP 版本是不是 5.6。

📷 练习截图:中国蚁剑连接成功界面(虚拟终端执行 whoami)

2.4Python 环境(token 关脚本用)

第 3.1.4 关"token 防爆破"需要一个 Python 脚本,先装好环境:

  1. 下载 Python 3:https://www.python.org/downloads/,安装时勾选 "Add Python to PATH"(关键,不勾装完没法在命令行用)
  2. 安装完成后打开 CMD(命令行),输入 python --version 回车

验证动作:显示 Python 3.x.x 版本号。

  1. 安装脚本要用的库(CMD 里输入):
pip install requests
  1. 跑脚本的方法:把脚本内容保存成 test.py 文件(用记事本,另存为时选"所有文件"再写 .py 后缀),在 CMD 里 cd 到文件所在目录,运行 python test.py。
注意:保存 .py 文件的路径不要有中文和空格,否则命令行可能找不到文件。
每关统一按「过关标准 → 类比故事 → 原理白话 → 看源码 → 详细步骤 → 卡住了 → 防御 → 想一想」八段式编写。先看"过关标准"知道终点,卡住先翻"卡住了"。全部关卡只在本地靶场练习,严禁对非授权系统测试。

我爱换客网 · 红队成长之路 | 靶场内容仅供本地环境学习,请勿对未授权目标使用 | 靶场目录