Typecho-反序列化漏洞学习
Typecho-反序列化漏洞学习
0x00 前言
这里我下了1.0版本:
git clone https://github.com/typecho/typecho.git --branch v1.0-14.10.10-release
0x01 分析过程
这个漏洞非常有趣。首先是一个可控参数的反序列化表达式。然后构造pop链,寻找__destruct方法,然而没有找到可利用的。但是通过对反序列化后的变量跟踪发现,有对其当作字符串调用,因此寻找__toString方法。
这个程序一共就只有三个__toString,我自己找的时候只找到一个“类似SQL注入”的点,后来通过利用autoload机制(参考p牛的CSRF到任意代码执行)将那个类加载进来。后来又通过一顿分析发现,其只是返回一个SELECT语句的字符串,然后我就没再跟进了,说不定可以构造成一个反射xss(从反序列化到反射xss???)。
然后看了一下大佬的blog,大佬在另一处__toString中找到了一个方法调用:$item[..]->screenName。由于$item可控,因此这里可以使$item[..]为一个没有screenName属性的对象,当访问一个对象没有的属性时就会寻找它的__get方法!所以大佬这里就找了一个存在危险操作的__get方法的类。果然我还是太菜了,满脑子就只有__destruct和__wakeup。
跟进__get之后,经过一系列的调用,调用了同类下的某个filter方法,然后在里面进行了call_user_func,两个参数都可控,至此利用链分析完毕。
构建poc后发现页面返回了500错误,我们的phpinfo()并没有回显出来。经过调试发现,因为程序对反序列化之后的内容进行处理时抛出了异常,导致报了错。我们可以将程序提前exit,不经过后面的报错即可。
0x02 调试
首先看一下访问到漏洞点的前置条件

这里会对referer头做一个校验,refer中的host值需要与$_SERVER['HTTP_HOST']的值相等。
下面看一下漏洞点

这里需要传入一个finish参数,然后在230行将cookie中的__typecho_config的值通过base64解码之后反序列化。
再往下看两行到232行,这里将$config['adapter']作为第一个参数传入到Typecho_Db()中。$config就是反序列化传来的对象,因此这个参数也是我们可控的。我们跟进一下Typecho_Db()

跟进其构造方法之后发现,这里将我们传来的第一个参数做字符串拼接,如果第一个参数是对象的话,那么这里就会调用其__toString()方法。刚好,第一个参数是我们可控的。
通过寻找__toString方法,找到了一个Typecho_Feed类。


在第二张图中可以看到$item['author']->screenName。如果$item['author']是一个不能存在screenName属性的类的话,那么这里就会调用这个类的__get()魔术方法。刚好,这里的$item是我们可控的。因此下面就找哪些类没有screenName属性,并且__get方法存在危险操作。
最后找到了Typecho_Request类


可以看到$value是可控的。下面跟进一下_applyFilter方法

可以看到,这里有个call_user_func方法,且$filter和$value都可控。至此这条pop链基本是构造完了。
可是构造完payload发现页面响应500,我们的phpinfo()并没有回显出来。经过调试发现,因为程序对反序列化之后的内容进行处理时抛出了异常,导致报了错。如下。

可以看到这里首先抛出了一个Typecho_Db_Exception异常,跟进。


可以看到调用了ob_end_clean()清空了缓冲区。接着跟到self::error。


可以看到,这里配置了一些报错变量,并在最后输出到模板中,然后exit退出了程序。
暂时知道有两种方法来输出payload的结果:
1)提前exit程序,让程序不运行到抛出异常处
2)提前将缓冲区内容打印到页面上
对于1),这里有两种实现方法,第一种是seebug作者的方法,通过使程序运行出错自动exit,还有一种是直接简单粗暴地将exit放到我们的payload中。
对于2),我本想使用ob_end_flush()之类的方法,但是程序在调用时会传入一个参数,导致ob_end_flush()执行失败,因为这个方法是不接受参数的,所以对于第2)个方法,目前没找到出路。
所以这里我将exit放到payload中,成功提前退出,回显了phpinfo。

