Discuz!论坛preg_match()函数未初始化$onlineipmatches变量漏洞
发布日期:2009-05-08
更新日期:2009-05-11
受影响系统:Discuz! Discuz! < 5.50
不受影响系统:Discuz! Discuz! 5.50
描述:
Discuz!是一款华人地区非常流行的Web论坛程序。
在Discuz!论坛的include/common.inc.php文件中:
$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_COOKIE));
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
//覆盖变量,这里我们可以覆盖$_SERVER
if(!$magic_quotes_gpc) {
$_FILES = daddslashes($_FILES);
}
.....
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$onlineip = $_SERVER['REMOTE_ADDR'];
}
//提取ip,首先尝试getenv()取,如果失败就通过$_SERVER[]来取.
preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
//注意这个preg_match()的第3个参数$onlineipmatches并没有初始化,同时程序员没有判断preg_match函数的返回值,这样在某些特定情况下可能导致绕过正则的判断,
//可以任意构造$onlineipmatches.
$onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
unset($onlineipmatches);
利用iis下getenv()失效,然后通过extract()覆盖$_SERVER的变量,导致preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);匹配失败,就可以任意提交$onlineipmatches[]变量。
<*来源:80vul
链接:
http://www.80vul.com/dzvul/sodb/17/sodb-2009-01.txt
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
index.php?_SERVER[REMOTE_ADDR][]=1&onlineipmatches[]=80vul
建议:
厂商补丁:
Discuz!
-------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.discuz.net/浏览次数:3776
严重程度:0(网友投票)