代码审计进修之某shop恣意文件删除 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

代码审计进修之某shop恣意文件删除

申博_安全预警 申博 188次浏览 已收录 0个评论

之前看了phpoop师傅的PbootCMS破绽合集之审计全过程文章,一向没有真正的审过一套cms,代码审计只是停留在ctf题的层面上。以是接下来预备仔细审计一些cms。菜鸡文章,愿望大佬们不要喷。

检察网站目次组织肯定基本内容

某shop-V3.1.1
├─ cache          缓存目次(自动建立)
├─ data           数据目次
│  ├─ database     数据库文件备份目次
│  ├─ uploads     上传数据目次
├─ framework      Tiny 框架目次
├─ install        html模板
├─ logs           日记目次(自动建立)
├─ protected     运用珍爱代码目次
│  ├─ classes     自在扩大类目次,可本身配制
│  ├─ config     配制文件目次,可本身指定
│  ├─ controllers     控制器目次
│  ├─ extension     顺序扩大目次
│  ├─ widgets     插件目次
│  ├─ views     视图目次
├─ runtime       运转时天生的编译目次(自动建立)
├─ static        共用的静态文件
├─ themes        主题目次
│  ├─ default     默许主题
│  ├─├─skins     皮肤目次
│  ├─├─widgets     专属主题的插件目次
│  ├─├─views     视图目次
├─ index.php      前端进口文件

URL 形式

URL 的接见体式格局是 index.php?con=Controller&act=Action

Action 有两种,一种是剧本处置惩罚类的 Action,此类 Action 是 Controller 的一个 function另一种是视图类的 Action(也就是视图),当 Controller 中不存在此 function 时,体系自 动会加载此 action 对应的视图文件,若是此视图也不存在,体系会跳转 404 页面。

开启伪静态时 URL 接见体式格局是 /Controller/Action 也可为/index.php/Controller/Action

相识体系参数与底层过滤状况

原生 GET,POST,REQUEST

代码审计进修之某shop恣意文件删除
代码审计进修之某shop恣意文件删除

依据var_dump的效果能够看到原生GET,POST,REQUEST变量中的' " <>等字符被转义了,经由过程debug跟踪代码和全局搜刮$_REQUEST等字符我并没有找到对这些变量举行过滤的处所,多是在衬着输出的时刻对字符串举行了过滤。

体系外部变量猎取函数

代码审计进修之某shop恣意文件删除
能够看到猎取外部变量都挪用了Req类,跟进/framework/lib/util/request_class.php

堆中global_max_fast相干应用

前言 事情的起因还要从*ctf 2019说起,heap_master里能用unsorted bin attack实现一次任意地址写,一开始想到的是写stdout来实现地址泄露 ,但是这样要写两次才能实现,花了很大的经历找另外一次写,仍然没有找到,很绝望。 事后看wp看到是用一次写实现对变量global_max_fast的覆盖,从而实现后续的利用,对malloc以及free中涉及global_max_fast进行了一定的分析,并结合在网上找到的相关的题目进行了相应的实践。 在开始之前向大家推荐下我写的一个框架pwn_debug,写它的本意是方便大家的调试,主要的特点有: 支持带符号调试glibc,脚本中支持安装debug版的glibc(x64和x86都支持),以实现调试的时候可以看到glibc源码。 支持不同版本的glibc调试。如在ubuntu16上调试libc-2.29。 下断点方便,不管程序是否开启PIE。 使用方便,与pwntools兼容起来很简单(我觉得)。 源码分析 此次的源码是基于libc-2.23的,后续的版本加入了tcache,该机制相对来说比较简单与独立,所以还是基于2.23进行相应的分析,在64位系统上进行。 global_max_fast这个全局变量的作用是用来标志fastbin的大小的阈值,小于这个值的堆块会被认为是fastbin,使用fastbin的相应机制进行管理。看下它的定

<?php
/**
 * Tiny - A PHP Framework For Web Artisans
 * @author Tiny <tinylofty@gmail.com>
 * @copyright Copyright(c) 2010-2014 http://www.tinyrise.com All rights reserved
 * @version 1.0
 */
/**
 * 封装$_GET $_POST 的类,使$_GET $_POST 有一个一致的出进口
 * @class Req 
 * @note  
 */
