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

前言

此前在测试过程中遇到过此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         }

View Code

发现其中有一个正则过滤: 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文件。

复现成功。

转载于:https://www.cnblogs.com/Spec/p/11188198.html

YZMCMS V5.3后台 SSRF相关推荐

  1. Dedecms V5.7后台的两处getshell

    在这个帖子里我把两个洞一起写出来. 第一个是常见的思路,把语句写入inc文件,然后在其他的include语句中,包含了恶意代码进而getshell. 漏洞代码在:/dede/sys_verifies. ...

  2. YzmCMS跨站脚本漏洞(CVE-2020-22394)复现

    简介 YzmCMS 基于 PHP 的轻量级开源内容管理系统. 漏洞概述 YzmCMS v5.5版本存在跨站脚本漏洞,该漏洞源于编辑器中的member contribution function包含一个 ...

  3. php信息录入系统_YzmCMS PHP轻量级信息管理系统 v5.8

    YzmCMS是一款轻量级开源内容管理系统,它采用OOP(面向对象)方式自主开发的框架.基于PHP+Mysql架构,并采用MVC框架式开发的一款高效开源的内容管理系统,可运行在Linux.Windows ...

  4. mysql开发cms_GitHub - johnsonzhu/yzmcms: YzmCMS是由袁志蒙独自开发的一款基于PHP+Mysql架构的轻量级开源内容管理系统。...

    YzmCMS V5.2 正式版 YzmCMS是一款轻量级开源内容管理系统,它采用OOP(面向对象)方式自主开发的框架.基于PHP+Mysql架构,并采用MVC框架式开发的一款高效开源的内容管理系统,可 ...

  5. PHP预设的配置模板,YzmCMS默认模板说明

    摘要:电脑版前端默认模板目录为:/application/index/view/default/apply_link.html [申请友情链接模板] authority_confirm.html [阅 ...

  6. Penetration_Testing_POC-About 渗透测试有关的POC、EXP、脚本、提权、小工具等

    Penetration_Testing_POC 搜集有关渗透测试中用到的POC.脚本.工具.文章等姿势分享,作为笔记吧,欢迎补充. Penetration_Testing_POC 请善用搜索[Ctrl ...

  7. 学习笔记-B/S - Exploits

    B/S - Exploits 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. 大纲 各类论坛/CMS框架 AEM 74CMS dedeC ...

  8. mysql开发cms_YzmCMS开源内容管理系统

    YzmCMS V5.4 正式版 YzmCMS是一款轻量级开源内容管理系统,它采用OOP(面向对象)方式自主开发的框架.基于PHP+Mysql架构,并采用MVC框架式开发的一款高效开源的内容管理系统,可 ...

  9. u8 附件上传后存放路径_织梦DedeCms附件按月份保存的修改方法

    正常情况下,dedecms织梦系统的图片附件是按日保存的,一天一个文件夹, 时间长了, 这样在allimg中就会生成很多文件夹, 不方便管理. 虽然,dedecms织梦的后台设置有"附件保存 ...

最新文章

  1. DOS命令大全 黑客必知的DOS命令集合
  2. 【ZooKeeper Notes 28】ZooKeeper典型应用场景一览
  3. Python__configparser模块
  4. ui与html界面区别,ui前端和web前端的区别是什么?
  5. 交换机的工作转发原理
  6. 万字长文带你看尽深度学习中的12种卷积网络
  7. php建一个表按删除就删除,mysql表的清空、删除和修改操作详解
  8. NVIDIA DeepStream5.0官方总结(改动版)
  9. (最小生成树) Borg Maze -- POJ -- 3026
  10. GIS中的基本概念收集
  11. tcp下载窗口太小的问题_面试官:换人!他连 TCP 这几个参数都不懂(二)
  12. Mac系统用命令打开ping端口的方法
  13. Mac环境下使用XMAPP 安装testlink
  14. 【火炉炼AI】深度学习004-Elman循环神经网络
  15. 不止“宏彦获水”还有它们!
  16. 有趣大会 · ACL2022 (Findings篇)
  17. Java面试--Java内存模型
  18. error: no matching function for call QDebug:: QDebug
  19. Android彩信数据库分析
  20. 【IPv6】设置win10和win11允许访问IPv6站点

热门文章

  1. 云桌面技术在全国计算机等级考试中发挥护航作用
  2. 使用poi进行excel导入并解析插入数据库
  3. 将本地SHH文件导入SourceTree配置
  4. Select下拉列表框(添加、删除option)
  5. MySQL 日期时间类型怎么选?千万不要乱用!
  6. 我的梦想是十年内成为架构师,该怎么办?
  7. YGC前后新生代变大?
  8. Docker inspect 命令
  9. 消息队列设计的精髓基本都藏在本文里了
  10. REGULAR NOMINATION AGGRESSIVE NOMINATION