Bootstrap

Pikachu靶场实录(完):从越权到SSRF深度解析

一.越权

在越权前先铺垫一下前置知识

什么是越权:
越权是干了别人才能干的事
比如修改别人用户名
重置别人密码
用别人的身份干自己身份干不了的事就叫越权

越权适用哪些场景:
通常,越权漏洞出现在需要登录的页面,特别是数据的增、删、改、查操作时。后台应校验当前用户的权限是否允许执行操作。如果校验规则过于简单,就可能导致越权。

为避免越权,需遵循以下原则:

  1. 最小权限原则:只赋予用户必要的权限。
  2. 严格校验规则:使用合理且严谨的权限校验逻辑。
  3. 后台登录态校验:以服务器端登录状态为准,而非依赖前端传入的条件。

1.1水平越权

什么是水平越权
水平越权是指用户A可以访问或操作与自己同级别的其他用户(如用户B)的数据
但A没有访问B数据的权限。

例如两个普通用户本应只能访问自己的订单
但由于权限校验不当
用户A能看到用户B的订单信息
这就是水平越权。

回到关卡
这里根据提示的用户信息登录一个账号
在这里插入图片描述
在这里插入图片描述查看一下个人信息
在这里插入图片描述这里因为是同权限
则尝试在URL中修改IDusername参数
观察是否能水平越权访问其他用户的信息
在这里插入图片描述可以看到修改ID后成功越权访问Lucy账号
在这里插入图片描述

1.2垂直越权

前置知识铺垫
什么是垂直越权

垂直越权就像你本来只能看你自己的工资单 却通过某种漏洞看到了老板的工资单 甚至能修改他的银行卡号。

简单来说,就是权限低的人,做了权限高的人才能做的事,这就是垂直越权。

什么是鉴权:
鉴权是根据鉴权字段验证我们在系统中的一种身份

有哪些常见的鉴权字段:

cookie
Authorization
Token
X-API-Key
Api-Key
X-Auth-Token
X-Session-ID

回到关卡
这里根据提示发现有管理员账密和普通用户账密
在这里插入图片描述这里登录两个账号
比较一下页面的差异
这时admin管理员页面
在这里插入图片描述
这是普通用户页面
在这里插入图片描述可以看到管理员多出添加用户功能和删除用户功能
在这里插入图片描述尝试使用普通用户使用管理员的功能
这里在管理员添加用户时抓个包发到重放器
在这里插入图片描述可以看到这里有一处管理员鉴权字段cookie
在这里插入图片描述这时我们先drop掉该包
不添加此用户
在这里插入图片描述
为了拿到普通用户的鉴权字段
我们在登录普通用户账号时抓包
复制这里的鉴权字段
替换掉刚才发到重放器里包中的cookie
在这里插入图片描述
此时的请求包是由低权限的鉴权字段和高权限的添加用户功能组成的

在这里插入图片描述
发个包
发现我们成功使用普通用户执行了管理员添加用户的功能
判断存在垂直越权
在这里插入图片描述

这里还有一种方法

我们来到管理员的后台管理中心页面
发现URL路径多出一个文件
猜测是功能是添加用户
在这里插入图片描述
这里直接复制该路径
拼接到普通用户界面的URL里
发现普通用户也能越权进入后台管理中心了
在这里插入图片描述
这里随便添加个用户
在这里插入图片描述
成功利用垂直越权添加用户
在这里插入图片描述

二.目录遍历

什么是目录遍历

原理:

  1. 灵活的文件访问: 为了使前端功能更灵活,会将要访问的文件路径定义为变量,由前端传递给后端。
  2. 安全风险: 如果后端没有对前端传来的文件路径进行严格的安全检查,攻击者可能通过类似../这样的路径操作符,访问到服务器上其他目录的文件。
  3. 漏洞形成: 这会导致服务器上的文件结构被泄露,形成目录遍历漏洞。

本质与关联:

目录遍历漏洞与不安全的文件下载、文件包含漏洞的原因类似,都源于将文件路径作为变量,且缺乏安全校验。
只是它们在实际场景中呈现出的现象有所不同,因此单独定义。

