WooYun-2014-60159:phpmps 注入 (可修改其他用户密码,官网成功)

漏洞作者: ′雨。认证白帽子

来源:http://www.wooyun.org/bugs/wooyun-2014-060159

简要描述

验证不足啊。

详细说明

在api/uc.php中

define('IN_PHPMPS', true);

define('UC_CLIENT_VERSION', '1.5.0');    //note UCenter 版本标识

define('UC_CLIENT_RELEASE', '20081031');

define('API_DELETEUSER', 1);        //note 用户删除 API 接口开关

define('API_RENAMEUSER', 1);        //note 用户改名 API 接口开关

define('API_GETTAG', 1);            //note 获取标签 API 接口开关

define('API_SYNLOGIN', 1);            //note 同步登录 API 接口开关

define('API_SYNLOGOUT', 1);            //note 同步登出 API 接口开关

define('API_UPDATEPW', 1);            //note 更改用户密码 开关

define('API_UPDATEBADWORDS', 1);    //note 更新关键字列表 开关

define('API_UPDATEHOSTS', 1);        //note 更新域名解析缓存 开关

define('API_UPDATEAPPS', 1);        //note 更新应用列表 开关

define('API_UPDATECLIENT', 1);        //note 更新客户端缓存 开关

define('API_UPDATECREDIT', 0);        //note 更新用户积分 开关

define('API_GETCREDITSETTINGS', 0);    //note 向 UCenter 提供积分设置 开关

define('API_GETCREDIT', 0);            //note 获取用户的某项积分 开关

define('API_UPDATECREDITSETTINGS', 0);    //note 更新应用积分设置 开关

define('API_RETURN_SUCCEED', '1');

define('API_RETURN_FAILED', '-1');

define('API_RETURN_FORBIDDEN', '-2');

//note 普通的 http 通知方式

if(!defined('IN_UC')) 

{

    error_reporting(0);

    set_magic_quotes_runtime(0);

    defined('MAGIC_QUOTES_GPC') || define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());

    include '../include/common.php';

    include '../include/uc.inc.php';

    $_DCACHE = $get = $post = array();

    $code = @$_GET['code'];

    parse_str(_authcode($code, 'DECODE', UC_KEY), $get);

    if(MAGIC_QUOTES_GPC) {

        $get = _stripslashes($get);

    }

    $action = $get['action'];

    require_once '../uc_client/lib/xml.class.php';

    $post = xml_unserialize(file_get_contents('php://input'));

UC_KEY 默认为phpmps。 官网的也如此。

为1的我们都可以调用。

那就来调用这个把

function updatepw($get, $post) {

        global $db,$table;

        if(!API_UPDATEPW) {

            return API_RETURN_FORBIDDEN;

        }

        $username = $get['username'];

        $password = $get['password'];

        $newpw = md5($password);

        $db->query("UPDATE {$table}member SET password='$newpw' WHERE username='$username'");

        return API_RETURN_SUCCEED;

    }

这里 是个update的语句 所以我们可以更改其他用户的密码。

然后我们自己生成一个加密的注入语句。。。

漏洞证明

测试demo。

修复方案

验证。