某Cms 前台储存型xss

2019-06-23 约 185 字 预计阅读 1 分钟

声明:本文 【某Cms 前台储存型xss】 由作者 c7k 于 2019-06-23 09:31:00 首发 先知社区 曾经 浏览数 221 次

感谢 c7k 的辛苦付出!

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的各种拼接创建元素就可以了

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now