ClassCMS1.3自解压任意文件上传漏洞分析

0x01 前言

之前在某CMS也接触过自解压导致任意文件上传的漏洞,只要对请求URL过滤不严谨,以及逻辑处理存在缺陷便可导致上传可控,直接一步获取服务器权限。本次通过分析ClassCMS源码,从原理上理解此类漏洞。代审小白,分析不到位请大佬们多多体谅。

0x02 环境搭建

1、首先准备phpstudy,这里使用的是2016版本的,php版本为5.6.27


2、部署cms源码


3、访问http://192.168.150.9/index.php进行安装


4、输入相应配置信息,安装成功(数据库需提前新建好)

0x03 漏洞复现

1、输入账号密码登录进后台


2、进入应用商店主页


3、选择任意应用,点击下载


4、进入具体应用页面后,点击下载并抓包


可以看到第二个数据包中通过url穿参一个链接


5、解码后可以看到是向主页请求下载一个1.0版本的东西


6、访问一下可以看到是个zip压缩包


7、放包后查看一下返回结果
 


8、准备一个包含一句话木马的PHP文件,并进行压缩


9、通过python开启一个http服务


10、替换请求的URL链接为1.zip的链接,修改classhash的值,这个将作为文件夹的名字,所以最好取个不会重复的
 


11、一句话吗木马上传成功


12、执行命令
访问:http://192.168.150.9/class/test123/1.php?1=phpinfo();

0x04 漏洞分析

1、首先还是一样,先看入口文件index.php


2、定义那些可以先不用看,关键包含了一个cms.php文件


3、里面有好多方法,这里就不细细分析了,大体是定义了许多方法,在需要的时候进行调用。在同一目录下找到一个route.php文件


4、路由规则简单理解了,文件:方法:参数,回过头来看请求的URL


定位到shop/shop.php的downloadClass方法


5、路由定位到了,那么开始通读函数(因为会远程加载一些方法,所以将原有的代码段进行了分段),注释中为分析过程。

function downloadClass() {
            //是否传参classpath,否则返回空,这里过
        if(!is_hash(@$_POST['classhash'])) {
            Return ;
        }
        $classhash=$_POST['classhash'];
        $url=$_POST['url'];
//调用cms目录下的class.php文件中的get方法,检测是否存在同名的classhash
                if(C('cms:class:get',$classhash)) {
            echo(json_encode(array('msg'=>'应用已存在','error'=>1)));
            Return ;
        }
                //检测是否有curl_init函数
        if (!function_exists("curl_init")){
            echo(json_encode(array('msg'=>"服务器未安装Curl组件,无法下载应用文件",'error'=>1)));
            Return ;
        }
                //检测是否有zip_open或ZipArchive函数
        if(!function_exists('zip_open') || !class_exists('ZipArchive')) {
            echo(json_encode(array('msg'=>"未安装zip组件,无法解压安装包",'error'=>1)));
            Return ;
        }
                //解压后文件存放的路径
        $classdir=classDir($classhash);
                //赋值缓存目录路径
        $path=$GLOBALS['C']['SystemRoot'].$GLOBALS['C']['CacheDir'].DIRECTORY_SEPARATOR.'shop'.DIRECTORY_SEPARATOR;
                //查看目录是否存在,不存在则使用@mkdir进行创建
        if(!cms_createdir($path)) {
            echo(json_encode(array('msg'=>"创建缓存目录失败,无法下载",'error'=>1)));
            Return ;
        }
                //缓存文件,后面将会被删除
        $classfile=$path.md5($classhash.time()).'.class';
//跳转到本文件到download函数中,后面解释
        if(!C('this:download',$url,$classfile)) {
            echo(json_encode(array('msg'=>"下载失败",'error'=>1)));
            Return ;
        }
                //不存在post md5,过
        if(isset($_POST['md5']) && !empty($_POST['md5']) && function_exists("md5_file")) {
            if($_POST['md5']!=@md5_file($classfile)) {
                echo(json_encode(array('msg'=>"文件校验失败,请重新下载",'error'=>1)));
                Return ;
            }
        }

6、很标准的一个使用http下载文件的函数,curl_init创建实例,curl_setopt设置参数,curl_exec抓取、curl_close关闭。代码中通过这个函数获取搭建好的web服务中的zip文件

//调用cms目录下的class.php文件中的unzip方法,这里返回true
        if(C('cms:class:unzip',$classfile,$classdir)) {
            //返回true,使用unlink删除文件
            @unlink($classfile);
            //调用cms目录下的class.php文件中的refresh方法
            if(C('cms:class:refresh',$classhash)) {
                echo(json_encode(array('msg'=>"下载完成,请在应用管理页面中安装此应用")));
                Return ;
            }else {
                echo(json_encode(array('msg'=>"安装包格式错误,请重试",'error'=>1)));
                Return ;
            }
        }else{
            //返回false,也使用unlink删除文件
            @unlink($classfile);
            echo(json_encode(array('msg'=>"安装包解压失败,请重试",'error'=>1)));
            Return ;
        }
        Return ;
    }

