安全研究

安全漏洞
e107 Usersettings页面SQL注入漏洞

发布日期:2010-05-15
更新日期:2010-05-17

受影响系统:
e107.org e107 0.7.20
描述:
BUGTRAQ  ID: 40202

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长度不能超过所允许的最大值,但还不足以防范攻击,因为只需“/*”字符就可以终止字符串上下文,并打开可在签名中关闭的标注。

<*来源:Stefan Esser (s.esser@ematters.de
  
  链接:http://php-security.org/2010/05/16/mops-2010-031-e107-usersettings-loginname-sql-injection-vulnerability/index.html
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

1. 访问有漏洞的e107
2. 创建名为xpltest的新用户
3. 以xpltest身份登录
4. 进入到用户设置
5. 在页面的HTML源码中从隐藏的_uid字段找到用户ID,假设为444。
6. 将xpltest'/*输入到realname字段
7. 将*/,user_admin=1 where user_id=444 -- x输入到签名字段(用自己的用户ID替换444)
8. 启动tamperdata开始激活篡改
9. 提交用户设置并将realname变量更改为loginname
10. 现在xpltest用户为管理员

建议:
厂商补丁:

e107.org
--------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://e107.org/

浏览次数:2048
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障