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

admin 2026-04-18 07:39:44 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细解析UploadLabs第15-16关的图片马绕过技术,重点分析getimagesize()和exif_imagetype()等真实图片检测函数的局限性。关键发现表明通过构造合法图片结构插入PHP代码可实现绕过,需配合文件包含漏洞执行。实践建议包括使用copy/b命令拼接图片与木马、注意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