class Req
{
    //对应处置惩罚$_GET
    public static function get()
    {
        $num = func_num_args();
        $args = func_get_args();
        if($num==1)
        {
            if(isset($_GET[$args[0]])){
                if(is_array($_GET[$args[0]]))return $_GET[$args[0]];
                else return trim($_GET[$args[0]]);
            }
            return null;
        }
        else if($num>=2)
        {
            if($args[1]!==null)$_GET[$args[0]] = $args[1];
            else if(isset($_GET[$args[0]])) unset($_GET[$args[0]]);
        }
        else
        {
            return $_GET;
        }
    }
    //对应处置惩罚$_POST
    public static function post()
    {
        $num = func_num_args();
        $args = func_get_args();
        if($num==1)
        {
            if(isset( $_POST[$args[0]])){
                if(is_array( $_POST[$args[0]]))return  $_POST[$args[0]];
                else return trim( $_POST[$args[0]]);
            }
            return null;
        }
        else if($num>=2)
        {
            if($args[1]!==null) $_POST[$args[0]] = $args[1];
            else if(isset($_POST[$args[0]])) unset($_POST[$args[0]]);
        }
        else
        {
            return $_POST;
        }
    }
    //同时处置惩罚$_GET $_POST
    public static function args()
    {
        $num = func_num_args();
        $args = func_get_args();
        if($num==1)
        {
            if(isset($_POST[$args[0]])){
                if(is_array($_POST[$args[0]]))return $_POST[$args[0]];
                else return trim($_POST[$args[0]]);
            }
            else{
                if(isset($_GET[$args[0]])){
                    if(is_array($_GET[$args[0]]))return $_GET[$args[0]];
                    else return trim($_GET[$args[0]]);
                }
            }
            return null;
        }
        else if($num>=2)
        {
            if($args[1]!==null)
            {
                $_POST[$args[0]] = $args[1];
                $_GET[$args[0]] = $args[1];
            }
            else
            {
                if(isset($_GET[$args[0]])) unset($_GET[$args[0]]);
                if(isset($_POST[$args[0]])) unset($_POST[$args[0]]);
            }
        }
        else
        {
            return $_POST+$_GET;
        }
    }
    public function only()
    {
        $hash= md5(serialize($_POST));
        $safebox = Safebox::getInstance();
        $__hash__ = $safebox->get('__HASH__');
        if($hash != $__hash__)
        {
            $safebox->set('__HASH__',$hash);
            return true;
        }
        else
        {
            return false;
        }
    }
}
?>

GET和POST变量离别对应了Req::get()、Req::post()、Req::args(),且没有任何过滤,每次过滤都邑挪用Filter类,跟进/framework/lib/util/filter_class.php
代码审计进修之某shop恣意文件删除
该类的每个要领都对应着分歧的过滤功用。

检察体系DB类,相识数据库底层运转体式格局

/framework/web/model/module_class.php/framework/web/model/query_class.php
前者用于被控制器挪用,后者用于viewAction
代码审计进修之某shop恣意文件删除
基本上Model类的底层没有任何过滤,只是简朴的举行类字符串拼接,以是只需能将'\带入Model类中,且没有被Filter类过滤,便可组成注入。

体系状况开端鸠合

基本上除Filter类,底层没有举行过于严厉的过滤。
只需挪用了Req类猎取参数且在衬着赋值的过程当中没有运用Filter类举行过滤,那末就很轻易形成xss。
sql注入同理,底层Model类没有特地举行过滤。
别的Filter类我只是简朴的看了一下,详细在某个状况下挪用的函数不消除被绕过的能够。

背景一处注入

前台看了良久,过滤的很严厉找不到注入点,而且这个cms大部分功用都是背景的,以是我只好在背景找一下了,虽然没什么卵用,就当进修思绪。
/protected/crontrollers/goods.php set_online要领中吸收id参数举行商品高低架处置惩罚,却没有对id参数举行过滤,直接拼接进sql语句中。
代码审计进修之某shop恣意文件删除
代码审计进修之某shop恣意文件删除
组织id=12) and if(1=1,sleep(1),0)#
代码审计进修之某shop恣意文件删除
能够看到胜利注入
代码审计进修之某shop恣意文件删除
一样的,背景有不少处所都没有举行过滤,就不一一列举。
代码审计进修之某shop恣意文件删除

背景两处恣意文件删除+恣意文件读取

第一处对照鸡肋,只能删除install.lock文件
/protected/crontrollers/plugin.php
代码审计进修之某shop恣意文件删除
能够看到途径前缀从$this->widgetPath中猎取,跟进
代码审计进修之某shop恣意文件删除
APP_CODE_ROOT为运用开辟途径
代码审计进修之某shop恣意文件删除
能够看到name参数没有任何过滤,我们能够应用../../install跳转到装置目次,将install.lock删除然后重新装置。
然后合营MySQL LOAD DATA 恣意文件读取,读取服务器上的文件。
恣意文件读取
代码审计进修之某shop恣意文件删除

代码审计进修之某shop恣意文件删除

第二处能够删除恣意文件
代码审计进修之某shop恣意文件删除
$backs变量没有任何过滤,直接和$database_path拼接然后实行删除操纵。以是我们能够应用../删除恣意文件
代码审计进修之某shop恣意文件删除
一样能够删除install.lock合营MySQL LOAD DATA读取恣意文件。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明代码审计进修之某shop恣意文件删除
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址