[代码审计]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总结
学习别人的漏洞类型文章,最主要的是学习别人的思考过程,与及理清楚整个漏洞原理,同时做出相应的思考衍伸。
写漏洞类型文章的精髓也是在于此,记录清楚整个思考的过程,洞悉出漏洞的本质。
而这个是我亟待加强的。