[PHP代码审计]极致CMS1.6.7 SQL注入审计

0x01 前言

最近在学习php代码审计,刚好端午在家的时候菜的没事做,看了下cnvd,发现这个cms中sql注入问题挺多的,hhh,复现玩玩。主要目标就是复现一下网站前台的sql注入。所有均为个人理解,可能有理解错误的地方,还请师傅们指正。
在这里插入图片描述
此Cms下载链接https://www.jizhicms.cn/thread-95-1-1.html

0x02 cms目录架构

这个cms目录架构大致如下:

├── 404.html
├── A	后台控制文件
├── Conf公共函数
├── FrPHP框架
├── Home前台控制文件
├── Public公共静态文件
├── README.md
├── admin.php后台入口
├── backup备份
├── cache缓存
├── favicon.ico
├── index.php前台入口
├── install
├── readme.txt
├── static静态文件
└── web.config

0x03 函数

主要分析一下进行了过滤的函数(jizhicms_Beta1.6.7\FrPHP\lib\Controller.php)和进行sql处理的函数(jizhicms_Beta1.6.7\FrPHP\lib\Model.php)

3.1 frparam()函数

在此cms中大量调用了frparam()函数,具体代码如下:
jizhicms_Beta1.6.7\FrPHP\lib\Controller.php

// 获取URL参数值
public function frparam($str=null, $int=0,$default = FALSE, $method = null){
   
        
    $data = $this->_data;
    if($str===null) return $data;
    if(!array_key_exists($str,$data)){
   
        return ($default===FALSE)?false:$default;
    }
    
    if($method===null){
   
        $value = $data[$str];
    }else{
   
        $method = strtolower($method);
        switch($method){
   
            case 'get':
            $value = $_GET[$str];
            break;
            case 'post':
            $value = $_POST[$str];
            break;
            case 'cookie':
            $value = $_COOKIE[$str];
            break;
            
        } 
    }
    
    return format_param($value,$int);
    
    
}

这里跟进一下format_param()
jizhicms_Beta1.6.7\FrPHP\common\Functions.php

/**
    参数过滤,格式化
**/
function format_param($value=null,$int=0){
   
    if($value==null){
    return '';}
    switch ($int){
   
        case 0://整数
            return (int)$value;
        case 1://字符串
            $value=htmlspecialchars(trim($value), ENT_QUOTES);
            if(!get_magic_quotes_gpc())$value = addslashes($value);
            return $value;
        case 2://数组
            if($value=='')return '';
            array_walk_recursive($value, "array_format");
            return $value;
        case 3://浮点
            return (float)$value;
        case 4:
            if(!get_magic_quotes_gpc())$value = addslashes($value);
            return trim($value);
    }
}

从这可以看出来,format_param()函数将传递进来的$value变量通过$int变量判断他是整数还是字符串然后做一个相应的处理。
总的来说frparam()函数会对传递的参数进行过滤。

3.2 sql处理函数update()

	    // 修改数据
    public function update($conditions,$row)
    {
   
        $where = "";
		$row = $this->__prepera_format($row);
		if(empty($row))return FALSE;
		if(is_array($conditions)){
   
			$join = array();
			foreach( $conditions as $key => $condition ){
   
				$condition = '\''.$condition.'\'';
				$join[] = "{
     $key} = {
     $condition}";
			}
			$where = "WHERE ".join(" AND ",$join);
		}else{
   
			if(null != $conditions)$where = "WHERE ".$conditions;
		}
		foreach($row as $key => $value){
   
			if($value!==null){
   
				$value = '\''.$value.'\'';
				$vals[] = "{
     $key} = {
     $value}";
			}else{
   
				$vals[] = "{
     $key} = null";
			}
			
		}
		$values = join(", ",$vals);
		$table = self::$table;
		$sql = "UPDATE {
     $table} SET {
     $values} {
     $where}";
		return $this->runSql($sql);
		
		
    }

第28行$sql = "UPDATE {$table} SET {$values} {$where}";可以知道是进行的一个数据的修改操作这里跟进一下runsql($sql)
jizhicms_Beta1.6.7\FrPHP\lib\Model.php

    //执行SQL语句返回影响行数
    public function runSql($sql)
    {
   
        return $this->db->exec($sql);
    }

