最近在审计yunucms,审计了几个后台漏洞,有XSS和文件泄露几个。

yunucms介绍

云优CMS是一款基于TP5.0框架为核心开发的一套免费+开源的城市分站内容管理系统。云优CMS前身为远航CMS。云优CMS于2017年9月上线全新版本,二级域名分站,内容分站独立,七牛云存储,自定义字段,自定义表单,自定义栏目权限,自定义管理权限等众多功能深受用户青睐。

建站

从官网下载源码并进行过安装

需要注意的是需要填云账号,我去官网注册了一个随便填上了,账号testqwe,密码123456,手机号利用的在线短信注册的

填上MySQL密码即可

前台界面

漏洞复现

XSS

漏洞测试

后台TAG管理模块

进行添加TAG

在名称处填入XSS代码并提交

返回模块即可看到效果

查看源码,发现已经插入

查看数据库

代码审计http://127.0.0.1/index.php?s=/admin/tagurl/addtagurl

该cms路由为目录/文件/方法,直接查看方法public function addTagurl()

{

if(request()->isAjax()){ # 判断是否是ajax请求

$param = input('post.'); # 获取参数

$tagurl = new TagurlModel();

$flag = $tagurl->insertTagurl($param); # 将结果进行保存并返回响应

return json(['code' => $flag['code'], 'data' => $flag['data'], 'msg' => $flag['msg']]);

}

return $this->fetch();

}

跟进insertTagurl方法public function insertTagurl($param)

{

try{

$result = $this->allowField(true)->save($param); # 保存当前数据对象

if(false === $result){

return ['code' => -1, 'data' => '', 'msg' => $this->getError()];

}else{

return ['code' => 1, 'data' => '', 'msg' => '添加TAG成功'];

}

}catch( PDOException $e){

return ['code' => -2, 'data' => '', 'msg' => $e->getMessage()];

}

}

继续跟进save方法if (!empty($data)) {

// 数据自动验证

if (!$this->validateData($data)) { # 验证集为空,直接返回true

return false;

}

// 数据对象赋值

foreach ($data as $key => $value) {

$this->setAttr($key, $value, $data); # 将参数赋值给$this->data数组

}

if (!empty($where)) {

$this->isUpdate = true;

}

}

......

$result = $this->getQuery()->insert($this->data);

......

``

validateData方法需要验证集,而本身没有传入protected function validateData($data, $rule = null, $batch = null)

{

$info = is_null($rule) ? $this->validate : $rule;

if (!empty($info)) {

......

}

return true;

}

且$this->validate参数为空,因此直接返回true

跟进insert方法.....

// 生成SQL语句

$sql = $this->builder->insert($data, $options, $replace);

$bind = $this->getBind();

if ($options['fetch_sql']) {

// 获取实际执行的SQL语句

return $this->connection->getRealSql($sql, $bind);

}

// 执行操作

$result = $this->execute($sql, $bind);

fetch_sql变量为false,跟进execute方法......

if ($procedure) { # false

$this->bindParam($bind);

} else {

$this->bindValue($bind);

}

......

最后跟进参数绑定方法protected function bindValue(array $bind = [])

{

foreach ($bind as $key => $val) {

// 占位符

$param = is_numeric($key) ? $key + 1 : ':' . $key;

if (is_array($val)) {

if (PDO::PARAM_INT == $val[1] && '' === $val[0]) {

$val[0] = 0;

}

$result = $this->PDOStatement->bindValue($param, $val[0], $val[1]);

} else {

$result = $this->PDOStatement->bindValue($param, $val);

}

if (!$result) {

throw new BindParamException(

"Error occurred when binding parameters '{$param}'",

$this->config,

$this->getLastsql(),

$bind

);

}

}

}

可以看到最后是调用PDO对象对参数进行的绑定,除此之外并没有任何过滤,因此XSS代码可插入并执行

数据库泄露

漏洞测试

在后台系统管理->数据库管理模块将所有数据库备份

查看本地文件,所有备份保存在data目录下,发现名命是以时间命名,可以直接爆破得到

从前台访问并下载

下载完成后打开,泄露所有数据库信息

代码审计POST /index.php?s=/admin/data/export HTTP/1.1

