安全矩阵

 找回密码
 立即注册
搜索
查看: 2549|回复: 0

记一次某CMS代码审计-1

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-19 14:35:21 | 显示全部楼层 |阅读模式
原文链接:记一次某CMS代码审计-1

拿到这个CMS的时候我大致看了一下cnvd已经爆出来的洞,感觉除了XSS这种东西,其他的命令执行,文件上传之类的漏洞感觉全都是在后台,所以我第一反应就是这又是一个纯数据库操作和前端的前台。
大致看了一下,发现前台注册个用户后也有个文件上传的功能`application/member/controller/Upload.php`,但是具体试的时候发现提示没有访问权限。经过一番探索,发现就是站点注册的用户,在`xxxx_auth_user`表中的`role_ids`给的是3,但是admin是`1,2,3`,然后就是`xxxx_auth_user`,`xxxx_auth_rule`,`xxxxx_auth_role`的类似三表信息联合,具体不分析了,最终的简单的结果就是直接这样注册的用户还没权限用这个`application/member/controller/Upload.php`,除非上后台改一下权限。但是我在数据库里发现以注册用户的权限可以干这件事情:
`php
头像设置
member/member/avatar
跟进一下代码,发现其实也是一处文件上传:

跟进一下`upload`方法就会发现,它实际上对上传的文件会有这样的检测

用的也是thinkphp自带的检测,具体不说了。总的来说就是白名单检测后缀,这个白名单也是取自的数据库。而且这是单纯的从数据库里取出来白名单进行检验,没有额外再检验php了,所以我直接上后台,改一下上传的设置:

加个php,然后找个上传点,直接上传马:

第二处漏洞
首先来到后台的模板功能。没办法,后台最吸引人的地方,除了上传,就是模板功能了。
漏洞在`application/admin/controller/Template.php`的`fileedit`函数:


逻辑很简单,通过post或者get得到path变量,然后就是拼接到一个目录的最后面,因此可以目录穿越。但是有个限制:

第二个正则匹配没有影响,因为前面的拼接部分本来就有。但是第一个`file_exists`要求文件必须是已存在的。
然后就是2种利用,如果请求方式是post,那就对这个已存在的文件判断是否可写,可写的话就任意写入:

因此可以找个几乎没影响的已存在的php文件进行写入,即可`getshell`。
如果请求方式不是post的话,就是读取这个文件了:

实现任意文件的读取。
所以说后台的模板功能不做限制真的是各种利用。
所以这个CMS其实也是前台没东西,后台很容易拿下的。但是因为是thinkphp5.1.41,肯定也没有SQL注入了,想进后台也只能靠弱口令了。本来不想再看了,因为感觉CNVD已经爆出来后台的很多洞了。后来想想还是自己再把后台的功能好好审审,继续增加后台的代码审计的经验叭。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-29 17:13 , Processed in 0.014088 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表