51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

代码审计之YXCMS

本次教程来自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的作用:分离职责,简化代码结构,使程序有更好的维护,重用,和扩展性
80001-wvk8o6z5qmm.png

总结一下,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}

01849-lxg1bps20sg.png

先看该cms的入口文件index.php,包裹了路径protected/core.php。访问一下可以发现该CMS的路由
26302-r4fljf716zj.png

97239-kudi14sge8.png

url/index.php?r=$app_name/$controller/$action;
写的大白话一点就是
url/index.php?r=(protected/apps/一级文件夹) / (protected/apps/一级文件夹/controller/文件名前几位) / 文件名下对应的函数名

举个例子
94976-ck83hvmq7et.png

这个地方就对应了url
http://yxcms.com/index.php?r=admin/index/login
50999-01wp5lnxzp2y.png

OK,接下来开始正式的审计。

0x03 审计过程 {#0x03+%E5%AE%A1%E8%AE%A1%E8%BF%87%E7%A8%8B9872}

先用seay全局扫一下敏感函数
12256-28gtqgd7ign.png

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}

84510-ohl4d30fq9s.png

这里我们先看一下in函数的用处,发现其是在输入字符串时进行html实体输出,以及是针对SQL注入进行过滤的addslashes()函数。当输入是数组的时候则无如何过滤
64432-pt8dxhdr9m.png

也就是说,这里的过滤对于任意文件删除的**.** 和**/** 没有进行任何处置。
$dirs=str_replace(',','/',$dirs);这行则是将输入的**,**替换成**/**也无实际用处
接下来就是判断是否是目录或者文件了
如果是目录的话,则调用del_dir函数删除目录下所有的文件
45973-8fugtqz85js.png

如果是文件的话就直接unlink删除文件对应文件了。
下列举例:
我先修改下输出,这样让大家看的更直观点。
16388-j9htpltrcb.png

在根目录新建个文件后构造payload
16008-jwffio5a90c.png

83258-gpns9qk6su.png

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}

94145-ruo60uhc1yp.png

46865-djowml1a3sn.png

这里跟上面的逻辑差不多Check::url($pic)就是判断下是不是url的格式
26024-fxw27f4xy0f.png

$data['picture']= $this->nopic;
if(model('news')->update("id='$id'",$data)) //这里会判断id对应的数据是否存在。也就是说如果没有个数据存在的话也是无法向下执行的

例子:
83779-cw586h5uov.png

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}

50255-pv2aeshqbt.png

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}

57959-txnbooi5wjl.png

这个函数是对upload文件夹下的文件进行展示,也就对应后台的文件管理功能。如图,这个地方对dirget参数没有做什么实质性的过滤,所以这里就可以造成一个文件读取的操作
01890-rbkq9w1rmh.png

我在这里输出一下路径,让你们更清晰的看下
86516-p51ln9ys8fj.png

  1. 任意文件写入漏洞(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}

该漏洞是通过从功能点去反向分析代码获得。
26680-k5qlysej0n.png

58115-ohnlmjodv7k.png

根据url定位到对应的函数
86495-40n4tsq351b.png

下图先判断了写入的文件名和内容是否为空。若为空即是非法操作。没什么影响
41234-335th5fffy5.png

然后就进入了POST时的判断
59976-qa3rybfctve.png

这里我们跟进到ifillegal函数,
这个函数是用来判断是否存在跨目录的操作。
87616-hfgwfh0avvc.png

如果未匹配到的话就尝试写入该文件
72640-cdyvamyg71.png

10377-lnrvwbiuxmf.png

79522-ty8s814dhvd.png

这个文件底下的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。接下来我们来分析一下
64125-mliss76i5w.png

44657-tujp8vdwcd.png
从上图中定位到代码
89292-dvriytacimr.png

57490-0lliirrtpeg.png

可以看出来,当上传一个zip压缩包的时候,代码会去匹配压缩包中是否存在个文件夹(命名规则为a-z0-9),以及文件夹中是否存在config.php文件。如果不存在的话即会返回"安装包格式错误"
84955-z1hsfbyipi.png

接下来也就仅仅判断了该应用是否存在,不存在的话就将数据拷贝到apps目录中。所以我们可以构造个压缩包进行上传
81995-htyz70aq04k.png

上传成功
04206-vhigyc1g53.png

77777-1tavc1o4rajh.png

61825-z8nbqz8iaj.png

0x04 结尾 {#0x04+%E7%BB%93%E5%B0%BE2831}

这篇文章就到这里,感谢各位的观看。

赞(4)
未经允许不得转载:工具盒子 » 代码审计之YXCMS