当改变命运的时刻降临,犹豫就会败北。

前言

此前在测试过程中遇到过此CMS,久攻不下,于是便尝试代码审计,不得不说这套CMS还是挺安全的,读起来也简单,也适合初学代码审计的同学去阅读,不过漏洞真的不多,本人绞尽脑汁终于算是审计出一个弱鸡漏洞。

                  

漏洞分析

漏洞位于 application\collection\controller\collection_content.class.php 中的 collection_test 函数,此函数为获取一个网页中的URL,并获取此URL的值输出。类似于爬虫,爬取网页中URL对应的文章。以下为主要功能函数: 

首先查看 get_content()函数:

可以看到传进来的URL不进过任何检测规则就带入 file_get_content()函数,那么倘若此 $url 为 file:// 伪协议的话,如此则产生任意文件读取漏洞。那么此时回头看 $url的值是否可控。

可以看到,$url 的值来自于 collection_node 表中的 urlpage 字段的值。如果要 $url 可控,那么就要找到一个数据库写入操作,并且 urlpage 字段的值可控。再看: 

此函数则是将$_POST的数据写入到表中。看 insert 函数如何写。

可以看到在写入过程中经过过滤函数 safe_data() :

假设payload为:file://C:/Windows/System32/drivers/etc/hosts  可以看到此过滤函数对此payload并无任何影响,所以导致插入数据库中的urlpage字段的值可控,由此导致$url的值可控。再往下查看 get_sub_content()函数:

可以看到此函数是将 $html 中的 $start 和 $end 之间的值取出来,而 $start 表示区间开始的html表示,$end 表示区间结束的html标识。并且这两个标识不能为空。于是可以构造payload为:<test123>file://C:/Windows/System32/drivers/etc/hosts</test123>,如此进过上述函数则会取出payload并返回。再往下:

