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);...
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[]变量。 Discuz! 5.50 Discuz! ------- 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: <a href=http://www.discuz.net/ target=_blank rel=external nofollow>http://www.discuz.net/</a>