saforum是国内安全研究人员修改过的saforum论坛,但是代码中有一点瑕疵导致可能被获取管理员权限:)
\include\common.php 行41~49引入没有过滤的变量
------cut-----------------
if(getenv('HTTP_CLIENT_IP')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$onlineip = getenv('REMOTE_ADDR');
} else {
$onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}//$onlineip没有做任何过滤
-------cut-----------------
然后:
\include\global.php 行65~80,updatesession函数将变量注射入session库
-------cut-----------------
function updatesession() {
if(empty($GLOBALS['sessionupdated'])) {
global $db, $sessionexists, $sessionupdated, $sid, $onlineip, $ipbanned, $status, $discuz_user, $timestamp, $groupid, $styleid, $discuz_action, $fid, $tid, $onlinehold, $table_sessions, $table_members;
$sessionupdated = 1;
if($sessionexists == 1) {
$db->query("UPDATE $table_sessions SET status='$status', lastactivity='$timestamp', groupid='$groupid', username='$discuz_user', styleid='$styleid', action='$discuz_action', fid='$fid', tid='$tid' WHERE sid='$sid'");
} else {
$db->unbuffered_query("DELETE FROM $table_sessions WHERE sid='$sid' OR lastactivity<'".($timestamp - $onlinehold)."' OR (ip='$onlineip' AND lastactivity>'".($timestamp - 60)."') OR ('$discuz_user'<>'' AND username='$discuz_user')");
$db->query("INSERT INTO $table_sessions (sid, ip, ipbanned, status, username, lastactivity, groupid, styleid, action, fid, tid)
VALUES ('$sid', '$onlineip', '$ipbanned', '$status', '$discuz_user', '$timestamp', '$groupid', '$styleid', '$discuz_action', '$fid', '$tid')");
//通过伪造$onlineip变量,可以注射一个任意身份的会员到seesion库
if($discuz_user) {
$db->unbuffered_query("UPDATE $table_members SET lastvisit=$timestamp+$onlinehold WHERE username='$discuz_user'");
}
}
}
-------cut-----------------
最后
index.php 80行 调用了updatesession()函数
saforum
过滤相关参数
暂无评论