某Cms 前台储存型xss

isnull   ·   发表于 2019-06-23 11:34:05   ·   漏洞文章

0x1 漏洞分析

位置:/4.1.190209/Lib/Lib/Action/Home/ForumAction.class.php
line 71~107

public function update(){
        $post = $_POST;
        $post['forum_cookie'] = md5('forum_'.intval($post['forum_sid']).'_'.intval($post['forum_pid']).intval($post['forum_uid']).'_'.intval($post['forum_cid']));
        //报错取消验证
        if($post['forum_sid'] == 24){
            D("Forum") -> setProperty("_validate", '');
        }
        //写入数据库
        $info = D("Forum")->ff_update($post);
        if($info){
            $email_type = '';
            if( $info['forum_sid'] == 5 ){
                if( C('user_email_guestbook') ){
                    $email_type = '留言';
                }
            }elseif( $info['forum_sid'] == 24 ){
                if( C('user_email_error') ){
                    $email_type = '报错';
                }
            }else{
                if( C('user_email_forum') ){
                    $email_type = '评论';
                }
            }
            if( $email_type ){
                D("Email")->send(C('site_email'), '站长您好', '收到用户('.$info['forum_uid'].')的'.$email_type, $info['forum_content']);
            }
            //返回状态
            if (C('user_check')) {
                $this->ajaxReturn($info, "谢谢,我们会尽快审核你的发言!", 201);
            }else{
                $this->ajaxReturn($info, "感谢你的参与!", 200);
            }
        }else{
            $this->ajaxReturn('', D("Forum")->getError(), 0);
        }
  }


先来看下流程:

  • 先获取了post传输过来的数据
  • forum_cookie是获取传入过来的forum的各种id参数并且是强制int和md5加密的
  • 接下来进行了写入到数据库操作跟进D("Forum")->ff_update()方法
  • 获取返回值根据返回值的确定进行了什么操作
  • 最后返回状态
  • 跟进Lib/Lib/Model/ForumModel.class.php中的ff_update()方法



    这里只是进行了数据的添加具体数据库,ForumModel继承了RelationModel,会先验证传入的数据是否满足要求



    问题出现在了
    array('forum_ip','get_client_ip',1,'function'),这里 没有对
    继续跟进 get_client_ip

    位置/Lib/Common/common.php
    Line 2703~2715

    function get_client_ip(){
       if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
           $ip = getenv("HTTP_CLIENT_IP");
       else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
           $ip = getenv("HTTP_X_FORWARDED_FOR");
       else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
           $ip = getenv("REMOTE_ADDR");
       else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
           $ip = $_SERVER['REMOTE_ADDR'];
       else
           $ip = "unknown";
       return($ip);
    }


    这里我们那可以控制HTTP_X_FORWARDED_FOR而且没有对数据进行过滤或者验证处理

    0x02 漏洞利用

    首先注册一个用户,跳转到留言页面添加留言
    拦截数据包 增加payload到X-Forwarded-For



    可以看到可以控制的是两个地方但是只能输入20个字符 所以尝试使用分段突破字符限制
    因为这个评论内容是顺序排列的所以payload分为三次提交:

  • */</script><!--
  • */alert(1);/*
  • <script>/*



  • 这时打开后台管理跳转到评论页面就会自动弹出



    至于怎么偷取cookie 自行使用js的各种拼接创建元素就可以了


    转自先知社区

    打赏我,让我更有动力~

    0 条回复   |  直到 2019-6-23 | 1021 次浏览
    登录后才可发表内容
    返回顶部 投诉反馈

    © 2016 - 2024 掌控者 All Rights Reserved.