1.框架知识
#### 反序列化起点
1、__wakeup 一定会调用*;
2、__destruct 一定会调用;
3、__toString 当一个对象被反序列后又被当字符串使用。
#### 反序列化跳板
1、__toString 当一个对象被当做字符串使用;
2、__get 读取不可访问或不存在属性时被调用;
3、__set:当访问不可访问或不存在属性赋值时调用。
#### 反序列化终点
1、__call()调用不可访问或不存在的方法时被调用;
2、call_user_func() 一般PHP代码执行会选择这里;
3、call_user_func_array 一般PHP代码执行会选择这里。
#### 反序列化一般思路
注意:实际成品源码审计分析中,通过对版本的判断有无反序列化漏洞,确定后需要对利用条件做判断,利用条件主要有2个:
1、可控的文件,文件使用文件判断类函数操作(phar反序列化)
2、可控的变量,变量采用的unserialize去操作(反序列化)
#### 常用魔术方法
PHP常用的魔法函数:
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发
2.小迪跟链实例
https://paper.seebug.org/1040/
https://blog.csdn.net/qq_63701832/article/details/131406921
入门-任意文件删除
1.自己创建入口
public function unser()
{
//漏洞产生点
//如果在实际审计中发现类似代码就可以利用tp反序列化触发出rce
unserialize(base64_decode($_GET['id']));
return "Welcome!";
}
2.寻找魔术方法
搜索__wakeup( 关键字方法
__destruct(
3.开始跟链
1/thinkphp/library/think/process/pipes/Windows.php
public function __destruct()
{
$this->close();
$this->removeFiles();
}
private function removeFiles()
{
foreach ($this->files as $filename) {
if (file_exists($filename))
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)