zoukankan      html  css  js  c++  java
  • 米酷CMS 7.0.4代码审计

    工具:seay源代码审计系统

    源代码:网上很好找,这里就懒得贴上了,找不到的话可以给我留言

    后面一段时间会深入学习安全开发,代码审计,内网渗透和免杀,快快成长。

    审这个系统是因为在先知上看到一篇审它老版本的文章,索性拿来练一下生疏的手。

    部署也不再赘述,直接使用phpstudy快速部署,放置源代码后访问路径下

    /install/index.php

    部署后的界面如下:

    源代码放进seay进行白盒审计

    挨个进行查看

    第一个疑似注入点,可以看到包含了inc.php文件,先看一下过滤没有

    套娃,在library.php里面发现了全局过滤

    贴出源代码:

    if (!get_magic_quotes_gpc()) {
        if (!empty($_GET)) {
            $_GET = addslashes_deep($_GET);
        }
        if (!empty($_POST)) {
            $_POST = addslashes_deep($_POST);
        }
        $_COOKIE = addslashes_deep($_COOKIE);
        $_REQUEST = addslashes_deep($_REQUEST);
    }
    function addslashes_deep($_var_0)
    {
        if (empty($_var_0)) {
            return $_var_0;
        } else {
            return is_array($_var_0) ? array_map('addslashes_deep', $_var_0) : addslashes($_var_0);
        }
    }
    

    即没有开启gpc过滤敏感字符则使用addslashes_deep函数,addslashes_deep函数是一个魔改addslashes函数的函数,起到过滤敏感字符的作用。

    可以看到此处的过滤没有过滤$_SERVER参数,后面有相关的地方可以留意一下。

    SESSION在Cookie参数中,所以被过滤了,继续往后面看

    来到很多文章都写过的ucenter位置,reg.php内容中有这样一段代码

    <?php 
        include('../system/inc.php');
        if(isset($_SESSION['user_name'])){
            header('location:index.php');
        };
        if(isset($_POST['submit'])){
            $username = stripslashes(trim($_POST['name']));
            // 检测用户名是否存在
            $query = mysqli_query($conn,"select u_id from mkcms_user where u_name='$username'");
            if(mysqli_fetch_array($query)){
                echo '<script>alert("用户名已存在,请换个其他的用户名");window.history.go(-1);</script>';
                exit;
             }
            $result = mysqli_query($conn,'select * from mkcms_user where u_email = "'.$_POST['email'].'"');
            if(mysqli_fetch_array($result)){
            echo '<script>alert("邮箱已存在,请换个其他的邮箱");window.history.go(-1);</script>';
            exit;
        }

    这里获取到了我们POST输入的name

    $username = stripslashes(trim($_POST['name']));

    而因为include了inc.php文件,$_POST进来的输入被全局过滤了,如果我们使用了单引号就会被加上反斜杠,但是!

    这里又在外面使用了

    stripslashes

    函数,关于该函数:

    同时我们可以通过页面返回的值来判断查询结果是否正确,即该位置存在布尔注入

    使用方法:

    查询一个已注册的用户名,然后进行布尔注入

    本地测试(POST payload 注意test用户已注册)

    永真式:

    name=test' and '1'='1&email=test%40qq.com&password=test&submit=

    永假式:

    name=test' and '1'='2&email=test%40qq.com&password=test&submit=

    burp抓包放进sqlmap里面跑

    可以直接使用工具跑出来

    接着全局搜索使用了stripslashes函数的位置

    active.php代码如下

    <?php
        include('../system/inc.php');
        $verify = stripslashes(trim($_GET['verify']));
        $nowtime = time();
        $query = mysqli_query($conn,"select u_id from mkcms_user where u_question='$verify'");
        $row = mysqli_fetch_array($query);
        if($row){
            echo $row['u_id'];
            $sql = 'update mkcms_user set u_status=1 where u_id="'.$row['u_id'].'"';
            if (mysqli_query($conn,$sql)) {
                alert_href('激活成功!','login.php');
            }
        }else{
            $msg = 'error.';
        }
        echo $msg;
    ?>

    我们可以通过是否echo $row['u_id']来进行注入

    去数据库里面查一下u_question是多少:

    其逻辑在reg.php中,简单贴一下代码:

    $token = md5($username.$password.$regtime); //创建用于激活识别码
    $data['u_question'] =$token;

    实际上真实环境中我们应该是拿不到u_question的,但是这里我们可以使用时间盲注来获取数据库内容

    repass.php也是类似的点存在注入

    $username = stripslashes(trim($_POST['name']));
    $email = trim($_POST['email']);
    // 检测用户名是否存在
    $query = mysqli_query($conn,"select u_id from mkcms_user where u_name='$username' and u_email='$email'");

    而除了因为stripslashes导致的注入外,代码里面还有因为直接拼接SQL语句而导致的注入,简单举两处:

    admin_edit.php里

        $sql = 'update mkcms_manager set ' . arrtoupdate($_data) . ' where m_id = ' . $_GET['id'] . '';
        if (mysqli_query($conn,$sql)) {
            alert_href('管理员修改成功!', 'cms_admin.php');
        } else {
            alert_back('修改失败!');
        }

    这里的 $id 直接进行拼接,从而造成了注入,因为不需要使用引号进行闭合,所以之前的全局过滤也形同虚设了。

    ad.php 里

    if (isset($_GET['del'])) {
        $sql = 'delete from mkcms_ad where id = ' . $_GET['del'] . '';
        if (mysqli_query($conn,$sql)) {
            alert_href('删除成功!', 'cms_ad.php');
        } else {
            alert_back('删除失败!');
        }
    }

    这里也是通过拼接组成的SQL语句,存在SQL注入漏洞

    逻辑漏洞以前有老哥提到过验证码复用+暴力遍历从而任意用户密码重置,下次还是审一个没人审的小众代码吧太菜了

     

    参考链接:

  • 相关阅读:
    MySQL大表优化方案
    写一个简单脚本检测mysql主从是否正常
    Nginx配置基于ip的虚拟主机
    推荐一些好的linux学习网站
    shell基础入门(一)
    centos7和linux防火墙配置入门
    centos7.0之vsftpd随笔
    获取系统相关属性
    linux 文件管理操作入门
    ANSI文件操作
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/13993849.html
Copyright © 2011-2022 走看看