• MKCMS代码审计小结


    MKCMS代码审计小结

    MKCMS V6.2 (以下源码来自网络)
    MKCMS米酷影视源码6.2开源CMS
    下载地址链接:https://pan.baidu.com/s/1cZX5x9SbcXMCMXismfH4ow 提取码:k3ox
    备用下载地址:https://www.lanzous.com/ib7zwmh

    0x00 全局过滤分析

    /system/library.php:使用addslashes转义入参, 注意到$_SERVER未被过滤

    0x01 验证码重用

    /admin/cms_login.php验证码处的逻辑如下,比较session中的验证码和输入的是否一致,不一致就进入alert_href,这个js跳转,实际是在刷新页面

    /admin/cms_login.php:
    <?php 
     6   ...
     7  if(isset($_POST['submit'])){
     8:     if ($_SESSION['verifycode'] != $_POST['verifycode']) {
     9          alert_href('验证码错误','cms_login.php');
    10      }
       ...
    


    跳转后就会刷新验证码,然而我用的是burp,默认是不解析js的

    全局搜索这个$_SESSION['verifycode'],发现只在/system/verifycode.php有赋值,也就是说,如果使用验证码后,我们不跟随js跳转,就不会重置验证码,验证码也就能被重复使用

    使用burp重放,的确如此,验证码形同虚设

    0x02 前台注入1:/ucenter/repass.php

    看了下历史的漏洞,在/ucenter/repass.php有个越权修改密码的洞(CVE-2019-11332),跟进去发现原来还有注入,以下是分析过程

    /ucenter/repass.php
    <?php
    ...
    if(isset($_POST['submit'])){
    $username = stripslashes(trim($_POST['name']));
    $email = trim($_POST['email']);
    // 检测用户名是否存在
    $query = mysql_query("select u_id from mkcms_user where u_name='$username' and u_email='$email'");
      ...
    

    前面说到全局对$_POST存在addslash的过滤(加转义),上面又把参数给stripslashes了(去掉),这不就是个注入?

    后来复盘,实际上,这个问题coolcat师傅早在去年就在先知上提出来了:某KCMS5.0 代码审计 (前台注入&任意用户密码重置),师傅nb!

    0x03 前台注入2:/ucenter/active.php

    /ucenter/active.php?verify=1存在注入

    /ucenter/active.php
    <?php
    ...
    $verify = stripslashes(trim($_GET['verify']));  //去掉了转义用的
    $nowtime = time();
    $query = mysql_query("select u_id from mkcms_user where u_question='$verify'");
    $row = mysql_fetch_array($query);
    ...
    

    sqlmap直接跑即可

    [INFO] GET parameter 'verify' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
    [INFO] GET parameter 'verify' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
    

    0x04 前台注入3:/ucenter/reg.php

    /ucenter/reg.phpname参数,存在注入

    /ucenter/reg.php
    <?php 
    ...
    if(isset($_POST['submit'])){
    $username = stripslashes(trim($_POST['name']));
    // 检测用户名是否存在
    $query = mysql_query("select u_id from mkcms_user where u_name='$username'");
      ...
    

    0x05 任意用户密码找回(密码可被穷举)

    任意用户密码找回
    这个问题主要是/ucenter/repass.php代码里,找回密码的逻辑有问题,第10行查询到username、 email能对应上之后,14行就直接重置密码了。。。而且密码的范围在12行有写,只有90000种可能,重置之后,burp跑一下不就ok了?(当然要结合验证码重用才能有效爆破)

    0x06 备份文件路径可猜解

    这个备份功能也太顶了,而且还是那么简单的文件名
    /backupdata/movie.sql

    /admin/cms_backup.php
    <?php
    $filename="../backupdata/".DATA_NAME.".sql"; //存放路径,默认存放到项目最外层
    $fp = fopen($filename,'w');
    fputs($fp,$mysql);
    fclose($fp);
    alert_href('备份成功!','cms_data.php');
    ?>

    全局搜DATA_NAME变量,是安装时候设置的数据库名



    默认的DATA_NAME值是movie

    0x07 前台文件上传

    /editor/php/upload_json.php?dir=file
    源码如下

    <?php 
    $ext_arr = array(
        'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
        'flash' => array('swf', 'flv'),
        'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
        'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2' ,'7z'),
    );
    ...
    $file_name = $_FILES['imgFile']['name'];
    ...
    //获得文件扩展名
        $temp_arr = explode(".", $file_name);
        $file_ext = array_pop($temp_arr);
        $file_ext = trim($file_ext); /*将file_ext转换为字符串。。。无弱类型问题了**/
        $file_ext = strtolower($file_ext);  //将file_ext转换为字符串。。。无弱类型问题了
        //检查扩展名,是否在大的数组中,in_array存在若类型问题
        if (in_array($file_ext, $ext_arr[$dir_name]) === false) {
            alert("上传文件扩展名是不允许的扩展名。
    只允许" . implode(",", $ext_arr[$dir_name]) . "格式。");
        }result
      ...
    

    可以上传列表里的文件,只是无法拿shell

    POST /editor/php/upload_json.php?dir=file HTTP/1.1
    Host: localhost
    Content-Length: 306
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryni3BwmVzIUwKfSSC
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Referer: http://www.ygtv520.com/editor/php/upload_json.php
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: close
    
    ------WebKitFormBoundaryni3BwmVzIUwKfSSC
    Content-Disposition: form-data; name="imgFile"; filename="1.jpg.html"
    Content-Type: application/octet-stream
    
    11111111
    ------WebKitFormBoundaryni3BwmVzIUwKfSSC
    Content-Disposition: form-data; name="upload"
    
    Send
    ------WebKitFormBoundaryni3BwmVzIUwKfSSC--
    

    响应里返回文件地址

  • 相关阅读:
    Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据
    Android商城开发系列(五)—— 商城首页回到顶部和搜索框布局实现
    Android商城开发系列(一)——开篇
    Android商城开发系列(四)——butterknife的使用
    Android商城开发系列(三)——使用Fragment+RadioButton实现商城底部导航栏
    Android商城开发系列(二)——App启动欢迎页面制作
    使用git克隆指定分支的代码
    mongodb 3.x WiredTiger存储优化测试
    oracle 文件导出
    本地安装gem install --local redis-stat-0.4.13.gem
  • 原文地址:https://www.cnblogs.com/0daybug/p/12742073.html
Copyright © 2020-2023  润新知