本次教程来自YanXia,转载请注明作者信息,博客地址http://www.535yx.cn,感谢
0x00 前言 {#0x00+%E5%89%8D%E8%A8%804209}
好久没写审计文章了,今天更新篇入门级别MVC架构的PHP代码审计文章。
YXCMS v1.4.7源码下载地址:
http://down.chinaz.com/soft/33853.htm
运行环境要求:
可用的 web服务器(如 Apache,nginx,IIS 等)
PHP 5.0.x 及以上
Mysql 5.0.x 及以上
本文利用到的工具:
phpstudy,SEAY,PHPSTORM
0x01 什么是MVC架构 {#0x01+%E4%BB%80%E4%B9%88%E6%98%AFMVC%E6%9E%B6%E6%9E%841084}
MVC(Model-View-Controller)是软件工程中的一种软件架构,把软件系统分成三个部分:
模型(Model): 封装与应用逻辑相关的数据,通常与数据库直接交互
视图(View): 负责数据的展示或收集数据
控制器(Controller): 负责控制整个程序的流程,通常是根据不同情况调用模型来处理数据后将数据输出到视图
MVC的作用:分离职责,简化代码结构,使程序有更好的维护,重用,和扩展性
总结一下,View指的是我们看到的前端界面,Model就是View所显示界面的后端数据,而Controller就相当于是View和Model之间的桥梁。
0x02 YXCMS的路由分析 {#0x02+YXCMS%E7%9A%84%E8%B7%AF%E7%94%B1%E5%88%86%E6%9E%908929}
先看该cms的入口文件index.php,包裹了路径protected/core.php。访问一下可以发现该CMS的路由
url/index.php?r=$app_name/$controller/$action;
写的大白话一点就是
url/index.php?r=(protected/apps/一级文件夹) / (protected/apps/一级文件夹/controller/文件名前几位) / 文件名下对应的函数名
举个例子
这个地方就对应了url
http://yxcms.com/index.php?r=admin/index/login
OK,接下来开始正式的审计。
0x03 审计过程 {#0x03+%E5%AE%A1%E8%AE%A1%E8%BF%87%E7%A8%8B9872}
先用seay全局扫一下敏感函数
1.任意文件删除漏洞(/protected/apps/admin/controller/filesController.php) {#1.%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%88%A0%E9%99%A4%E6%BC%8F%E6%B4%9E%28%2Fprotected%2Fapps%2Fadmin%2Fcontroller%2FfilesController.php%296728}
这里我们先看一下in函数的用处,发现其是在输入字符串时进行html实体输出,以及是针对SQL注入进行过滤的addslashes()函数。当输入是数组的时候则无如何过滤
也就是说,这里的过滤对于任意文件删除的**.** 和**/** 没有进行任何处置。
$dirs=str_replace(',','/',$dirs);这行则是将输入的**,**替换成**/**也无实际用处
接下来就是判断是否是目录或者文件了
如果是目录的话,则调用del_dir函数删除目录下所有的文件
如果是文件的话就直接unlink删除文件对应文件了。
下列举例:
我先修改下输出,这样让大家看的更直观点。
在根目录新建个文件后构造payload
index.php?r=admin/files/del&fname=/../yanxia.txt
可以看到,这里就成功删除了yanxia.txt。实战利用的话,我们可以通过删除protected/apps/install/install.lock来重置cms(有点刑,不建议这么利用)
2.任意文件删除漏洞(/protected/apps/admin/controller/newsController.php) {#2.%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%88%A0%E9%99%A4%E6%BC%8F%E6%B4%9E%28%2Fprotected%2Fapps%2Fadmin%2Fcontroller%2FnewsController.php%292002}
这里跟上面的逻辑差不多Check::url($pic)就是判断下是不是url的格式
$data['picture']= $this->nopic;
if(model('news')->update("id='$id'",$data)) //这里会判断id对应的数据是否存在。也就是说如果没有个数据存在的话也是无法向下执行的
例子:
3.任意文件删除漏洞(/protected/apps/admin/controller/photoController.php) {#3.%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%88%A0%E9%99%A4%E6%BC%8F%E6%B4%9E%28%2Fprotected%2Fapps%2Fadmin%2Fcontroller%2FphotoController.php%294423}
4.目录遍历漏洞(/protected/apps/admin/controller/filesController.php) {#4.%E7%9B%AE%E5%BD%95%E9%81%8D%E5%8E%86%E6%BC%8F%E6%B4%9E%28%2Fprotected%2Fapps%2Fadmin%2Fcontroller%2FfilesController.php%295577}
这个函数是对upload文件夹下的文件进行展示,也就对应后台的文件管理功能。如图,这个地方对dirget参数没有做什么实质性的过滤,所以这里就可以造成一个文件读取的操作
我在这里输出一下路径,让你们更清晰的看下
- 任意文件写入漏洞(protected/apps/admin/controller/setController.php) {#5.+%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5%E6%BC%8F%E6%B4%9E%28protected%2Fapps%2Fadmin%2Fcontroller%2FsetController.php%299072}
该漏洞是通过从功能点去反向分析代码获得。
根据url定位到对应的函数
下图先判断了写入的文件名和内容是否为空。若为空即是非法操作。没什么影响
然后就进入了POST时的判断
这里我们跟进到ifillegal函数,
这个函数是用来判断是否存在跨目录的操作。
如果未匹配到的话就尝试写入该文件
这个文件底下的tpedit()函数同理,不在叙述。
6.任意文件上传漏洞(protected/apps/appmanage/controller/indexController.php) {#6.%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%BC%8F%E6%B4%9E%28protected%2Fapps%2Fappmanage%2Fcontroller%2FindexController.php%299199}
本处的功能点在许多cms里都存在过漏洞,YXCMS也不例外。我在网络上搜索了一番发现并未有任何文章提及该处漏洞,说不定是一个0day。接下来我们来分析一下
从上图中定位到代码
可以看出来,当上传一个zip压缩包的时候,代码会去匹配压缩包中是否存在个文件夹(命名规则为a-z0-9),以及文件夹中是否存在config.php文件。如果不存在的话即会返回"安装包格式错误"
接下来也就仅仅判断了该应用是否存在,不存在的话就将数据拷贝到apps目录中。所以我们可以构造个压缩包进行上传
上传成功
0x04 结尾 {#0x04+%E7%BB%93%E5%B0%BE2831}
这篇文章就到这里,感谢各位的观看。