UploadLabs第15-16关详解:图片马绕过与检测机制升级

admin 2026-06-12 04:44:55 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细分析了UploadLabs第15-16关的图片马绕过技术,核心在于构造真实图片结构插入PHP代码以通过getimagesize()和exif_imagetype()检测。关键发现包括:检测机制从简单文件头校验升级为图片结构解析,但通过copy/b拼接合法图片与WebShell仍可绕过;PHP版本差异影响代码执行成功率。实战建议使用图片马结合文件包含漏洞实现RCE,强调检测通过不等于安全,关键在于文件可控性和执行路径。 综合评分: 85 文章分类: WEB安全,渗透测试,漏洞分析,实战经验,安全工具


关键点分析

1️⃣ getimagesize()是 PHP 中一个非常常用的内置函数,用于获取图像的大小和类型信息

👉 作用:

  • 读取图片信息
  • 判断文件是否为“合法图片”

返回结果说明

  • 索引 0 给出的是图像宽度的像素值
  • 索引 1 给出的是图像高度的像素值
  • 索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
  • 索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的 标签
  • 索引 bits 给出的是图像的每种颜色的位数,二进制格式
  • 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
  • 索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header(“Content-type: image/jpeg”);

如果getimagesize无法读取图像信息,则返回false。

2️⃣ image_type_to_extension()

👉 返回:

```
.jpg / .png / .gif
### 3️⃣ 判断逻辑

能被识别为图片 → 允许上传

---

## 和第14关的本质区别

| 关卡 | 检测方式 |
| --- | --- |
| 第14关 | 字节判断 |
| 第15关 | **图片结构解析** |

---

👉 看起来更安全了,但其实:

👉 **仍然可以绕过**

# 三、第15关绕过思路

关键点:

👉 `getimagesize()` 只关心:

文件是否“像图片”

---

👉 并不会检查:

* 是否包含PHP代码
* 文件是否被污染

---

## 我们先尝试使用第14关的绕过方式进行尝试。

## 构造文件txt,内容为:

GIF89a<?php@eval($_POST['cmd']); ?>

上传测试:

![](https://mmbiz.qpic.cn/sz_mmbiz_gif/5vTt22mqAAxlOp3dpSE0Ficsu7ics4w2kZ3dvNRjL9SPFXASwKdPN6dcaN6shdOIRe3dYmIT6IP1sXVhkCBP1WrVWCvMZmqqlxK6PsIc34Bwc/640?wx_fmt=gif&from=appmsg#imgIndex=0)

直接上传错误。

## 为什么会报错?

因为:

* 图片结构不完整 ❌
* getimagesize() 解析失败 ❌

正确思路:构造“真实图片马”

## 核心思想

👉&nbsp;**不是伪造图片,而是:**

在“真实图片”中插入PHP代码

---

👉 这才叫:

👉&nbsp;**图片马(Image WebShell)**

四、实践绕过

1、构造图片马

方法:copy /b 拼接(Windows)

准备两个文件:

---

### 1️⃣ 一个正常图片
test.jpg

评论:0   参与:  0