7、在cms目录下的class.php文件中定位unzip方法,这里使用ZipArchive或者zip_open进行zip包的解压缩,未进行过滤


8、在cms目录下的class.php文件中定位refresh方法


9、首先第一个便是调用is_hash()方法,在cms/cms.php文件中找到is_hash方法


10、具体利用我在在线php代码执行中测试了,这也是一个好方法,在无法确定的时候,通过执行结果来判断。这里很明显没有进入到if判断中。

<?php

function is_hash($hash) {
    Return preg_match('/^[A-Za-z]{1}[A-Za-z0-9_]{0,31}$/',$hash);
}
if(!is_hash("test123")) {echo "123";}
else{echo "is hash";}


11、然后使用is_file函数检测文件,因为创建的目录名为test123,文件名为1.php,所以文件不存在,这里直接返回false。即在源代码中执行一下代码

else {
                echo(json_encode(array('msg'=>"安装包格式错误,请重试",'error'=>1)));
                Return ;
            }

12、与验证漏洞过程相匹配

0x05 总结

从一个利用poc到分析源码,需要从路由,到定位关键漏洞路径,到漏洞利用经过到链,最后到执行,其实只要能够每个函数都进行分析,再从数据处理那一块都角度进行,便会发现比想象中容易些。分享一个小tips,在一些PHP代码无法直接判断的时候,可以通过将代码拿出来,自己执行一遍进行判断。

