[代码审计]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总结

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

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

而这个是我亟待加强的。

posted @ 2018-08-23 19:02  水泡泡  阅读(1043)  评论(0编辑  收藏  举报