• [代码审计]eyoucms前台未授权任意文件上传


    0x00 背景

    来公司差不多一年了,然而我却依旧没有转正。约莫着转正也要到九月了,去年九月来的,实习,转正用了一年。2333

    废话不多说了,最近有其他的事要忙,很久没有代码审计了。难的挖不了,浅的没意思。那就随便选吧。

    在A5找了套源码,找找感觉。花了十来分钟审了一下,发现了个未授权任意文件上传。

    0x01 总体了解

    版本: v 1.1.3

    框架: tp 5.0

    目录如下:

    挺标准的tp二次开发目录,直接看application目录下的。

    外面的几个php文件就不解释了。粗略的看了一下配置文件和路由。

    全局过滤用了strip_sql加htmlspecialchars,tp5默认是走pdo的。除非不是故意留的坑,都不太可能会出现比较容易利用的注入点。

    application里面有多个模块。主要是admin,api,common,home四个。

    admin 顾名思义是后台处理的
    
    api 是一些接口
    
    common 是基础类。
    
    home 是前端

    0x02 发现任意文件上传的接口

    看了一下common和api两个模块,在api里面发现了这么一个接口。

    看到文件applicationapiUploadify.php

    public function preview(){
            
            // 此页面用来协助 IE6/7 预览图片,因为 IE 6/7 不支持 base64
            $DIR = 'preview';
            // Create target dir
            if (!file_exists($DIR)) {
                @mkdir($DIR);
            }
            
            $cleanupTargetDir = true; // Remove old files
            $maxFileAge = 5 * 3600; // Temp file age in seconds
            
            if ($cleanupTargetDir) {
                if (!is_dir($DIR) || !$dir = opendir($DIR)) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');
                }
            
                while (($file = readdir($dir)) !== false) {
                    $tmpfilePath = $DIR . DIRECTORY_SEPARATOR . $file;      
                    // Remove temp file if it is older than the max age and is not the current file
                    if (@filemtime($tmpfilePath) < getTime() - $maxFileAge) {
                        @unlink($tmpfilePath);
                    }
                }
                closedir($dir);
            }
            //前面的一大串,不用关注,看下面的就行了
            $src = file_get_contents('php://input');
            if (preg_match("#^data:image/(w+);base64,(.*)$#", $src, $matches)) {       
                $previewUrl = sprintf(
                    "%s://%s%s",
                    isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
                    $_SERVER['HTTP_HOST'],$_SERVER['REQUEST_URI']
                );
                $previewUrl = str_replace("preview.php", "", $previewUrl);
                $base64 = $matches[2];
                $type = $matches[1];
                if ($type === 'jpeg') {
                    $type = 'jpg';
                }
            
                $filename = md5($base64).".$type";
                $filePath = $DIR.DIRECTORY_SEPARATOR.$filename;
            
                if (file_exists($filePath)) {
                    die('{"jsonrpc" : "2.0", "result" : "'.$previewUrl.'preview/'.$filename.'", "id" : "id"}');
                } else {
                    $data = base64_decode($base64);
                    file_put_contents($filePath, $data);
                    die('{"jsonrpc" : "2.0", "result" : "'.$previewUrl.'preview/'.$filename.'", "id" : "id"}');
                }
            } else {
                die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "un recoginized source"}}');
            }
        }

    这是一个图片预览的接口,通过php://input接收图片base64编码数据,然后解码,写入文件。返回图片路径。

    正则获取了图片的后缀之后,简单判断了一下就没有下文了。然后将获取到的文件后缀,与base64文件数据的md5值拼接成为文件名。最后解码数据,写入。返回路径

    追溯一下这个api是否需要登录?(=>等于extends)

    appapicontrollerUploadify =>appapicontrollerBase => appcommoncontrollerCommon =>thinkController

    看了一下没有发现有判断权限或认证的代码,在 appapicontrollerBase 类里面看到似乎是权限判断的代码:

    但这里的代码都是空的。。。

    那么,整个漏洞的利用逻辑就是往http://www.example.com/index.php/api/Uploadify/preview 打一个base64的post数据包。

     漏洞原理很简单。我想这里会出现这么一个问题,大概是作者认为data:image/ 这样的数据,只能是图片?

    0x03 漏洞影响

    在官网下了一个1.0版本的,对比了一下发现,1.0版本也是存在该漏洞。左1.1.3 ,右1.0

    这里的差异只是我添加的一个备注。

    昨晚用fofa跑了一下,发现存在该漏洞的网站有50%以上。

    0x04 漏洞修复建议

    使用白名单判断文件后缀名。

    在Uploadify.php中213行到214行的代码修改为如下:

    if ($type !== 'jpeg' || $type !=='png' || $type !=='gif' || $type!=='jpg') {
           exit();
    }
    if ($type === 'jpeg') {
            $type = 'jpg';
    }

    0x05 总结

    搜了一下这个CMS的历史漏洞,发现只有seebug上面的一个后台任意文件读取漏洞。这个洞藏了很久啊。。

    整个漏洞很简单,写篇文章记录一下,除除博客上面的草。

    之后想总结一下tp框架二次开发CMS的奇葩漏洞,不知道什么时候能总结出来。。

    声明:本文章只用于学习研究之用,禁止用于违法犯罪。

  • 相关阅读:
    Linux下防火墙的相关命令
    java中的异常总结
    Java中的==和equals的区别
    一个简单的前后端分离项目,适合新手练手
    入住博客园鸭
    centos7 安装 Python PIL模块
    Linux 装机错误解决
    Python 爬取煎蛋网妹子图片代码
    Python 简易聊天机器人
    Python员工信息表练习
  • 原文地址:https://www.cnblogs.com/r00tuser/p/9405870.html
Copyright © 2020-2023  润新知