我是如何利用CSRF Get DedeCms Shell的
说实话,有一两个月没有审计大厂了,然后随便看到群里有人问dede最新有没有漏洞,就下了一套最新的dede,结果我一看还真发现了。
我们发现后台添加广告的地方存在跨站请求伪造漏洞。远程攻击者可通过提交特制的请求利用达到写入WebShell目的。
在添加广告的地方,广告内容你直接写就可以了。
这段代码会直接存到数据库里,然后我们从另一个地方利用这个写进数据库的一句话木马,也是这次漏洞的核心利用文件。
问题代码出现在19-44行,具体来看代码。
然后我们注重去分析这几行代码是如何出现问题的。
首先,用用If语句来判断 是否设置了nocache变量 然后再判断$cacheFile文件是否存在,但是因为是或判断,我们只需要用默认的变量注册注册一个nocache变量即可进入此判断。在If语句内,第一个就是一个SELECT查询语句,我们只可以控制$aid,但是因为前面的三目运算符限制了$aid的值,所以说我们就老老实实的让他查询,这里查询的是存放广告的表,然后初始化$abody的值为空,防止变量注册来写入恶意代码。再往后走又是一个If语句,这个If语句是判断是不是广告无限时间,如果是直接把$abody赋值成数据库中normbody字段的值,如果广告时间不是无限的话,就用现在的时间和设置的过期时间进行判断,如果过期了,就输出存入过期的值,如果不过期,就输出存入的值。
之后再下面,对$abody进行了过滤,只是过滤了r n 和" ,然后打开$cacheFile文件,并写入$abody变量,然后关闭文件,并在下方包含了这个文件,导致了漏洞的产生。所以说只要我们控制了广告的代码,就可以造GetShell,但是这是后台功能,所以说我们在没有注入的情况下,只能通过Csrf来诱导管理员来点击我们设置好的页面,来让管理员修改广告代码,或者通过一个前台SQL注入漏洞,来修改这个表的字段来模拟后台管理员修改此字段,也可以达到GetShell的目的。
总结
不得不说Dede做安全还是做得挺好的,参数全部转Int了无法注入,这里我们可以看到一个SQL语句,这是查询广告Id的,如果有就赋值内容给$row变量 让然后过滤r n和双引号来写入模板页,并在下方直接Include包含了这个模板页,虽然这个模板页是html后缀,但是包含了可以直接执行PHP代码的!所以导致了GetShell的产生。
漏洞影响版本:织梦内容管理系统最新版,及其向下版本全部影响。
视频及附件下载地址:https://pan.baidu.com/s/1i5nc00P密码:91jn
如果大家有什么不懂的话,可以联系我,24小时在线的哦~
*本文作者:山东安云,转载请注明来自FreeBuf.COM
- 剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)
- 剑指OFFER之最小的K个数(九度OJ1371)
- 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)
- 如何成为一名10x的数据分析师?
- 肥料生产商全套三拼在手:拟融资1.47亿元
- 《外媒Cointelegraph专访Qtum量子链Jordan Earls》—浅谈目前Dapps的主要问题
- ASP .Net Core 2.0 修改默认端口
- 不满一岁的潜力股:2017年3D打印机器人盘点
- Reporting Service报表开发
- 不要信任云:这不只是安全的问题
- C#温故而知新—闲话.Net
- c# IO&&线程 打造 定时打开指定程序
- 前FDIC主席:比特币政策不应打击加密货币发展
- 任何人都不应该控制区块链供应链
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Oracle基本参数(COMPATIBLE)
- Oracle基本参数(CONTROL_FILES)
- Oracle基本参数(DB_BLOCK_SIZE)
- Oracle基本参数(DB_CREATE_FILE_DEST,DB_CREATE_ONLINE_LOG_DEST_n)
- React16的memo函数有啥用
- 要点2:循环、条件控制
- VSCode代码格式化设置
- MapReduce之MapJoin案例
- MapReduce之多个Job串联的案例
- Java Class文件常量池
- Kubernetes 学习笔记——使用 Heml 安装和使用 OpenFaaS
- 奈学:reaseShared共享式释放锁
- 奈学:reaseShared共享式释放锁
- 【DB宝18】在Docker中安装使用MySQL高可用之MGR
- MapStruct