【漏洞分析】Discuz X3.3补丁安全分析

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

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

 http://p9.qhimg.com/t0149e756271d954aaa.png

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函数

 http://p1.qhimg.com/t018b6e396a02a75670.png

由于字符生成集合是固定的,且没有重复字符,那么函数中每一次生成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

 http://p7.qhimg.com/t015920b0a78c8e7c09.png

2535行左右,在后台对UCenter的密码进行更新的时候,没有对输入的密码进行检查,直接写入到配置文件,导致我们可以闭合前面的单引号从而达到getshell的目的,这里仅做了一个连接测试,如果连接成功则写入配置文件。

http://p2.qhimg.com/t01b4d576fa01a5af98.png

http://p1.qhimg.com/t011f0757f737c684f0.png


0x04 漏洞利用验证


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

使用一个普通用户登录:

 http://p1.qhimg.com/t01261ef3f364a39d2e.png

获取cookie前4位:uie7

http://p3.qhimg.com/t0166459dc16226ed5a.png

使用上述脚本整理成php_mt_seed的参数格式:

 http://p8.qhimg.com/t012a288f3b4e8c01d2.png

接着再用php_mt_seed生成seed:

 http://p3.qhimg.com/t01d9c4da0cccf4c9c7.png

这里php_mt_seed的参数是:

1
0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 610 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 56 56 0 61 44 44 0 61 40 40 0 61 33 33 0 61

在这里需要注意:

php_mt_seed多参数时是4个数为一组,含义如下图:

 http://p9.qhimg.com/t01c3294dd0120e85a8.png

我们拿到的是第11-14次的随机数,要去估算第1-10次的,所以前面要空10组位置。

得到所有的种子后(约250-300),使用如下脚本处理得到所有可能的random(10):

http://p0.qhimg.com/t011847540e7e5cff21.png

然后重置密码,得到找回链接:

http://p0.qhimg.com/t016ac7b3edb65114b6.png

整理后执行爆破脚本:

 http://p0.qhimg.com/t014127290ddd325b62.png

最后破解出来为: 7e2000vULc0oQETA

对比数据库中数据,可以看出是一致的。

 http://p0.qhimg.com/t011b9dae937c88d3a2.png

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

在管理员输入UCenter的密码时,对于用户的输入没有过滤,导致了输入的数据直接写入文件中,利用步骤如下:

1.以管理员身份登录后台

2.设置一个可以远程访问的mysql,密码为:123');phpinfo();//

3.修改UCenter 数据库密码为上述密码

4.更新后即Getshell

http://p2.qhimg.com/t0126b35f53a150c013.png

https://i-blog.csdnimg.cn/blog_migrate/a0326b9ab4e1f54a9ab84ff7b8078bb5.png

https://i-blog.csdnimg.cn/blog_migrate/e5c85120f6e353e18c8567cac8870e8f.png

 

配置文件中的内容也被修改:

 https://i-blog.csdnimg.cn/blog_migrate/55de1a48010bf7a48aff26140a0f39b7.png


0x05 修复建议


Discuz官方已经在2017年8月1日发布最新版,请用户检查自己使用的版本,并及时更新至最新版。


0x06 时间线


2017-08-01  Discuz官方安全更新

2017-08-07  360CERT和0KEE Team完成对新版本的首次分析

2017-08-22  360CERT和0KEE Team完成对后续分析并形成报告


0x07 参考文档


https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/8446bd9e897bb19672389cc4aed42716ccd0f537

https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/bb600b8dd67a118f15255d24e6e89bd94a9bca8a

http://www.openwall.com/php_mt_seed/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值