public function export($ids = null, $id = null, $start = null) {

$Request = Request::instance();

if ($Request->isPost() && !empty($ids) && is_array($ids)) { //初始化

$path = config('data_backup_path');

is_dir($path) || mkdir($path, 755, true);

//读取备份配置

$config = [

'path' => realpath($path) . DIRECTORY_SEPARATOR,

'part' => config('data_backup_part_size'),

'compress' => config('data_backup_compress'),

'level' => config('data_backup_compress_level'),

];

//检查是否有正在执行的任务

$lock = "{$config['path']}backup.lock";

if (is_file($lock)) {

return $this->error('检测到有一个备份任务正在执行,请稍后再试,或手动删除"'.$lock.'"后重试!');

}

file_put_contents($lock, $Request->time()); //创建锁文件

//检查备份目录是否可写

is_writeable($config['path']) || $this->error('备份目录不存在或不可写,请检查后重试!');

session('backup_config', $config);

//生成备份文件信息

$file = [

'name' => date('Ymd-His', $Request->time()),

'part' => 1,

];

session('backup_file', $file);

//缓存要备份的表

session('backup_tables', $ids);

//创建备份文件

$Database = new \com\Database($file, $config);

if (false !== $Database->create()) {

$tab = ['id' => 0, 'start' => 0];

return $this->success('初始化成功!', '', ['tables' => $ids, 'tab' => $tab]);

} else {

return $this->error('初始化失败,备份文件创建失败!');

}

}

......

可以看到,备份文件的命名用的time方法,跟进public function time($float = false)

{

return $float ? $_SERVER['REQUEST_TIME_FLOAT'] : $_SERVER['REQUEST_TIME'];

}

可以看到利用REQUEST_TIME进行构造文件名,因此可以直接爆破得到并下载。

结束语

后台漏洞现在不太受待见,总觉得后台都进不去所以后台漏洞用处不大,不过后台漏洞更多的是利用组合拳。先拿到后台权限或者直接越权,拿下主机也是迟早的事。后台漏洞同样不可小觑。

文中如果有什么错误的地方还请各位师傅指教。

php 后台数据 u,Yunucms代码审计:后台XSS和数据库信息泄露相关推荐

  1. vue绑定后台数据ajax,vueJS 获取后台数据 绑定data

    //vue 环境安装 http://blog.csdn.net/u013182762/article/details/53021374 一开始使用安装环境配置一些东西 ,后来发现太麻烦了 .  直接C ...

  2. ajax获取java后台数据_jQuery ajax获取后台数据怎么在前端显示。

    前后端分离以后,前端界面采用ajax与后台数据交互.现在从后台获取到下载文件的集合,怎么在前端一行一行显示,点击某一行可以直接跳转过去下载对应的文件. pageEncoding="UTF-8 ...

  3. js前台与后台数据交互-前台调后台

      网站是围绕数据库来编程的,以数据库中的数据为中心,通过后台来操作这些数据,然后将数据传给前台来显示出来(当然可以将后台代码嵌入到前台).即: 下面就讲前台与后台进行数据交互的方法,分前台调用后台方 ...

  4. vue调用接口获取后台数据_Vuex 存储||获取后台接口数据

    如果你对 Vuex 有一定的了解的话呢,可以继续这一篇的学习了,如果没有的话, 建议先看一看我的上一篇 Vuex基础:地址在下面 这篇接着上一篇: 这篇将利用到 Vuex的详解与使用和Vuex刷新数据 ...

  5. 1万条数据大概占多大空间_快递信息泄露背后:40元可买超4G简历数据

    贝壳财经原创出品 记者 李大伟 编辑 李薇佳 被圆通快递内鬼泄露的四十万公民个人信息只是庞大信息贩卖江湖的冰山一角. 11月16日,新京报贝壳财经独家报道了圆通多位"内鬼"有偿租借 ...

  6. java项目启动加载数据_java项目启动时加载数据库信息存入缓存方法

    一.获取需要加载的数据 @Component public class MathMethod { public void addMethod(int i) { //查询方法存入redis等库 Syst ...

  7. servlet向ajax传递数据库,一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)...

    背景: 目前业界很流行的MVC(model-view-control)开发模式,理解为 模型是Bean, 视图是 Html/Jsp, 控制是Servlet, 关联数据库的Dao web的运行机制: 数 ...

  8. 拼多多怎么调整后台数据|聚创卓跃

    对于我们新手拼多多商家来说,如果能提升店铺的自然流量,那一定要去了解一下平台对于流量投放的规则,究竟他的影响因素有哪些呢?聚创卓跃小编来为各位卖家分析一下! 1.自然流量 标题优化是拼多多最基础.最重 ...

  9. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)

    注意!!!(修改于2020年7月18日) 在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据 报错截图如下 报错内容: {&quo ...

  10. ________________2058_______________后台数据不够。可能误判。

    //正确的代码. #include<stdio.h> #include<math.h> int main() {__int64 n,m,i,j,s,l,l1;while(sca ...

最新文章

  1. kotlin与java对比
  2. 洛谷P1003 铺地毯 noip2011提高组day1T1
  3. POJ2301+水~~~~~~
  4. oracle大对象实例_Oracle解析复杂json的方法实例详解
  5. Java中的继承和接口
  6. php asp 语法,ASP 语法
  7. 智能商业大会构造信息化交流平台
  8. 到底什么培训适合你?
  9. Day05:装饰器,三元表达式,函数的递归,匿名/内置函数,迭代器,模块,开发目录...
  10. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
  11. Vue.js实现可配置的登录表单
  12. Strtus2标签s:url
  13. linux运行h3c校园网,H3C Lite轻量级校园网认证Linux客户端(For SHNU)
  14. 阮一峰es6,Proxy和Reflect学习
  15. Python:寻找回文素数
  16. Emacs,最强编辑器,没有之一
  17. android 开机动画 卡顿,开机动画没按帧率播放 有卡顿
  18. 你知道bat是什么意思吗?
  19. ubuntu安装软件包命令
  20. PtCMS采集,PtCMS采集插件,PtCMS全自动采集无需采集规则详解(图文)

热门文章

  1. 常用SqlHelper类(C#)
  2. Java8新特性DateTime使用
  3. java 面试高频问题 java8新特性
  4. solr java 客户端
  5. 虚拟试衣APP软件一站式开发
  6. 程序员从月薪6k到15k,你知道这3个月我是怎么过来的吗?
  7. ae万能弹性表达式_18种常用AE表达式解析【建议收藏】
  8. 电蚊拍GB4706检测及安规测试设备
  9. Unity3D游戏开发之反编译AssetBundle提取游戏资源
  10. 计算机机器人比赛有哪些,RoboCup机器人世界杯赛有哪些项目?