e107是用php编写的内容管理系统。 e107的usersettings.php页面存在SQL注入漏洞: if ($ret == '') { $loginname = strip_tags($_POST['loginname']); if (!$loginname) { $loginname = $udata['user_loginname']; } else { if(!check_class($pref['displayname_class'], $udata['user_classlist'], $peer)) { $new_username = "user_name = '{$loginname}', "; $username = $loginname; } } ... $_POST['signature'] = $tp->toDB($_POST['signature']); $_POST['realname'] = $tp->toDB($_POST['realname']); ... // We can update the basic user record now $sql->db_Update("user", "{$new_username} {$pwreset} {$sesschange} user_email='".$tp -> toDB($_POST['email'])."', user_signature='".$_POST['signature']."', user_image='".$tp -> toDB($_POST['image'])."', user_timezone='".$tp -> toDB($_POST['timezone'])."', user_hideemail='".intval($tp -> toDB($_POST['hideemail']))."', user_login='".$_POST['realname']."' {$new_customtitle},...
e107是用php编写的内容管理系统。 e107的usersettings.php页面存在SQL注入漏洞: if ($ret == '') { $loginname = strip_tags($_POST['loginname']); if (!$loginname) { $loginname = $udata['user_loginname']; } else { if(!check_class($pref['displayname_class'], $udata['user_classlist'], $peer)) { $new_username = "user_name = '{$loginname}', "; $username = $loginname; } } ... $_POST['signature'] = $tp->toDB($_POST['signature']); $_POST['realname'] = $tp->toDB($_POST['realname']); ... // We can update the basic user record now $sql->db_Update("user", "{$new_username} {$pwreset} {$sesschange} user_email='".$tp -> toDB($_POST['email'])."', user_signature='".$_POST['signature']."', user_image='".$tp -> toDB($_POST['image'])."', user_timezone='".$tp -> toDB($_POST['timezone'])."', user_hideemail='".intval($tp -> toDB($_POST['hideemail']))."', user_login='".$_POST['realname']."' {$new_customtitle}, user_xup='".$tp -> toDB($_POST['user_xup'])."' WHERE user_id='".intval($inp)."' "); 上述代码没有执行正确地数据库转义便将POST变量loginname注入到了SQL查询中。但在之前几行的过滤器可以防范一些字符: // Login Name checks if (isset($_POST['loginname'])) { // Only check if its been edited $temp_name = trim(preg_replace('/ |\#|\=|\$/', "", strip_tags($_POST['loginname']))); if ($temp_name != $_POST['loginname']) { $error .= LAN_USET_13."\\n"; } // Check if login name exceeds maximum allowed length if (strlen($temp_name) > varset($pref['loginname_maxlength'],30)) { $error .= LAN_USET_14."\\n"; } $_POST['loginname'] = $temp_name; } 这个过滤器禁用“#”、“=”等字符并检查loginname长度不能超过所允许的最大值,但还不足以防范攻击,因为只需“/*”字符就可以终止字符串上下文,并打开可在签名中关闭的标注。 e107 0.7.20 厂商补丁: e107.org -------- 目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本: http://e107.org/