Discuz X3补丁安全分析

Discuz官方于2017年8月1号发布最新版X3.4版本,在最新版本中修复了多个安全问题。360CERT和360 0KEE Team遂对该事件进行跟进。

0x01 漏洞概述

360CERT360 0KEE Team通过对比Discuz_X3.3_SC_UTF8Discuz_X3.4_SC_UTF8版本,发现X3.3_SC_UTF8版本存在数个漏洞。本报告主要涉及两个漏洞: 

1. authkey生成算法的安全性问题:

用户在初次安装软件时,系统会自动生成一个authkey写入全局配置文件和数据库,之后安装文件会被删除。该authkey用于对普通用户的cookie进行加密等密码学操作,但是由于生成算法过于简单,可以利用公开信息进行本地爆破。

2. 后台任意代码执行问题:

管理员在后台对数据库连接密码进行修改时,由于没有对输入进行检查,导致任意代码执行。

0x02 漏洞攻击面影响

1. 影响面

Discuz基本上是基于Cookie而非Session,所以一旦authkey被获取,将导致Cookie的加密失效,进而可以解密Cookie的auth字段获取用户的密码。系统中其他逻辑也大量使用了authkey和authcode算法,该漏洞可导致一系列安全问题:伪造ulastactivity可控制session持久时间;邮箱校验的hash参数被破解,导致任意邮箱注册等。

另外一旦拥有一个管理员账号,则可利用后台任意代码执行漏洞,在后台Getshell进而控制服务器

经过360CERT与360 0KEE Team研判后确认,漏洞风险等级高,影响范围广

2. 影响版本

通过代码分析,确定涉及如下版本:

Discuz_X3.3_SC_GBK

Discuz_X3.3_SC_UTF8

Discuz_X3.3_TC_BIG5

Discuz_X3.3_TC_UTF8

Discuz_X3.2_SC_GBK

Discuz_X3.2_SC_UTF8

Discuz_X3.2_TC_BIG5

Discuz_X3.2_TC_UTF8

Discuz_X2.5_SC_GBK

Discuz_X2.5_SC_UTF8

Discuz_X2.5_TC_BIG5

Discuz_X2.5_TC_UTF8

3. 修复版本

Discuz_X3.4_SC_GBK

Discuz_X3.4_SC_UTF8

Discuz_X3.4_TC_BIG5

Discuz_X3.4_TC_UTF8

0x03 漏洞详情

1. authkey生成算法的安全性漏洞

Discuz_X3.3_SC_UTF8\upload\install\index.php

 

discuz x3

authkey的生成方法如下:

1

 

$authkey = substr(md5($_SERVER['SERVER_ADDR'].$_SERVER['HTTP_USER_AGENT'].$dbhost.$dbuser.$dbpw.$dbname.$username.$password.$pconnect.substr($timestamp, 0, 6)), 8, 6).random(10);

 

可以看出authkey主要由两部分组成:

MD5的一部分(前6位) + random生成的10位

跟入random函数

 

discuz x3

由于字符生成集合是固定的,且没有重复字符,那么函数中每一次生成hash都唯一对应了chars数组中的一个位置,而且是使用同一个seed生成的。

在之后的代码中使用了同样的random函数:

1

 

$_config['cookie']['cookiepre'] = random(4).'_';

 

Cookie的前四个字节是已知的,并且使用了同样的random函数,那么思路很明显:

通过已知的4位,算出random使用的种子,进而得到authkey后10位。那剩下的就需要搞定前6位,根据其生成算法,只好选择爆破的方式,由于数量太大,就一定要选择一个本地爆破的方式(即使用到authkey而且加密后的结果是已知的)。

在调用authcode函数很多的地方都可以进行校验,在这里使用找回密码链接中的id和sign参数:

sign生成的方法如下:

1

2

3

 

function dsign($str, $length = 16){

    return substr(md5($str.getglobal('config/security/authkey')), 0, ($length ? max(8, $length) : 16));

}

 

爆破authkey 的流程:

1.通过cookie前缀爆破随机数的seed。使用php_mt_seed工具。

2.用seed生成random(10),得到所有可能的authkey后缀。

3.给自己的账号发送一封找回密码邮件,取出找回密码链接。

4.用生成的后缀爆破前6位,范围是0x000000-0xffffff,和找回密码url拼接后做MD5求出sign。

5.将求出的sign和找回密码链接中的sign对比,相等即停止,获取当前的authkey。

2. 后台任意代码执行漏洞

对比X3.4与X3.3版本发现漏洞存在于:

upload\source\admincp\admincp_setting.php

 

discuz x3

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。