这个cms有点旧了,找了一下Github已经很久没有进行更新了,应该是不再维护了,看样子是使用的范围比较小,fofa搜了一下只有一点点,大大多点开看还像是单纯的测试站….找了一下,这个cms是有个文件上传的CVE编号的,相关的漏洞分析利用啥的好像没人整,那就自己来吧…
环境搭建
windows10 phpstudy
schoolCMS建站源码
搭建直接把源码丢到WWW目录下就好,这里提一下PHP配置文件中mysqli的拓展前面的注释符需要去掉,不然会报错,因为build文件中用到了拓展类中的mysqli类来进行数据库的操作
出现这个页面也就搭建成功了
漏洞分析
用默认账号登录后台,找到了两处可以上传文件的地方,一处是网站管理->主题管理,另一处是站点配置->站点设置处,可以上传网站的logo;两个地方都来看一下
网站管理->主题管理
审计代码结合功能点测试能够帮助更快定位到相关功能代码的位置
一般主题管理都是上传压缩包,功能代码应该会有一步解压缩的操作,所以制作一个压缩包,放一张正常的图片,一个PHP文件
返回的json
数据进行unicode解码,编辑成功,但是主题哪里并没有多,也就不清楚到底有没有上传成功,根据上传的路径跟一下源码
Application/Admin/Controller/ThemeController.class.php#184
首先会对上传的文件进行一个校验,跟进FileUploadError
方法,该方法相当于是一个表单验证,如果POST
表单中存在name
为type
的,就继续,并且文件成功上传返回true,若不能正常上传成功会返回对应的错误信息
接着回到Upload方法中,对上传的文件类型进行校验,这里是写死的白名单,只能是数组里两种数值中的一种,因为是正常上传的压缩包所以并没有影响,接着会继续向下,看一下Upload
方法后面的操作
接下去会对上传的压缩包进行解压缩,并对其中的项目名称进行校验,首先排除临时文件和临时目录,之后只有文件名中含有_Html
或者_Static
才会进行路径的拼接,$this->html_path
和$this->static_path
都是类中定义好的路径
$this->html_path = 'Application'.DS.'Home'.DS.'View'.DS;
$this->static_path = 'Public'.DS.'Home'.DS;
之后再将$file中的两个字符串替换为空,截取文件路径,下面就是判断是否存在文件夹,判断文件是否是文件夹不是就进行文件的写入
所以接下来只需要对压缩包进行重新修改就可以了,还是一样的文件,文件夹的名字改成xx_Html
,打成压缩包之后重新上传,成功传入,可以看到上传之后文件名会被修改为压缩文件xx+文件
本来的名称
通过主题模块查看默认模板可以知道上传之后的文件所在路径为Application/Home/View
,后面直接跟上拼接之后的文件名就可以访问到shell了
站点配置->站点设置
站点logo处可以进行文件上传,上传的文件会被重命名,覆盖掉原本的logo文件,也就是说只能该目录下只能有一个logo文件名的文件
上传一个正常的图片文件,Burp抓包之后获取路径,通过路径定位到上传方法的控制器
Application/Admin/Controller/SiteController.class.php#72
还是一样会先经过FileUploadError
方法的处理,重点部分在断点位置,调用了explode
方法对文件上传的type
进行了处置,以/
为分隔符,获取到值后分别赋给了$type
和$suffix
,之后就是判断是否存在image
文件夹没有就会进行创建;$filename
会进行重命名,这里是重点,文件名会被重写,拼接的后缀恰巧是前面从type
中获取到值的$suffix
。
正常的上传png图片,获取到的content-type
为image/png
,经过explode
处理之后,$type
和$suffix
的值分别为image
和png
,所以文件名还会是png后缀,再通过move_uploaded_file
方法将上传的文件移动到指定的路径下。
利用代码逻辑这文件重命名的漏洞,上传图片之后修改content-type
为image/php
,就可以获取shell了
burp请求包如下
通过前端代码可以获取到路径,文件名固定为home_logo,从代码中也可以看到,访问shell即可
写在后面
这个CMS还是比较简单的,可能就是因为比较旧了吧,本来想着ZIP拿shell还可以申请个CVE来着,去看了一下issue发现两年前已经有人提了,那就把这个审计的过程记录一下。
- 本文作者: joker
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/830
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!