【漏洞分析】Discuz X3.3补丁安全分析
2017-08-26 16:33
1526 查看
1. authkey生成算法的安全性漏洞
Discuz_X3.3_SC_UTF8\upload\install\index.php中
authkey的生成方法如下:
可以看出authkey主要由两部分组成:
MD5的一部分(前6位) + random生成的10位
跟入random函数
由于字符生成集合是固定的,且没有重复字符,那么函数中每一次生成hash都唯一对应了chars数组中的一个位置,而且是使用同一个seed生成的。
在之后的代码中使用了同样的random函数:
Cookie的前四个字节是已知的,并且使用了同样的random函数,那么思路很明显:
通过已知的4位,算出random使用的种子,进而得到authkey后10位。那剩下的就需要搞定前6位,根据其生成算法,只好选择爆破的方式,由于数量太大,就一定要选择一个本地爆破的方式(即使用到authkey而且加密后的结果是已知的)。
在调用authcode函数很多的地方都可以进行校验,在这里使用找回密码链接中的id和sign参数:
sign生成的方法如下:
爆破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
在2535行左右,在后台对UCenter的密码进行更新的时候,没有对输入的密码进行检查,直接写入到配置文件,导致我们可以闭合前面的单引号从而达到getshell的目的,这里仅做了一个连接测试,如果连接成功则写入配置文件。
0x04 漏洞利用验证
1. authkey生成算法的安全性漏洞
使用一个普通用户登录:
获取cookie前4位:uie7
使用上述脚本整理成php_mt_seed的参数格式:
接着再用php_mt_seed生成seed:
这里php_mt_seed的参数是:
在这里需要注意:
php_mt_seed多参数时是4个数为一组,含义如下图:
我们拿到的是第11-14次的随机数,要去估算第1-10次的,所以前面要空10组位置。
得到所有的种子后(约250-300),使用如下脚本处理得到所有可能的random(10):
然后重置密码,得到找回链接:
整理后执行爆破脚本:
最后破解出来为: 7e2000vULc0oQETA
对比数据库中数据,可以看出是一致的。
2. 后台任意代码执行漏洞
在管理员输入UCenter的密码时,对于用户的输入没有过滤,导致了输入的数据直接写入文件中,利用步骤如下:
1.以管理员身份登录后台
2.设置一个可以远程访问的mysql,密码为:123');phpinfo();//
3.修改UCenter 数据库密码为上述密码
4.更新后即Getshell
配置文件中的内容也被修改:
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/
Discuz_X3.3_SC_UTF8\upload\install\index.php中
authkey的生成方法如下:
MD5的一部分(前6位) + random生成的10位
跟入random函数
由于字符生成集合是固定的,且没有重复字符,那么函数中每一次生成hash都唯一对应了chars数组中的一个位置,而且是使用同一个seed生成的。
在之后的代码中使用了同样的random函数:
通过已知的4位,算出random使用的种子,进而得到authkey后10位。那剩下的就需要搞定前6位,根据其生成算法,只好选择爆破的方式,由于数量太大,就一定要选择一个本地爆破的方式(即使用到authkey而且加密后的结果是已知的)。
在调用authcode函数很多的地方都可以进行校验,在这里使用找回密码链接中的id和sign参数:
sign生成的方法如下:
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
在2535行左右,在后台对UCenter的密码进行更新的时候,没有对输入的密码进行检查,直接写入到配置文件,导致我们可以闭合前面的单引号从而达到getshell的目的,这里仅做了一个连接测试,如果连接成功则写入配置文件。
0x04 漏洞利用验证
1. authkey生成算法的安全性漏洞
使用一个普通用户登录:
获取cookie前4位:uie7
使用上述脚本整理成php_mt_seed的参数格式:
接着再用php_mt_seed生成seed:
这里php_mt_seed的参数是:
php_mt_seed多参数时是4个数为一组,含义如下图:
我们拿到的是第11-14次的随机数,要去估算第1-10次的,所以前面要空10组位置。
得到所有的种子后(约250-300),使用如下脚本处理得到所有可能的random(10):
然后重置密码,得到找回链接:
整理后执行爆破脚本:
最后破解出来为: 7e2000vULc0oQETA
对比数据库中数据,可以看出是一致的。
2. 后台任意代码执行漏洞
在管理员输入UCenter的密码时,对于用户的输入没有过滤,导致了输入的数据直接写入文件中,利用步骤如下:
1.以管理员身份登录后台
2.设置一个可以远程访问的mysql,密码为:123');phpinfo();//
3.修改UCenter 数据库密码为上述密码
4.更新后即Getshell
配置文件中的内容也被修改:
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/
相关文章推荐
- 暂停交易?ERC20合约整数溢出安全漏洞案例技术分析(一)
- 网站安全漏洞的产生分析、处理总结
- 安全至上---ASP“动网论坛”漏洞分析
- 全面分析Web应用程序安全漏洞——《黑客攻防技术宝典:web实战篇》
- PHP内置函数intval()使用不当的安全漏洞分析
- 漏洞真实影响分析,终结网络安全的“狼来了”困境
- *printf()格式化串安全漏洞分析(下) (转)
- 金融行业安全漏洞分析报告
- CVE-2016-5696漏洞分析:TCP侧信道安全 Leon不会玩
- 【网络安全】Snort漏洞分析规则提取验证全流程讲述
- 全面分析Web应用程序安全漏洞——《黑客攻防技术宝典:web实战篇》
- 支付漏洞总结 / 在线支付流程安全分析
- [典型漏洞分享]从一个手动分析的反射型XSS漏洞看待一个安全设计原则【中危】
- 网站安全漏洞的产生分析、处理总结
- 网站安全漏洞的产生分析与处理总结
- web上存漏洞及原理分析、防范方法(安全文件上存方法)
- 企业即时通讯工具安全漏洞分析
- [技术交流] [经验交流] (最新)移动App应用安全漏洞分析报告 !
- Jsonp常见安全漏洞分析
- 常见WEB开发安全漏洞、原因分析及解决之道