不安全文件下载与上传之——上传漏洞之——MIME type验证原理绕过

上传漏洞之MIME type验证原理绕过

服务端验证绕过(MIME 类型检测)

什么是MIME

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

		应用在php中可以对很多文件的扩展名进行限制

MIME组成

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

常见的MIME类型(通用型)

			超文本标记语言文本 .html text/html
			xml文档 .xml text/xml
			XHTML文档 .xhtml application/xhtml+xml
			普通文本 .txt text/plain
			RTF文本 .rtf application/rtf
			PDF文档 .pdf application/pdf
			Microsoft Word文件 .word application/msword
			PNG图像 .png image/png
			GIF图形 .gif image/gif
			JPEG图形 .jpeg,.jpg image/jpeg
			au声音文件 .au audio/basic
			MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
			RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
			MPEG文件 .mpg,.mpeg video/mpeg
			AVI文件 .avi video/x-msvideo
			GZIP文件 .gz application/x-gzip
			TAR文件 .tar application/x-tar
			任意的二进制数据 application/octet-stream



	**这种漏洞一般在全局数组$_FILES这里**
		通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
		第一个参数是表单的 input name,
		第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。
			$_FILES["file"]["name"] - 被上传文件的名称
			$_FILES["file"]["type"] - 被上传文件的类型
			$_FILES["file"]["size"] - 被上传文件的大小,以字节计
			$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
			$_FILES["file"]["error"] - 由文件上传导致的错误代码
			详细可参考:http://www.w3school.com.cn/php/php_file_upload.asp

分析代码逻辑

首先会获取到前端的提交请求,然后定义了一个数组(定义图片上传指定类型),然后通过upload_sick函数对上传的文件进行一定的检查。
分析upload_sick函数存在漏洞的的原因是因为 $ _FILES()
这个全局的方法是通过浏览器http头去获取的content-type,content-type是前端用户可以控制的。容易被绕过。

绕过方法

上传一张正常的符合标准的图片,对其content-type进行抓包操作。可见正常上传符合要求的图片中数据包中content-type为image/png(对比符合条件),而php文件则不符合条件返回文件类型错误。

发布了80 篇原创文章 · 获赞 8 · 访问量 4221

猜你喜欢

转载自blog.csdn.net/weixin_43079958/article/details/105353324