文件上传漏洞

简介: 在上网的过程中,我们经常会将一些如图片、压缩包之类的文件上传到远端服务器进行保存。文件上传攻击指的是恶意攻击者利用一些站点没有对文件的类型做很好的校验,上传了可执行的文件或者脚本,并且通过脚本获得服务器上相应的权利,或者通过诱导外部用户访问、下载上传的病毒或木马文件,达到攻击的目的。

在上网的过程中,我们经常会将一些如图片、压缩包之类的文件上传到远端服务器进行保存。文件上传攻击指的是恶意攻击者利用一些站点没有对文件的类型做很好的校验,上传了可执行的文件或者脚本,并且通过脚本获得服务器上相应的权利,或者通过诱导外部用户访问、下载上传的病毒或木马文件,达到攻击的目的。

为了防范用户上传恶意的可执行的文件和脚本,以及将文件上传服务器当作免费的文件存储服务器使用,我们需要对上传文件类型进行白名单(非黑名单)校验,并且限制上传文件的大小,上传的文件需要进行重新命名,使攻击者无法猜测到上传文件的访问路径。

对于上传的文件来说,不能简单的通过后缀名来判断文件的类型,因为恶意攻击可以将可执行文件的后缀名改为图片或其他类型,诱导用户执行。因此,判断文件类型需要使用更安全的方式。

很多类型的文件,起始的几个字节内容是固定的,因此,根据这几个字节的内容,就可以确定文件类型,这几个字节也被称为魔数。

package com.yxj.constant;

/**
 * 文件头对应类型的枚举
 * 
 * @author Administrator
 *
 */
public enum FileType {
	JPEG("FFD8FF"), PNG("89504E47"), GIF("47494638"), TIFF("49492A00"), BMP(
			"424d"), DWG("41433130"), PSD("38425053"), XML("3C3F786D6C"), HTML(
			"68746C3E"), PDF("25044462D312E"), ZIP("504B0304"), RAR("52617221"), WAV(
			"57415645"), AVI("41564920");

	private String value = "";

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	private FileType(String value) {
		this.value = value;
	}
}
package com.yxj.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import com.yxj.constant.FileType;

public class FileUtil {

	/**
	 * 获取文件头信息
	 * 
	 * @param filePath
	 * @return
	 * @throws IOException
	 */
	private static String getFileHeader(String filePath) throws IOException {
		byte[] b = new byte[28];
		InputStream inputStream = null;
		inputStream = new FileInputStream(filePath);
		inputStream.read(b, 0, 28);
		inputStream.close();
		return bytes2hex(b);
	}

	/**
	 * 判断文件类型
	 * 
	 * @param filePath
	 * @return
	 * @throws IOException
	 */
	public static FileType getType(String filePath) throws IOException {
		String fileHeader = getFileHeader(filePath);
		if (fileHeader == null || fileHeader.length() == 0) {
			return null;
		}
		fileHeader = fileHeader.toUpperCase();
		FileType[] fileTypes = FileType.values();
		for (FileType type : fileTypes) {
			if (fileHeader.startsWith(type.getValue())) {
				return type;
			}
		}
		return null;
	}

	private static String bytes2hex(byte[] src) {
		StringBuilder builder = new StringBuilder();
		if (src == null || src.length == 0) {
			return "";
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				builder.append(0);
			}
			builder.append(hv);
		}
		return builder.toString();
	}

}



目录
相关文章
|
8天前
|
开发框架 安全 .NET
文件上传漏洞技术总结
该文总结了文件上传技术相关的漏洞和绕过方法,包括语言可解析的后缀(如phtml、pht)、常见的MIME类型、Windows特性(如大小写、ADS流、特殊字符)、0x00截断技巧(需满足PHP版本和magic_quotes_gpc状态)、POST型0x00截断、文件头检查(通过合成图片马绕过)、二次渲染(利用未修改部分插入恶意代码)以及各种服务器的解析漏洞(Apache的.htaccess、解析漏洞,IIS的目录解析、文件解析、默认解析和IIS 7.x/Nginx的畸形解析)。此外,还提到了Java的空字节截断问题。
23 1
文件上传漏洞技术总结
|
2月前
|
编解码 JavaScript PHP
文件上传绕过的常见方式
文件上传绕过的常见方式
43 0
|
3月前
|
安全 应用服务中间件 PHP
文件上传解析漏洞,以及检测方式的绕过
文件上传解析漏洞,以及检测方式的绕过
|
3月前
|
存储 安全 前端开发
【网络安全】文件上传漏洞
【网络安全】文件上传漏洞
76 1
【网络安全】文件上传漏洞
|
7月前
|
Web App开发 XML 安全
DedeCMS存在文件包含漏洞导致后台getshell(CVE-2023-2928)
DedeCMS存在文件包含漏洞导致后台getshell,攻击者可通过该漏洞获取目标服务器控制权限,进行深度利用。
174 1
|
11月前
|
开发框架 安全 前端开发
|
11月前
|
Web App开发 安全 前端开发
干货 | 总结各种骚姿势绕过文件上传
干货 | 总结各种骚姿势绕过文件上传
12235 0
|
开发框架 安全 .NET
9.文件上传漏洞基础
文件上传漏洞通常由于网页代码中的文件上传路径变量过滤不严造成的,如果文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。
9.文件上传漏洞基础
|
开发框架 安全 前端开发
2022渗透测试-文件上传漏洞的详细讲解
2022渗透测试-文件上传漏洞的详细讲解
2022渗透测试-文件上传漏洞的详细讲解
|
安全 Shell Linux
文件上传漏洞及防_3 | 学习笔记
学习笔记 文件上传漏洞及防_3
128 0
文件上传漏洞及防_3 | 学习笔记