前言
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目录结构
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 | 系统安装 |
这个版本后台有好几个严重漏洞,
前台有一个储存型XSS,要利用也需与管理员交互。 我们一个一个来进行分析。。。
前台存储型XSS
漏洞复现
前台有留言板的功能,进行测试: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
参数进行了验证
deletehtml
和
html_in