文件上传漏洞

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

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

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

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

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

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();
	}

}



目录
相关文章
|
3月前
|
开发框架 安全 .NET
文件上传绕过】——解析漏洞_IIS6.0解析漏洞
文件上传绕过】——解析漏洞_IIS6.0解析漏洞
81 4
|
2月前
|
安全 Shell 网络安全
文件上传漏洞(四)edjpgcom
文件上传漏洞(四)edjpgcom
|
2月前
|
安全 Java Linux
文件上传漏洞(三)Cknife
文件上传漏洞(三)Cknife
|
2月前
|
安全 网络协议 Shell
文件上传漏洞(七)XISE寄生虫Weevely学习
文件上传漏洞(七)XISE寄生虫Weevely学习
|
2月前
|
存储 安全
文件上传漏洞(六)一句话马图片
文件上传漏洞(六)一句话马图片
|
5月前
|
安全 JavaScript API
文件上传漏洞——绕过
绕过客户端检测(JS检测) 绕过服务端检测(MIME类型检测、文件后缀检测、文件内容检测)
127 1
|
5月前
|
SQL 监控 安全
探索网络安全:浅析文件上传漏洞
网络安全是一场没有硝烟的战争,它要求我们时刻保持警惕,不断学习与适应。无论是采用强密码、数据加密,还是定期更新软件、安装安全软件,每一项措施都是我们构建网络安全防线的基石。同时,我们也应意识到,技术手段之外,提升安全意识、培养安全习惯同样至关重要。
|
5月前
|
开发框架 安全 JavaScript
文件上传漏洞
文件上传漏洞允许攻击者上传可执行脚本,获取服务器控制权。常见原因包括服务器配置不当、验证不严等。防御措施包括设置不可执行的上传目录、严格文件类型检查、随机化文件名和路径,以及使用独立的文件服务器域名。WebShell是上传的恶意脚本,常用于控制网站服务器。
101 0
|
5月前
|
自然语言处理 安全 网络安全
taoCMS v3.0.2 文件上传(CVE-2022-23880)
taoCMS v3.0.2 文件上传(CVE-2022-23880)
|
7月前
|
开发框架 安全 .NET
文件上传漏洞技术总结
该文总结了文件上传技术相关的漏洞和绕过方法,包括语言可解析的后缀(如phtml、pht)、常见的MIME类型、Windows特性(如大小写、ADS流、特殊字符)、0x00截断技巧(需满足PHP版本和magic_quotes_gpc状态)、POST型0x00截断、文件头检查(通过合成图片马绕过)、二次渲染(利用未修改部分插入恶意代码)以及各种服务器的解析漏洞(Apache的.htaccess、解析漏洞,IIS的目录解析、文件解析、默认解析和IIS 7.x/Nginx的畸形解析)。此外,还提到了Java的空字节截断问题。
182 1
文件上传漏洞技术总结