进入get_all_url()函数:

 1 public static function get_all_url($html, $url_contain='', $url_except='') {
2
3 $html = str_replace(array("\r", "\n"), '', $html);
4 $html = str_replace(array("</a>", "</A>"), "</a>\n", $html);
5 preg_match_all('/<a ([^>]*)>([^\/a>].*)<\/a>/i', $html, $out);
6 $data = array();
7 foreach ($out[1] as $k=>$v) {
8 if (preg_match('/href=[\'"]?([^\'" ]*)[\'"]?/i', $v, $match_out)) {
9 if ($url_contain) {
10 if (strpos($match_out[1], $url_contain) === false) {
11 continue;
12 }
13 }
14
15 if ($url_except) {
16 if (strpos($match_out[1], $url_except) !== false) {
17 continue;
18 }
19 }
20 $url2 = $match_out[1];
21 $url2 = self::url_check($url2, self::$url);
22
23 $title = strip_tags($out[2][$k]);
24
25 if(empty($url2) || empty($title)) continue;
26
27 $data['url'][$k] = $url2;
28 $data['title'][$k] = $title;
29
30 } else {
31 continue;
32 }
33 }

发现其中有一个正则过滤: preg_match_all('/<a ([^>]*)>([^\/a>].*)<\/a>/i', $html, $out); ,此正则获取<a (value)>(value)</a>括号中的值,并将其合并为一个数组。再往下看,又出现一个正则过滤:

preg_match('/href=[\'"]?([^\'" ]*)[\'"]?/i', $v, $match_out) ,此规则为href="(value)",并获取括号中value的值给$match_out,那么此时我们的payload需更改为:

1   <test123><a href="file://C:/Windows/System32/drivers/etc/hosts">test</a></test123>

此时在往下看,有一个url_check函数:

可以看到会检测最后取出payload的值中是否有  ://  ,巧的是我们的payload正好符合,所以该检测函数并未对payload造成影响。再往下回到最初的函数中:

至此,$articleurl 的值为我们最后的payload:   file://C:/Windows/System32/drivers/etc/hosts      ,直至此时,$article 的值为读取到的本地任意文件的内容,再往下看 get_filter_html()函数:

$data['content'] = self::replace_item(self::get_sub_content($html, $config['content_rule'][0], $config['content_rule'][1]), $config['content_html_rule']);
return $data;

由于篇幅限制,只拿出影响读取内容的代码,其实这段代码对结果并无影响,有兴趣自己下来阅读。在往下看到:

admin_tpl()函数为加载模板的函数,此模板位于:application\collection\view\collection_test.html

此处只截出影响此漏洞的代码。此处可以看到,将读取出的任意文件内容显示出来,到此则漏洞分析完毕。

漏洞复现

复现环境

操作系统:windows 7

php版本:5.5.38 + Apache

mysql版本:5.5.53

首先登陆后台,进入 模块管理--->采集管理

添加节点

此处网站配置框中,可以在自己的vps服务器中搭建一个html网页,其内容为payload:

<test123><a href="file://C:/Windows/System32/drivers/etc/hosts">123</a></test123>

获取网站中的区域开始html为<test123>,区域结束的HTML为</test123>。点击保存。

再次点击测试采集,则读取payload中的hosts文件。

复现成功。

YZMCMS V5.3后台 SSRF的更多相关文章

  1. FineCMS v5.4.1 后台getshell

    0x01.前言 最近在学代码审计,拿finecms学习的时候偶然发现的,应该算个1day吧 0x02.正文 FineCMS v5.4.1 后台域名配置处 域名配置文件config/domain.php ...

  2. dede后台title怎么修改的?去掉XXXX-织梦内容管理系统V5.7

    dede后台title怎么修改的? 去掉XXXX-织梦内容管理系统V5.7 打开include/common.inc.php的文件. $cfg_version = 'V57_UTF8_SP1';(这是 ...

  3. DedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221)

    dedeCMS  V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2 ...

  4. CYQ.Data V5 分布式自动化缓存设计介绍

    前方: 其实完成这个功能之前,我就在思考:是先把想法写了来,和大伙讨论讨论后再实现,还是实现后再写文论述自己的思维. 忽然脑后传来一个声音说:你发文后会进入发呆阶段. 所以还是静下心,让我轻轻地把代码 ...

  5. 一套后台管理html模版

    最近自己需要一套后台管理的模版,然后去网上查找,模版的确很多,但是适合我的并不多.我需要的模版是不会很大,我能够控制代码,样式不要太古朴,最好有点CSS3的效果.最后终于找到一张主页,然后再根据这个主 ...

  6. 织梦后台更新,报错DedeCMS Error:Tag disabled:"php" more...

    网站采用织梦v5.7版本,在做过一次后台补丁更新后,再对网站“生成”操作的时候,无厘头出现报错“ 网站后台--系统--系统基本参数---其他选项 ---模板引擎禁用标签:php  ,把php删掉 保存 ...

  7. 为dedecms v5.7的ckeditor添加jwplayer插件

    dedecms v5.7的默认编辑器是ckeditor,不过用的是php版本的,默认的工具栏不在config.js里面配置,而是在ckeditor.inc.php里面配置,默认的工具栏是$toolba ...

  8. (转)织梦dedecms后台发布文章提示“标题不能为空”

    问题症状:V5.7登录后台后,发布英文标题没问题,发布中文会提示“标题不能为空”. 问题根源:htmlspecialchars在php5.4默认为utf8编码,gbk编码字符串经 htmlspecia ...

  9. unity3d和php后台简单交互--一

    unity3d开发时,用PHP作为后台是个不错的选择.对一些数据吞吐量不是很大的游戏,比如某个游戏的排名,登录等等,一般的php程序能够胜任了,并且php语言简单,开发容易对数据库尤其是mysql的支 ...

随机推荐

  1. 手把手为大家演示fat32转ntfs操作过程,一看就会

    fat32和ntfs是两种我们较为常见的u盘或者硬盘格式.它们都有着各自的特点,但是相比之下,使用ntfs文件格式我们可以做出很多fat32不能实现的功能.在日常生活中,我们会面临到需要把fat32转 ...

  2. 【flask-migrate】:ERROR [root] Error: Target database is not up to date.

    问题:flask-migrate数据迁移添加新的表,执行python manager.py db migrate 出现Target database is not up to date 原因: 1. ...

  3. 一个定时任务管理器,基于Go语言和beego框架开发

    链接 https://github.com/lisijie/webcron 安装说明 系统需要安装Go和MySQL. 获取源码 $ go get github.com/lisijie/webcron ...

  4. Windows启用SSH命令

    前言 直接通过windows自带的CMD终端远程连接服务器,需要先安装好OpenSSH客户端. 安装 使用浏览器打开官网: https://www.mls-software.com/opensshd. ...

  5. NOIP2015 解题报告

    Day1 T3 运输计划 二分之后做一遍树上差分,找出被所有时间超限的运输计划覆盖的花费时间最长的航道,将其改造成虫洞. LCA 用倍增求可能会被卡常,建议用 Tarjan 求.

  6. 一万三千字的HashMap面试必问知识点详解

    目录 概论 Hasmap 的继承关系 hashmap 的原理 解决Hash冲突的方法 开放定址法 再哈希法 链地址法 建立公共溢出区 hashmap 最终的形态 Hashmap 的返回值 HashMa ...

  7. 程序员说:为什么喜欢大量使用 if……else if替代switch?

    请用5秒钟的时间查看下面的代码是否存在bug. OK,熟练的程序猿应该已经发现Bug所在了,在第13行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了. 缺点一. 语法 ...

  8. Hybrid接口应用

    简介:VLAN10内通信,VLAN20内通信,VLAN30与VLAN10.VLAN20.VLAN30皆可通信 Hybrid接口应用拓扑图: 一.配置PC机 ip 并测试相互能否ping通 PC名称 I ...

  9. How tomcat works(深入剖析tomcat)servlet容器

    How tomcat works (5)servlet容器阅读笔记 第四章阅读了tomcat默认连接器的实现,当时connector中的使用的容器是自定义的容器,也是非常之简单奥,一个人就干完了所有的 ...

  10. 冲刺随笔——Day_Ten

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...