payload如下
<?php
class Typecho_Feed{
private $_type;
private $_items = array();
public function __construct(){
$this->_type = "RSS 2.0";
$this->_items = array(
array(
"title" => "test",
"link" => "test",
"data" => "20190430",
"author" => new Typecho_Request(),
),
);
}
}
class Typecho_Request{
private $_params = array();
private $_filter = array();
public function __construct(){
$this->_params = array(
"screenName" => "eval('phpinfo();exit;')",
);
$this->_filter = array("assert");
}
}
$a = new Typecho_Feed();
$c = array(
"adapter" => $a,
"prefix" => "test",
);
echo base64_encode(serialize($c));
0x03 总结
这个漏洞最精彩的部分就是通过调用__toString再来调用一层__get魔术方法,可惜自己没法把这些已有的点联系起来,还是多学习吧。
0xFF 参考
Typecho-反序列化漏洞学习的更多相关文章
- Typecho 反序列化漏洞 分析及复现
0x00 漏洞简介 CVE-2018-18753 漏洞概述: typecho 是一款非常简洁快速博客 CMS,前台 install.php 文件存在反序列化漏洞,通过构造的反序列化字符串注入可以执行任 ...
- Python 反序列化漏洞学习笔记
参考文章 一篇文章带你理解漏洞之 Python 反序列化漏洞 Python Pickle/CPickle 反序列化漏洞 Python反序列化安全问题 pickle反序列化初探 前言 上面看完,请忽略下 ...
- Typecho反序列化漏洞
Typecho Typecho是一款快速建博客的程序,外观简洁,应用广泛.这次的漏洞通过install.php安装程序页面的反序列化函数,造成了命令执行,Typecho 1.1(15.5.12)之前的 ...
- PHP反序列化漏洞学习
serialize:序列化 unserialize: 反序列化 简单解释: serialize 把一个对象转成字符串形式, 可以用于保存 unserialize 把serialize序列化后的字符串变 ...
- CVE-2018-2628 weblogic WLS反序列化漏洞--RCE学习笔记
weblogic WLS 反序列化漏洞学习 鸣谢 感谢POC和分析文档的作者-绿盟大佬=>liaoxinxi:感谢群内各位大佬及时传播了分析文档,我才有幸能看到. 漏洞简介 漏洞威胁:RCE-- ...
- Typecho反序列化导致前台 getshell 漏洞复现
Typecho反序列化导致前台 getshell 漏洞复现 漏洞描述: Typecho是一款快速建博客的程序,外观简洁,应用广泛.这次的漏洞通过install.php安装程序页面的反序列化函数,造成了 ...
- 通过WebGoat学习java反序列化漏洞
首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...
- PHP反序列化漏洞代码审计—学习资料
1.什么是序列化 A.PHP网站的定义: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值. ...
- 学习笔记 | java反序列化漏洞分析
java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...
- 五个demo案例带你学习PHP反序列化漏洞
一直想研究下php反序列化漏洞,花了几天时间做了个简单的了解..写篇文章记录下. 直白点就是围绕着serialize和unserialize两个函数. 一个用于序列化,一个用于反序列化. 我们通常把字 ...
随机推荐
- 大自然的搬运工:Ubuntu环境下gedit的一些个简单配置
gedit是Ubuntu默认的文本编辑器,个人觉得还是不错的,用它来编程写一些小的demo也很方便,原谅我比较菜,vim用起来感觉打字速度真的很慢呀. 下面对gedit做一些简单配置,方便编程. 一. ...
- bzoj 1528 [POI2005]sam-Toy Cars 堆维护+贪心
1528: [POI2005]sam-Toy Cars Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 716 Solved: 306[Submit][S ...
- Qt ------ 断开某对信号与槽的connect
QMetaObject::Connection dis; dis = connect(this,&TcpSocket::readyRead,this,&TcpSocket::readD ...
- HDU 5700 优先队列(或者multiset) 或 线段树
题目大意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大.数列的数字均>=0 优先队列思路: 按照左端点sort,然后枚举左端点,假设他被覆盖过k次,然后用优先队列来维护最右端即 ...
- HDU 3507 单调队列 斜率优化
斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...
- PHP扩展开发--02.包裹第三方的扩展
背景 也许最常见的PHP扩展是那些包裹第三方C库的扩展.这些扩展包括MySQL或Oracle的数据库服务库,libxml2的 XML技术库,ImageMagick 或GD的图形操纵库. 在本节中,我们 ...
- 51nod1471 小S的兴趣
题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 320 小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题 ...
- SVM支持向量机的基本原理
SVM支持向量机的基本原理 对于很多分类问题,例如最简单的,一个平面上的两类不同的点,如何将它用一条直线分开?在平面上我们可能无法实现,但是如果通过某种映射,将这些点映射到其它空间(比如说球面上等), ...
- Mac 下安装 ruby 环境解决 brew 安装 yarn 问题
在brew安装yarn提示 ruby的版本过低.在网上搜了一下发现 1. mac下自带的ruby 在 system 目录下 2. 其实可以用brew安装一个ruby brew install ruby ...
- makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析【转】
转自:http://www.cnblogs.com/lifexy/p/7089873.html 先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main. ...