然后继续跟进exec($sql)
jizhicms_Beta1.6.7\FrPHP\db\DBholder.php

    //执行一条 SQL 语句,并返回受影响的行数
    public function exec($sql)
    {
   
        $this->arrSql[] = $sql;
        $n = $this->pdo->exec($sql);
        if(!$n){
   
            $msg = $this->pdo->errorInfo();
            if($msg[2]) Error_msg('数据库错误:' . $msg[2] . end($this->arrSql));
        }
        return $n;
}

可以注意到第七行代码$msg = $this->pdo->errorInfo(); 也就是说这里会在错误的情况下会有个打印的操作。

由于本身sql处理的函数没有对参数值进行过滤,参数如果没有经过frparam()函数进行处理就会造成sql注入。

3.3 sql处理函数findAll()

首先整个cms的sql执行的函数是在
jizhicms_Beta1.6.7\FrPHP\lib\Model.php下

    // 查询所有
    public function findAll($conditions=null,$order=null,$fields=null,$limit=null)
    {
   
        $where = '';
        if(is_array($conditions)){
   
            $join = array();
            foreach( $conditions as $key => $value ){
   
                $value =  '\''.$value.'\'';
                $join[] = "{
     $key} = {
     $value}";
            }
            $where = "WHERE ".join(" AND ",$join);
        }else{
   
            if(null != $conditions)$where = "WHERE ".$conditions;
        }
      if(is_array($order)){
   
            $where .= ' ORDER BY ';
            $where .= implode(',', $order);
      }else{
   
         if($order!=null)$where .= " ORDER BY  ".$order;
      }
        
        if(!empty($limit))$where .= " LIMIT {
     $limit}";
        $fields = empty($fields) ? "*" : $fields;
        $table = self::$table;
        $sql = "SELECT {
     $fields} FROM {
     
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
极致CMS是一款功能强大,免费开源,无需授权,免费商用,免费二开的建站系统。 极致CMS前台功能: CMS模块:首页,栏目,单页,自定义页面 个人中心:响应式设计个人中心模块,兼容各种PC及手机 关注粉丝:可以关注某个用户,粉丝查看 喜欢收藏:喜欢收藏文章及商品等 评论管理:评论文章/商品 内容投稿:可以在网站上投稿 购物车:临时购物车 我的钱包:金币和积分记录 积分兑换:网站支持用积分兑换,后台设定对应的兑换率 订单中心:订单记录 消息提醒:内置收藏喜欢评论,订单提交等消息提醒,也可以设置中关闭 极致CMS后台功能:layui前端框架 基础模块:商品模块、文章模块、栏目模块、TAG管理、轮播图管理、友情链接、留言管理、评论管理 高级模块:自定义模块、自定义字段(新增各种类型字段) 桌面设置:可以自定义后台界面功能摆放 双端静态生成 支持自动缓存,支持设定页面缓存时间 PC/手机/微信三端可以设定不同模板 自定义栏目URL:无需手动配置伪静态 SEO功能:XML生成,栏目及各模块内置SEO选项 插件中心:可以在线下载/安装插件,可以在线升级系统,提供丰富的插件 支持QQ登录,微信登录 支持微信支付/支付宝支付 支持微信接入/获取微信素材 后台管理员多角色管理:每个角色可以设定不同后台界面(结合桌面设置),每个角色可以指定管理某个栏目 图片管理:各种上传的图片可以进行管理,可以及时删除垃圾图片 自定义系统配置:可以在系统配置中自定义 敏感词过滤:可以设置敏感词过滤,提交时自动检查 极致CMS v1.9.4 更新内容如下: 修复:静态HTML生成问题 修复:导航缓存问题 修复:管理员列表分页数无法设置 优化:session缓存时间 优化:404页面返回404状态 优化:模块中设置栏目不是必选,字段可以在全局栏目使用 优化:栏目模板可以手动填写 优化:图集多附件字段默认text类型 新增:后台角色可以设置发布审核

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值