首页
随笔
生活
MAC
技术
游戏
随言碎语
讯睿CMS上传附件为PDF时被XSS注入的漏洞修复
2024-12-18
yu.shi
108
## 说明 近期一个项目里,在做安全扫描时发现有安全漏洞,很奇怪的漏洞,属于XSS注入,执行js脚本。之前的XSS注入只要过滤表单即可,但是这个漏洞是把js脚本嵌入在了PDF文件里。 而在做附件上传时,基本没有对附件本身进行安全扫描的行为,导致在打开PDF文件(直接链接打开,浏览器会默认预览PDF)时,在打开PDF预览的页面里执行了js脚本。 本次项目用的是讯睿CMS,讯睿CMS本身在附件上传时有XSS过滤功能,但同样,没有扫描上传附件内容。网上搜了,解决的方案也很少,毕竟这种漏洞很少见,而且除了安全公司会扫描时作为“苍蝇”存在,其余并不会遇到。但是既然被扫到了,就得解决... ## 解决方案 ### 不允许直接预览pdf文件,改为下载文件的方式 这种方法可以解决js执行的问题,是一种比较粗暴的解决方式,对于附件不再用a标签直接打开,而是全部改用下载的形式。需要两个步骤。 第一就是禁止目录下文件访问,不再允许直接访问附件,而使用下载的形式,可以通过在目录下加入.htaccess文件的形式进行处理,也可以有其他方法,这里仅做一个思路 ``` # 禁止直接访问附件
Order Allow,Deny Deny from all
``` 第二就是要改变访问链接,不再用a标签直接链接地址,而是用a标签打开一个php文件地址,将附件地址作为参数传过去,用php来下载文件 ``` $file = $_GET['file']; # 这里可以加一些校验,例如是否登录、是否属于个人文件等,可以做权限判断 $file_path = './'.$file.'.pdf'; if (file_exists($file_path)) { echo '正在下载...'; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($file_path) . '"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_path)); readfile($file_path); // 关闭页面 echo ''; exit; } else { echo '文件不存在或无法访问。'; } exit(); ``` ### 在文件上传时加入文件内容的扫描,不符合要求直接禁止上传 本方法比较简单,可以通用的解决问题,不需要改变原有的业务逻辑。 找到/dayrui/Fcms/Library/Upload.php文件 在_safe_check方法中加入验证方法 ``` // 验证pdf是否包含js脚本 // 20241218 yushi if (in_array($file_ext, ['pdf'])) { $data = strlen($data) < 50 && @is_file($data) ? file_get_contents($data) : strtolower($data); $data = str_replace(array("\r\n","\r","\n"), " ", $data); preg_match('/<<{1}\s?\/{1}(JS|js){1}.*\/S{1}\s?\/javascript{1}\s?>>/i',$data,$mat); if($mat){ //包含js 驳回 return dr_return_data(0, dr_lang('此PDF文件不安全,禁止上传'). (IS_DEV ? '后台-系统-附件设置-可选择附件验证为宽松模式' : '')); } } ``` 至此完成
0
yu.shi
爱生活,爱游戏,爱coding,爱工作
139666
总访问量
47
站内文章数
1731
博客开设天数
随笔点击排行
1
剧本杀《千千晚星》
(1937)
2
无公网IP+ZeroTier+...
(1912)
3
关于梦想
(1486)
4
P5R攻略两篇
(1445)
5
树莓派制作电子相册
(1381)
标签
生活
PHP
前端
公考
PS4
魂系列
树莓派
友情连接
PSN
兄弟影视
WEUI
WEUI.JS
音乐解密
无损音乐