区分敏感信息泄露

  • 目录遍历: 通过可控的参数(如 ../),访问服务器其他目录的文件。
  • 敏感信息泄露: 直接通过 URL(如 http://xxxx/doc )列出特定文件夹中的所有文件,不涉及参数控制。

简单来说,目录遍历是利用参数的路径操作,而敏感信息泄露是直接暴露目录内容

来到关卡
这里有两个链接
随便点击一下
在这里插入图片描述
URL中出现title参数
猜测这里没有对传进的参数进行过滤
拼接如下路径尝试访问系统配置文件

..\..\..\..\..\..\windows\system32\drivers\etc\hosts

成功访问
在这里插入图片描述这里继续尝试拼接如下路径访问文件

..\dir.php

成功利用该参数进入概述界面
在这里插入图片描述

三.敏感信息泄露

定义: 敏感信息泄露是指由于后台人员的疏忽或不当设计,导致本不应暴露给前端用户的数据被轻易访问。

常见形式:

  • 目录浏览: 通过访问 URL 下的目录,直接列出目录下的文件列表。
  • 错误信息暴露: 输入错误的 URL 参数后,报错信息中包含操作系统、中间件、开发语言的版本等敏感信息。
  • 前端源码泄露: 前端代码(HTML、CSS、JS)中包含后台登录地址、内网接口信息、账号密码等敏感信息。

防范措施:

  • 安全代码编写: 除了安全地编写代码外,还应注意对敏感信息进行合理处理。
  • 敏感信息保护: 避免将敏感信息直接写入前端代码或暴露在不必要的错误信息中。
  • 配置管理: 妥善管理服务器配置,防止目录浏览等问题发生。

来到关卡
这里用弱口令尝试无法登录
故通过检查查看前端源代码
在这里插入图片描述在这里插入图片描述

这里直接将账号密码贴在里面了hh
直接登录成功
在这里插入图片描述观察一下登录界面的URL
发现疑似登录的路径文件/abc.php
给他拷贝下来备用
在这里插入图片描述退出登录
尝试在登录框直接拼接路径
在这里插入图片描述
成功未授权登录

在这里插入图片描述

四.PHP反序列化

这里铺垫一下前置知识

什么是PHP的序列化和反序列化:
PHP序列化和反序列化
简单来说就是把PHP的数据结构(如对象、数组等)转换成字符串,以及把字符串还原成原来的数据结构的过程。

序列化 (serialize):
就像把复杂物品打包成易于运输的包裹。
serialize() 函数将PHP的复杂数据变成一段特殊的字符串
这个字符串包含了数据类型、长度和值等信息。
举个例子:
下面是一个对象的从创建到序列化的过程:

 class S{
        public $test="pikachu";
    }
    $s=new S(); //创建一个对象
    serialize($s); //把这个对象进行序列化

序列化后得到的结果是这个样子的:
O:1:"S":1:{s:4:"test";s:7:"pikachu";}

O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值

反序列化 (unserialize): 就像把包裹拆开,还原成原来的物品。unserialize() 函数把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
下面是反序列化过程:

$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
    echo $u->test; //得到的结果为pikachu

核心思想:

序列化是为了存储和传输,反序列化是为了还原和使用

序列化和反序列化本身没有问题
但是如果反序列化的内容是用户可以控制的
且后台不正当的使用了下面PHP中的魔法函数
就会导致安全问题

常见的魔法函数有:

  • __construct(): 当你创建一个新的“东西”(对象)时,它会自动运行
  • __destruct(): 当一个“东西”(对象)被销毁、不再使用时,它会自动运行
  • __toString(): 当一个对象被当作一个字符串使用,它会自动运行 (就像你想具体描述一个东西时)。
  • __sleep():在对象被打包(序列化)之前自动运行
  • (就像收拾行李前会整理下物品。)
  • __wakeup(): 在对象被拆包(反序列化)之后自动运行
  • (就像打开行李后要看看东西还在不在)

漏洞示例:

假设我们有这样一个“东西”(类)叫做 S

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

这个 S 有一个属性 test,默认值是 “pikachu”。
并且它有一个 __destruct() 魔法函数
S这个“东西”被扔掉不用时
会自动把 test 的值显示出来。

然后,有这样一段代码:

$s = $_GET['test']; // 从用户那里接收一个叫 'test' 的字符串
@$unser = unserialize($s); // 把用户给的字符串当成打包好的东西,尝试拆包还原

这段代码接收用户通过网址传来的 test 参数,然后用 unserialize() 函数进行拆包。

攻击者可以这样做:

攻击者可以构造一个恶意的“包裹”(序列化字符串payload):

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

这个“包裹”的意思是:

  • 创建一个 S 这种类型的“东西”。
  • Stest 属性的值,改成 <script>alert('xss')</script> (这是一段恶意代码,会弹出一个警告窗口)。

当这段恶意字符串被 unserialize() 函数“拆包”后,就会:

  1. 创建一个 S 对象。
  2. Stest 属性的值改成了 <script>alert('xss')</script>
  3. 重点是
    因为 unserialize() 后的对象会被销毁
    所以销毁时自动触发了 __destruct() 魔法函数。
  4. __destruct() 魔法函数会执行 echo $this->test,也就是把 <script>alert('xss')</script> 输出到页面上。
  5. 浏览器看到这段恶意代码,就会执行,弹出警告窗口。

回到关卡
在这里可以看到输入框接收序列化数据
在这里插入图片描述

根据上面的流程可以构建执行某段恶意PHP代码生成payload

<?php
 class S{
     var $test = "你的网站被黑了hh";
 }
 $a= new S();
 echo serialize($a);
 ?>

得到如下payload

O:1:"S":1:{s:4:"test";s:23:"你的网站被黑了hh";}

将payload放入框里
成功在网页中输出字符串
在这里插入图片描述我们还可以尝试扩大危害
将代码调整一下生成如下payload

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

输入后造成XSS
在这里插入图片描述继续利用
生成如下Payload

O:1:"S":1:{s:4:"test";s:63:"<script>window.location.replace('http://www.4399.com')</script>";}

成功跳转页面
在这里插入图片描述

五.XXE

这里铺垫一下概念

什么是XML
XML 是一种用来描述数据的标记语言,就像 HTML 描述网页一样。
它使用标签(比如 <note>、<x>)来组织数据。

什么是外部实体
在 XML 里,外部实体就是说这个数据不是直接写在 XML 文件里的而是放在别的地方
(比如电脑上的一个文件,或者网上的一个网址)。

“XXE” – “XML External Entity Injection”
“既’xml外部实体注入漏洞’。”

  • 简单来说就是: “通过XML里指向外部资源的’占位符’来造成漏洞”

  • 这里的漏洞指的是:
    程序在处理XML数据时
    没有做好安全检查,导致可以被利用的漏洞。”

  • 攻击者干了啥?
    攻击者往服务器发送一段“精心构造”的XML数据
    这段数据里包含了“外部实体”的占位符
    并且这个占位符指向了攻击者想要的目标
    (比如服务器上的某个敏感文件)。
  • 服务器干了啥?
    服务器接收到这段XML数据后
    没有仔细检查
    直接按部就班地解析执行了
    包括解析了那个“外部实体”的占位符
    于是就去读取了攻击者指定的文件。
  • 结果是啥? 攻击者就成功读取了服务器上的文件,或者执行了其他恶意操作,这就是漏洞导致的“问题”。

举个简单的例子:

假设你开了一家外卖店
客户用XML格式给你发订单。
正常情况下
订单里会写清楚要买什么菜。

  • 正常订单(安全的):
    <order>
      <item>红烧肉</item>
      <quantity>2</quantity>
    </order>
    
  • 攻击订单(有漏洞的):
    <order>
      <item>
         <!ENTITY xxe SYSTEM "file:///etc/passwd" >
         &xxe;
      </item>
    </order>
    

这里攻击者在订单里加了一个“外部实体”xxe
它指向了服务器上的一个文件 /etc/passwd
(这个文件里包含了系统的用户信息)。

如果你的外卖系统没有做好检查,就直接按照订单处理
那么就可能把 /etc/passwd 文件的内容读出来
然后返回给攻击者。

回到关卡
可以看到这里可以接收xml数据
在这里插入图片描述
先使用如下payload测一下漏洞是否存在

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE greeting [
    <!ENTITY user "Hacker">
]>
<message>Hello, &user;!</message>

很好
可以成功解析
在这里插入图片描述接下来看看能不能修改代码访问敏感文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE doc [
  <!ENTITY file SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">
]>
<message>&file;</message>

成功访问本地host文件
在这里插入图片描述

六.URL重定向

简短的解释一下概念

简单来说
如果网站后端直接使用用户提供的URL进行跳转
(比如参数或前端页面中预设的URL)
而没有进行安全校验
就会导致“跳错对象”的问题。

其直接危害是钓鱼
攻击者利用漏洞网站的域名作为幌子诱导用户点击链接。
(通常是知名网站)
但实际链接指向的是攻击者精心伪造的钓鱼网站
目的是窃取用户的敏感信息或进行其他恶意活动。

这里有四个链接
都点点看
发现第四个链接的URL有可能存在隐患的参数?url=
在这里插入图片描述构造一下路径让他尝试重定向到别的地方
在这里插入图片描述在这里插入图片描述
成功跳转

七.SSRF

解释一下概念

啥是SSRF?
就好比你让服务员(服务器)去隔壁店(目标地址)买东西。
如果你没有严格规定目标店铺
他就可以去任意的地方购买。

如何利用
攻击者就钻了这个空子
给服务员一个非法地址
比如“内部地址”或“其他网站”。
然后服务员就乖乖去请求 把东西(数据)带回来了。

数据咋走的?

攻击者 -> 你家服务员(服务器)-> 非法地址

PHP里的“跑腿”函数

  • file_get_contents(): 最简单直接的“跑腿”。它直接读取本地文件或远程URL的内容,并返回一个字符串。它适用于获取静态文件,如文本文件、图片、或简单的网页。

  • curl_exec(): 功能更强大的“跑腿”。它通过 cURL 库执行更复杂的网络请求,例如 GET, POST, 可以设置请求头、超时时间、进行身份验证等。

  • fsockopen(): 更底层的“跑腿”。它直接打开一个网络连接(socket),允许你直接与服务器进行 TCP 通信。 它可以用于更底层的网络交互,比如发送自定义协议请求、建立长连接等。

四种在服务器端请求伪造 (SSRF) 漏洞中可能被利用的协议

  1. HTTP(s): 最常见的网络协议,不仅用于网页浏览,在SSRF中可以被用来探测目标服务器的端口和服务
  2. file: 本地文件访问协议,在SSRF中允许攻击者读取服务器本地的任意文件,可能暴露敏感信息。
  3. dict: 字典协议,基于TCP,默认端口2628。在SSRF中,可以探测内网端口,并可能通过精心构造的请求攻击内网应用
  4. gopher: 一种古老的分布式文件检索协议,比HTTP早。在SSRF中,可以攻击内网应用,甚至实现反弹shell(让目标服务器主动连接到攻击者控制的服务器)。

如何防止漏洞出现?
如果要让服务器去其他地方拿数据 一定要看好地址!
只允许访问特定地址,其他地址都拦住

7.1SSRF(cURL)

本固安
这里点击链接后观察一下URL
在这里插入图片描述在这里插入图片描述
发现php?url=可能存在未过滤传入地址的情况
拼接一下其他服务器的路径
成功跳转到其他地方
在这里插入图片描述此处除了https协议可以利用
我们还可以尝试file协议
拼接如下paylaod

file:///C:/Windows/System32/drivers/etc/hosts

在这里插入图片描述
成功访问host文件

7.2SSRF(file_get_content)

关卡点击链接后观察一下URL
发现使用了file参数
在这里插入图片描述这时使用上一关的URL跳转发现行不通
猜测源码不使用curl()函数
而是使用了file_get_content函数
故继续拼接file协议尝试

file:///C:/Windows/System32/drivers/etc/hosts

成功读取文件
在这里插入图片描述
这里还可以尝试使用PHP协议读取服务器其他文件夹的文件
拼接如下payload

php://filter/read=convert.URL-encode/resource=../unsafedownload/password.txt

成功回显到页面上
在这里插入图片描述base64解码即可
在这里插入图片描述

免责声明:

本文章内容仅为个人见解与实践记录,旨在分享网络安全知识。文中观点、工具、技巧等,均不构成专业建议。读者需自行判断其适用性,并对任何因采纳本文章内容而引发的行为及结果承担全部责任。作者不对任何形式的损失负责。请务必谨慎操作,必要时咨询专业人士。

;