ShowDoc 作为常见的技术文档协作平台,常用于维护 API 文档、数据字典与团队知识库。本文将梳理微步情报近期披露的一处 ShowDoc 未授权 PHP 代码注入漏洞,由 云栈社区 整理,供安全研究人员参考防御。
漏洞概述
该漏洞根因在于 ShowDoc 未授权注册接口 registerByVerify 对 username 字段仅做 trim 处理,缺少对恶意 PHP 代码的过滤。攻击者只需向注册接口提交经过构造的恶意用户名,随后访问特定 URL 触发存储的恶意代码,便可在服务器上执行任意系统命令,形成远程代码执行(RCE)。

影响版本
官方已在 3.9.3 版本中修复该问题。
漏洞原理
为什么仅做 trim 处理还不够?trim 只能去掉字符串首尾空白,并不会拦截 <?、__halt_compiler、system( 这类 PHP 代码特征。这些字符一旦原样写入数据库,后续访问对应数据库文件时就会被当作 PHP 解析执行,最终导致任意命令执行。
具体来说,注册接口 /server/index.php?s=/Api/User/registerByVerify 在接收 username 参数后没有进行严格过滤,攻击者将 PHP 代码注入该字段,这些内容会随注册数据一并落入数据库。此时,攻击者只需要访问数据库文件对应的 URL,即能触发存储的恶意代码。
复现步骤
复现过程可分为三步:
- 获取验证码;
- 注册恶意用户名,注入 PHP 代码;
- 访问数据库文件,触发 RCE。
以一段 POC 命令为例:
python3 showdoc_poc.py -t http://localhost:8888 -c "ifconfig"
脚本运行后会先检测目标服务是否在线,然后请求验证码接口创建 captcha_id,从数据库读取验证码后,携带构造的 payload 提交注册请求,将恶意内容写入 username 字段。第二阶段执行 ifconfig,目标服务器返回网络接口信息,说明远程命令执行成功。

修复与防护
- 将 ShowDoc 升级至
3.9.3 及以上版本;
- 在 WAF 或入侵检测规则中,对
/server/index.php?s=/Api/User/registerByVerify 请求的 username 参数检测 <?、__halt_compiler、system( 等特征,触发告警或阻断;
- 对
username 等输入字段增加严格过滤,避免 PHP 代码片段进入存储。
|