文章初发布于先知社区:https://xz.aliyun.com/t/10461

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Mao10CMS是基于Thinkphp和Bootstrap开发的免费开源PHP建站系统,适用于搭建各种小型商城、购物分享、社区以及企业网站。当然,您也可以用它来做一个简单的博客。 简单易用是Mao10CMS一直追求的目标,在这里没有繁琐杂乱的后台,没有晦涩难懂的设置,您需要做的只是从安装到使用,然后把一切精力专注于内容建设上! 再次感谢大家对Mao10CMS的支持! Mao10CMS V2.4主要更新内容:商品模块功能增强,每个商品可自定义参数。屏蔽IP功能,可以屏蔽不受欢迎的用户IP,只要该用户登陆过的IP都会被自动保存并在执行屏蔽操作后,永久禁止登陆。另外就是进行了一些列的BUG修复以及对移动端显示的优化,当然移动端样式还是很初级,后期我们会有一次针对移动端的独立升级,全面优化手机浏览。 安装方法 Mao10CMS安装需求环境 PHP5.3+ & Mysql5.0+ 1、将Public文件夹、Application/Runtime文件夹、Application/Common/Conf/db.php、设置为可写。 2、将程序上传到网站空间后,访问http://你的域名/install.php进行安装。 3、安装完成后,删除网站根目录的install.php和Application/Home/Controller/InstallController.class.php。 伪静态设置方法 1、配置服务器: [ Apache ]环境 - httpd.conf配置文件中加载了mod_rewrite.so模块 - AllowOverride None 将None改为 All - 把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 其他环境下伪静态配置方法会陆续补充 2、修改Mao10CMS配置文件: 打开程序目录下的Application/Common/Conf/config.php文件,讲URL_MODEL的值从0修改为2。 只需2步,伪静态设置成功~ 支持 Mao10CMS承诺永久免费开源,您在使用过程中,如有任何疑问可以随时点击网站右侧的在线客服,进行咨询。
最新苹果cms海螺模版V20修复版源码 加广告代码 修复说明: 修复多线路时播放页列表点其他线路还是播放默认线路的问题 修复前台黑白切换和字体颜色切换失效 修复微信二维码没有对接苹果控制后台问题 优化换一换功能的图片加载速度 修复PC页面下滑空白问题 修复播放页列表不能滑动问题 修复换一换失效 分享无链接问题 修复页面下拉时顶部导航透明化 修复播放列表点击排序不能切换正序倒序 修复赞赏二维码且调用后台设置 使用说明: 上传模板至template目录内 主题设置后台: – 安装sg11扩展 – 后台快捷菜单配置添加 – 海螺主题设置,/admin.php/admin/conch/theme 安装说明: 上传到根目录下的template文件夹中解压,网站后台切换模板,清理缓存。 注意微信观看功能要在conch/js/jquery.stem.js 这个文件夹修改相应的内容 第301行 幻灯片推荐9 大图模式需要上传海报图,建议尺寸1680px*580px 小图模式需设置3个推荐才显示 热播推荐1 建议推荐18个最jia(适配换一换功能)。 切记一定要安装PHP扩展 《sg11》 php版本选择7.0~7.2 海螺主题首页广告代码: 这个代码建议放在【全站通栏横幅广告】 code <a href="https://www.qsgys.top"><img src=www.dkewl.com" width="100%" height="100"></a> <div class="ggimg"> <a href="https://www.dkewl.com" target="_blank"> <img src="图片链接"> </a> <a href="https://www.dkewl.com/" target="_blank"> <img src="图片链接"> </a> <a href="https://www.dkewl.com/" target="_blank"> <img src="图片链接"> </a> <a href="https://www.dkewl.com/" target="_blank"> <img src="图片链接"> </a> </div> <style> .ads.ads_w { max-height: 100% !important; } .ggimg { width: 100%; border-radius: 4px; } .ggimg a { display: block; margin: 0; width: 50%; height: 80px; float: left; } .ggimg a img { width: 100%; height: 100%; } @media only screen and (max-width:465px) { .ggimg a { width: calc(50% - 4px); } } </style>
classcms是一款常见的内容管理系统,其代码审计是对其源代码进行逐行检查和分析的过程。通过代码审计,我们可以评估classcms的安全性和漏洞风险,并提供相应的修复建议。 首先,代码审计可以检查classcms的输入验证和过滤机制是否健全。这包括用户输入的数据是否被适当地过滤和转义,以防止SQL注入、跨站脚本攻击等常见的漏洞。 其次,代码审计可以查看classcms是否存在任何明显的安全漏洞。例如,是否有未经验证的文件上传功能,是否在用户身份验证过程中使用了弱密码加密算法,是否以明文存储敏感信息等。如果发现这些问题,就需要及时修复以提升系统的安全性。 此外,代码审计还可以识别潜在的业务逻辑漏洞。例如,classcms是否存在会话固定、越权访问等安全问题,是否正确实现了用户权限控制,以及用户身份验证是否完整和准确。这些问题的存在可能会导致未授权的用户访问敏感数据或执行特权操作。 最后,代码审计还可以检查classcms是否使用最新的安全修复程序。定期更新classcms以及相关的第三方库和插件是保持系统安全的重要措施之一。通过代码审计,可以排查是否有遗漏的安全补丁,以保障classcms处于一个相对安全的状态。 总之,通过代码审计,我们可以全面了解classcms的安全性,并提供相关的修复建议,以帮助系统管理者和开发者提升classcms的安全性水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值