• [代码审计]SRCMS的两点小越权


    0x00 简介

    SRCMS是一个开源的企业安全应急响应中心,基于ThinkPHP 3.2框架开发。该系统在2017-09-09已经停止更新了,主要是在翻看p神博客文章时看到这个,随想自己再审一次。

    p神在2016年1月审过之后,作者做了一次更新,修补完了漏洞,几点大问题算是解决了。

    在我仔细审过之后,发现了两处小越权,算是不痛不痒的,这篇文章主要是为了对在p神文章学到的审计点进行检测加强与衍伸。

    下面是我的思考过程记录。

    0x01 前思

    p神的文章写到了两个点。

    一是作者对于链式字符串where条件的误用,是tp的特性导致。这个问题在于很多人在理解一个东西的时候,都会把自己的思想掺杂进去,想当然的认为是这样。没有经过测试就直接发布,最终就导致了意外的结果。

    后面作者使用了数组的形式进行了修复。

    二是thinkphp Model中设置的类型与实际执行的SQL类型不同导致,字段不限制,字段不验证,关键点在于主键字段是我们可以控制的。

    其实这里的锅我感觉是要给tp背,毕竟create方法里面的判断是他们写的,开发者在使用的时候只是根据文档提供的函数来使用。

    针对p神说的越权修改他人的联系方式这个点,作者的修复方式是取消使用D方法来create,而是直接使用M方法,从而避开了了使用自动完成可能带来的问题。

    但仍有一些使用了D方法的,其修复方式是加上了验证字段,从而导致我们没办法控制主键的字段。

    再看到tp的create方法

    在还没有执行到autoOperation的时候进行了字段限制,从而避免了这个问题。

    至于第三个问题是p神说的横向挖掘,提升权限的问题,而这个问题的本质和问题二一样,同样是thinkphp 自动完成,字段不限制,字段不验证导致的。(所以为两个点)

    那么总结衍伸一下可以知道,在字段限制的情况下,使用了D()方法进行create(),主键字段如果是在受限字段内的话,同样是存在越权的问题。(问题二)

    0x02 后觉

    在总结和思考了p神的文章和漏洞原理之后,接着就开始想自己挖一下。

    最终让我找到了两个小越权,分别是越权评论别人的漏洞报告,越权查看别人漏洞报告下的评论。

    看到User下的PostController.class.php的view和comment方法:

    public function view(){
            $rid = I('get.rid',0,'intval');
            $model = M("Post");
            $id = session('userId');
            $comment = M('comment')->where(array('post_id'=>$rid))->select();
            $post = $model->where(array('user_id'=>$id,'id'=>$rid))->find();
            $tmodel= M('setting');
            $title = $tmodel->where('id=1')->select();
            $this->assign('title', $title);
            $this->assign('model', $post);
            $this->assign('comment',$comment);
            $this->display();
        }
        
        public function comment()
        {
            if (!IS_POST) {
                $this->error("非法请求");
            }
            if (IS_POST) {
                $data = I();
                $data['update_time'] = time();
                $data['user_id'] = session('username');
                $model = M("Comment");
                if ($model->add($data)) { //评论处这里有没有问题??
                        $this->success("评论成功", U('post/index'));
                    } else {
                        $this->error("评论失败");
                    }
            }
        }

    首先是view方法,这里是对展示对应rid的漏洞报告和评论,可是评论根本就没有限制,导致可以获取别人漏洞报告的评论。

    直接修改rid即可:

    同样看到commnet方法,没有限制字段,接收数组类型数据,直接存储。

    在看到对应的模型,没有验证字段数据:

    就是典型的上面说的问题了,可以直接插入评论到别人的漏洞报告里面。

    两个漏洞虽然造成不了多大的影响,但也算是对p神文章的学习和小小的衍伸。

    0x03总结

    学习别人的漏洞类型文章,最主要的是学习别人的思考过程,与及理清楚整个漏洞原理,同时做出相应的思考衍伸。

    写漏洞类型文章的精髓也是在于此,记录清楚整个思考的过程,洞悉出漏洞的本质。

    而这个是我亟待加强的。

  • 相关阅读:
    继承与多态
    欢迎来到vmax-tam的博客
    MySQL令人咋舌的隐式转换
    MySQL数据库SQL语句(高级进阶二,图文详解)
    深入浅出MySQL之索引为什么要下推?
    【推荐】开源项目ElasticAmbari助力 ElasticSearch、Kibana、ambari服务高效运维管理
    Java集合篇:Map集合的几种遍历方式及性能测试
    大厂Redis高并发场景设计,面试问的都在这!
    第八届“图灵杯”NEUQ-ACM程序设计竞赛(全题解&&详细)
    11个编程接单的网站,你有技术就有收入,有收入就有女朋友《男盆友》
  • 原文地址:https://www.cnblogs.com/r00tuser/p/9525665.html
Copyright © 2020-2023  润新知