bugku 管理员系统 后台代码_代码审计——YXCMS

a2f296fc6110ab106e2a305da5ef1993.png

前言

YXcms是一个代码审计入门级的cms,比较适合想我这样的小白玩家进行操作。。。

我一直想尝试审计一个cms,但是因为各种原因,一直搁置了。
尝试分析一下YXCMS。。。

相关环境

源码信息 : Yxcms php建站系统 1.4.7
本地环境 : phpstudy2018
下载地址 : 175.6.244.211:88/uploads/userup/1596/YXcmsApp1.4.7.zip

安装环境

具体的安装和使用的详细可以上官网查看https://www.kancloud.cn/yongheng/yxcms

YXcms代码审计

YXcms目录结构

a1abfe47ecba39f05b5d1653abcd890f.png

protected文件夹一些重要的路径:
protected/base 控制器、模型以及接口的父类
protected/cache 数据库缓存、模板缓存等
protected/include canphp核心
protected/config.php 系统全局配置
protected/core.php 系统核心函数
protected/apps 存放应用
protected/apps/admin 后台
protected/apps/default 前台
protected/apps/member 会员中心
protected/apps/install 系统安装
YXcms1.4.7是mvc路由模式开发的。。。
这个版本后台有好几个严重漏洞,
前台有一个储存型XSS,要利用也需与管理员交互。 我们一个一个来进行分析。。。

前台存储型XSS

漏洞复现

前台有留言板的功能,进行测试:

33db54e64366eec2105562e40521548f.png

当管理员在后台查看留言的时候,就能触发xss:

d6006f926a5c880c004f5017713524c6.png

可以通过这个 xss 来获取管理员的 cookie ,从而进入网站后台。。

代码分析

让我们看一下代码的实现:
首先前台留言板的代码: 前台的文件源码 protected/apps/default/controller/columnController.php
public function index(){
             $ename=in($_GET['col']);        if(empty($ename)) throw new Exception('栏目名不能为空~', 404);        $sortinfo=model('sort')->find("ename='{$ename}'",'id,name,ename,path,url,type,deep,method,tplist,keywords,description,extendid');        $path=$sortinfo['path'].','.$sortinfo['id'];        $deep=$sortinfo['deep']+1;        $this->col=$ename;        switch ($sortinfo['type']) {
                 case 1://文章                $this->newslist($sortinfo,$path,$deep);                break;            case 2://图集                $this->photolist($sortinfo,$path,$deep);                break;            case 3://单页                $this->page($sortinfo,$path,$deep);                break;            case 4://应用                break;            case 5://自定义                break;            case 6://表单                $this->extend($sortinfo,$path,$deep);                break;            default:                throw new Exception('未知的栏目类型~', 404);                break;        }    }...protected function extend($sortinfo,$path,$deep){
             $tableid=$sortinfo['extendid'];        if(empty($tableid)) $this->error('表单栏目不存在~');        $tableinfo = model('extend')->select("id='{$tableid}' OR pid='{$tableid}'",'id,tableinfo,name,type,defvalue','pid,norder DESC');        if(empty($tableinfo)) $this->error('自定义表不存在~');        $urls=explode('|', $sortinfo['url']);        // var_dump($tableinfo);        // var_dump($urls);        // exit();        if (!$this->isPost()) {
                ...        }else{
                session_starts();           $verify=session('verify');           session('verify',null);           if(empty($verify) || $_POST['checkcode']!=$verify) $this->error('验证码错误,请重新输入');           for($i=1;$i            if(is_array($_POST[$tableinfo[$i]['tableinfo']])){
                    $data[$tableinfo[$i]['tableinfo']]=in(deletehtml(implode(',',$_POST[$tableinfo[$i]['tableinfo']])));               $data[$tableinfo[$i]['tableinfo']]=$data[$tableinfo[$i]['tableinfo']]?in(deletehtml($data[$tableinfo[$i]['tableinfo']])):'';            }else{
                     if(strlen($_POST[$tableinfo[$i]['tableinfo']])>65535) $this->error('提交内容超过限制长度~');                $data[$tableinfo[$i]['tableinfo']]=html_in($_POST[$tableinfo[$i]['tableinfo']],true);            }           }           $data['ip']=get_client_ip();           $data['ispass']=0;           $data['addtime']=time();           if(empty($urls[1])) $jump=$_SERVER['HTTP_REFERER'];           else{
                   $jurl=explode(',',$urls[1]);              if(!empty($jurl[1])){
                     $arr=explode('/',$jurl[1]);                if(!empty($arr)){
                       $canshu=array();                  foreach ($arr as $vo) {
                          $val=explode('=',$vo);                     $canshu[$val[0]]=$val[1];                  }                }              }              $jump=url($jurl[0],$canshu);           }           $mes=$urls[2]?$urls[2]:'提交成功请等待审核~';           if(model('extend')->Extin($tableinfo[0]['tableinfo'],$data)) $this->success($mes,$jump);           else $this->error('提交失败~');         }    }
这里前端对xss过滤不完善。。
只对 tname 参数进行了验证 deletehtmlhtml_in
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值