理论知识:
https://portswigger.net/web-security/deserialization
Lab: Modifying serialized objects——实验室:修改序列化对象
原理:
基于序列化的会话机制:实验室使用了序列化的对象来存储用户的会话信息。这些对象通常包含用户的身份和权限等信息。
序列化对象:在 PHP 中,可以使用 serialize()
函数将对象转换为字符串表示形式,方便存储和传输。反过来,unserialize()
函数可以将字符串还原为原始对象。
漏洞点:实验中,序列化对象包含了用户的权限信息(例如 admin
属性)。攻击者可以通过修改序列化对象的内容(如将 admin
属性从 b:0
更改为 b:1
),来伪造管理员权限。
实验记录:
登录用户
dashboard发现反序列化漏洞
将cookie处base64解码后,修改s:5:”admin”;b:1;
对比可发现存在admin panel
/admin/delete?username=carlos修改请求路径发包
总结:
改个参数而已
Lab: Modifying serialized data types——实验室:修改序列化数据类型
原理:
在 PHP 7.x 及更早版本中,PHP 对不同类型的数据进行比较时有特殊的行为。当进行比较时,PHP 会将字符串 "0"
和整数 0
视为相等(即 "0" == 0
为 true
),这可能被用来绕过身份验证机制。
实验记录:
登录
将username改为administrator,access_token改为int类型且为0,修改id为administrator重新发包
可以看到admin panel,修改请求路径为/admin/delete?username=carlos
总结:
根据php版本的特性导致的判断绕过
Lab: Using application functionality to exploit insecure deserialization——实验室:使用应用程序功能来利用不安全的反序列化
原理:
反序列化后的对象包含一个 avatar_link
属性,指向用户的头像文件路径。攻击者可以通过修改这个属性,指向系统上的其他文件(例如,卡洛斯的 morale.txt
文件)。
实验记录:
登录,发现存在一个头像上传功能(可以不用上传内容),功能点是思路是:账户存在,然后用户可以上传图片,图片被保存,下面一个delete account功能,删除用户后,服务器将用户上传的图片删除,我们通过删除用户功能抓包修改图片的地址即可
删除/home/carlos/morale.txt
总结:
需要对系统功能进行理解,删除用户的同时删除头像,将头像路径替换即可删除其他文件
Lab: Arbitrary object injection in PHP——实验室:PHP 中的任意对象注入
原理:
利用编辑器生成的备份文件(通过在文件名后加 ~),读取源代码 /libs/CustomTemplate.php。 发现 CustomTemplate 类包含 __destruct() 方法,调用了 unlink(),删除了由 $lock_file_path 属性指定的文件。根据 PHP 序列化语法构造对象,使 $lock_file_path
指向目标文件 /home/carlos/morale.txt
实验记录:
登录后查看源代码发现引用文件
通过在文件名后附加波形符(~
)来读取源代码
本来想展示一下高端操作,结果还要考虑绕过什么的,不会。遂放弃
根据上面生成的序列化内容改写为如下的payload
O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}
放到cookie中发包即可,反序列化的结果为lock_file_path
文件路径为/home/carlos/morale.txt
,
总结:
按照我浅薄的理解,__destruct()
方法会在对象销毁时自动执行,而内容为检测锁文件是否存在以及删除锁文件,这段代码的含义为在修改模板文件时创建一个锁文件.lock,当修改完毕后删除锁文件。我们将序列化的内容中锁文件的路径指定为其他文件路径,当其进行反序列化时,触发__destruct()
方法,被指定的路径文件将被删除