ShowDoc 两个未授权入口:SQL 注入读 token,上传目录 getshell
ShowDoc 是很多 IT 团队用来共享 API 文档和技术文档的开源在线文档工具,默认 PHP + SQLite 存储,出于「文档站没什么敏感的」的想法,大量实例被直接自建在内网甚至公网。下面是两条影响面较大的入口:一条是 CVE-2025-0520 的文件上传 RCE,一条是 3.2.5 及之前的未授权 SQL 注入。
参考资料:
- 阿里云漏洞库 AVD-2025-0520(CVE-2025-0520):
- Vulnerability-Wiki:
- 白阁文库 ShowDoc api_page 上传分析:
漏洞一:CVE-2025-0520 未经验证的文件上传 RCE
成因是文件扩展名校验不当,攻击者可以上传可执行的 PHP 文件,进而在服务器上执行任意代码,属于远程代码执行。
- 影响版本:ShowDoc 2.8.7 之前的版本
- 攻击路径:远程
- 权限要求:无需权限
- 攻击复杂度:容易
- 阿里云评分:6.3
- 披露时间:2025-04-30,已有官方补丁
除这个 CVE 之外,还有一条与 api_page 相关的任意文件上传 getshell 问题。它和上面的 CVE 是不同的版本命中点,走的是另一个上传入口,并且需要登录后才能触发——也就是说,一旦默认口令没改,这条链路的前置条件基本等于不存在。
漏洞二:ShowDoc <= 3.2.5 未授权 SQL 注入
ShowDoc 3.2.5 及之前版本存在一处未授权 SQL 注入,攻击者无需登录即可利用,目标是从 SQLite 数据库中窃取用户密码和 Token。
对攻击者来说 Token 的性价比更高:用户登录后 Token 明文保存在 SQLite 里,而密码经过 hash 处理。拿到 Token 基本等同于拿到对应用户的会话,后续可以直接以该身份操作文档。
利用时需要每次请求都带上验证码,这曾经是拦人的一步,现在用 ddddocr 一类的验证码识别库就能自动处理。复现可以直接用 Vulhub 起一个 ShowDoc 2.8.2 环境,默认账号密码是 showdoc / 123456。
为什么这类洞容易中招
- SQLite 数据库文件默认放在 Web 可达路径。在 PHP 环境下,只要路径或文件后缀可控,数据库文件就可能被当成脚本执行,而不只是一个被读走的数据文件。
- 上传目录没有禁用脚本执行。一旦白名单校验不严或者可以被绕过,任意文件上传就直接变成 getshell。
- 自建文档站常被当成「内部低价值资产」。它未必真的不暴露公网,很多实例直接开放,或者只靠默认账号挡着。
加固清单
- 升级到最新版:文件上传漏洞修复于 2.8.7 之后,SQL 注入修复在 3.2.5 之后的最新版。
- 不要使用默认账号密码,先改掉
showdoc / 123456。 - 限制公网访问;必须暴露时加认证网关或 IP 白名单。
- 在 Web 服务器层面禁止上传目录与数据目录执行 PHP。以 Nginx 为例,可以直接对相关目录下的 PHP 请求返回 403,目录名按实际部署替换:
location ~* ^/(uploads|data)/.*\.php$ {
return 403;
}
- 把 SQLite 数据库文件放到 Web 根目录之外。
- 文件上传做后缀白名单 + 重命名,不要依赖前端校验。
- 定期备份;出事后按 Token 与密码已泄露处理,逐个轮换。