YZMCMS V5.3后台 SSRF
当改变命运的时刻降临,犹豫就会败北。
前言
此前在测试过程中遇到过此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的更多相关文章
- FineCMS v5.4.1 后台getshell
0x01.前言 最近在学代码审计,拿finecms学习的时候偶然发现的,应该算个1day吧 0x02.正文 FineCMS v5.4.1 后台域名配置处 域名配置文件config/domain.php ...
- dede后台title怎么修改的?去掉XXXX-织梦内容管理系统V5.7
dede后台title怎么修改的? 去掉XXXX-织梦内容管理系统V5.7 打开include/common.inc.php的文件. $cfg_version = 'V57_UTF8_SP1';(这是 ...
- DedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221)
dedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2 ...
- CYQ.Data V5 分布式自动化缓存设计介绍
前方: 其实完成这个功能之前,我就在思考:是先把想法写了来,和大伙讨论讨论后再实现,还是实现后再写文论述自己的思维. 忽然脑后传来一个声音说:你发文后会进入发呆阶段. 所以还是静下心,让我轻轻地把代码 ...
- 一套后台管理html模版
最近自己需要一套后台管理的模版,然后去网上查找,模版的确很多,但是适合我的并不多.我需要的模版是不会很大,我能够控制代码,样式不要太古朴,最好有点CSS3的效果.最后终于找到一张主页,然后再根据这个主 ...
- 织梦后台更新,报错DedeCMS Error:Tag disabled:"php" more...
网站采用织梦v5.7版本,在做过一次后台补丁更新后,再对网站“生成”操作的时候,无厘头出现报错“ 网站后台--系统--系统基本参数---其他选项 ---模板引擎禁用标签:php ,把php删掉 保存 ...
- 为dedecms v5.7的ckeditor添加jwplayer插件
dedecms v5.7的默认编辑器是ckeditor,不过用的是php版本的,默认的工具栏不在config.js里面配置,而是在ckeditor.inc.php里面配置,默认的工具栏是$toolba ...
- (转)织梦dedecms后台发布文章提示“标题不能为空”
问题症状:V5.7登录后台后,发布英文标题没问题,发布中文会提示“标题不能为空”. 问题根源:htmlspecialchars在php5.4默认为utf8编码,gbk编码字符串经 htmlspecia ...
- unity3d和php后台简单交互--一
unity3d开发时,用PHP作为后台是个不错的选择.对一些数据吞吐量不是很大的游戏,比如某个游戏的排名,登录等等,一般的php程序能够胜任了,并且php语言简单,开发容易对数据库尤其是mysql的支 ...
随机推荐
- yii2.0 ActiveForm 单选框与复选框使用
yii2.0 中的ActiveForm 复选框的使用 默认的复选框选项为纵向的<?= $form->field($model, 'line')->checkboxList(Pictu ...
- appium每次运行不初始化
最近测试公司软件遇到一个问题,每次运行Appium测试代码,打开软件都是初始化,每次的新手教程以及无法记住密码一堆问题,导致效率很低,而且定位有时候出问题. 先看初始化的代码 1 from appiu ...
- 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归
(题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...
- sharding调试setAutoCommit
emmm应该是有manager的 因为指定了@Primary 不然容器启动的时候创建sessionFactory就因为多个DataSource异常了,后面会滚的时候manager为null也会有运行时 ...
- 小样本元学习综述:A Concise Review of Recent Few-shot Meta-learning Methods
原文链接 小样本学习与智能前沿 . 在这个公众号后台回复'CRR-FMM',即可获得电子资源. 1 Introduction In this short communication, we prese ...
- JZOJ2020年8月12日提高组反思
JZOJ2020年8月12日提高组反思 真·难亿一点点 T1 题目长并附带伤害-- 暴力搜 对于字符串,我选择\(Pascal\) T2 概率问题,再见 T3 样例没懂,再见 T4 有史以来见过的条件 ...
- Python基础教程目录
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python部分代码样例 老猿Python重难点知识博文汇总 老猿Python博客地址 第1章 Python学习环境构建目 ...
- PyQt(Python+Qt)学习随笔:QToolBox工具箱currentItem对应的index、text、name、icon、ToolTip属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在Designer中,toolBox主要有如下属性: 可以看到,toolBox的属性主要是与当前项相 ...
- PyQt学习随笔:QTableWidget水平表头horizontalHeader、竖直表头verticalHeader的相关操作方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件的表头包括水平表头和竖直表头,水平表头每节对应表格的一列,竖直表头对 ...
- PyQt学习随笔:使用PyCharm+PyQt开发遇到的坑
最近三天,老猿都在使用PyCharm+QtDesigner工具,通过xlwings读取Excel的数据到TableView中显示的练习,本以为很容易的一件事,断断续续持续了三天时间才终于成功.在这个过 ...