从FlexPaper 2.3.7 安全更新入手反推漏洞
字数 1577 2025-08-26 22:11:39
FlexPaper 2.3.7 安全漏洞分析与教学文档
1. 前言
FlexPaper 是一个开源轻量级的文档浏览器显示组件,允许在 Web 客户端、移动设备和平板设备上查看各种文档。2.3.7 版本修复了三个关键漏洞:
- 无需身份验证的 RCE 漏洞
- 两处未公开的 XSS 漏洞
2. 漏洞概览
通过对比 2.3.6 和 2.3.7 版本,发现共有 7 个 PHP 文件被修改,其中 5 个涉及安全更新:
change_config.php- 修复任意文件删除导致的 RCEsimple_document.php- 修复反射型 XSSsplit_document.php- 修复反射型 XSS
3. 任意文件删除导致 RCE 漏洞分析
3.1 漏洞位置
php/change_config.php
3.2 漏洞成因
3.2.1 未授权访问
- 2.3.6 版本中身份验证位于第 54 行,前 53 行代码可无需认证执行
- 攻击者可利用前 53 行中的功能
3.2.2 任意文件删除
- 第 47 行存在
unlink方法,可删除$dir指定目录中所有文件 $dir由$configManager->getConfig('path.swf')获取path.swf配置可通过 POST 参数SWF_Directory控制
3.2.3 攻击链
- 攻击者通过未授权访问
change_config.php - 提交
SWF_Directory参数指向任意目录 - 触发
unlink清空目标目录
3.3 结合 setup.php 实现 RCE
3.3.1 setup.php 作用
- 是 FlexPaper 后台的安装程序
- 用于生成和配置配置文件
3.3.2 关键方法
pdf2jsonEnabled 和 pdf2swfEnabled 方法:
function pdf2jsonEnabled($path_to_pdf2json) {
exec($path_to_pdf2json, $output, $returnvalue);
return $returnvalue == 0;
}
function pdf2swfEnabled($path_to_pdf2swf) {
exec($path_to_pdf2swf, $output, $returnvalue);
return $returnvalue == 0;
}
3.3.3 漏洞利用
- 利用任意文件删除清空
php/config/目录 - 使系统认为未安装(
admin.password为 null) - 访问
setup.php并传入恶意参数:PDF2JSON_PATH或PDF2SWF_PATH参数可执行任意命令
4. 反射型 XSS 漏洞分析
4.1 simple_document.php XSS
漏洞位置
php/simple_document.php
漏洞代码
$doc = $_GET['doc'];
// ...
echo $doc;
修复方式
2.3.7 版本添加了 htmlspecialchars 过滤
4.2 split_document.php XSS
漏洞位置
php/split_document.php
漏洞代码
$doc = $_GET['doc'];
// ...
echo $doc;
修复方式
2.3.7 版本添加了 htmlspecialchars 过滤
利用限制
- 需要
getTotalPages方法能成功读取 PDF 文件 - 攻击 payload 需与现有 PDF 文件名匹配
- 否则会导致
numPages为空,XSS 无法稳定触发
5. 漏洞修复建议
-
权限控制:
- 在所有敏感操作前进行身份验证
- 使用最小权限原则
-
输入验证:
- 对所有用户输入进行严格过滤
- 使用
htmlspecialchars防御 XSS
-
文件操作安全:
- 限制文件操作目录范围
- 对用户可控的路径参数进行严格校验
-
命令执行安全:
- 避免直接使用用户输入执行系统命令
- 如需必要,应进行白名单校验
-
安装程序安全:
- 安装完成后强制删除或禁用安装程序
- 安装过程中增加 CSRF 防护
6. 总结
FlexPaper 2.3.6 版本存在三个高危漏洞:
- 通过任意文件删除触发重装机制,导致 RCE
- 两处反射型 XSS 漏洞
这些漏洞的组合可导致未授权攻击者完全控制服务器。开发人员应及时升级到安全版本,并遵循安全编码实践。