开发者社区> 挨踢叶> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

文件上传漏洞

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

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

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

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

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

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

}



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
IIS6.0文件解析漏洞原理/复现
IIS文件解析漏洞原理 IIS6.0存在文件解析漏洞 , 文件名中分号( ; )后面的内容不会被解析 比如 a.asp;jpg 文件 会被IIS解析成 a.asp 这个漏洞是逻辑上的问题,IIS6.0只是简单的根据扩展名来识别文件类型 , IIS底层使用C++写的,分号在C++中是结束符号 , 解析文件名读取到分号的时候,IIS会认为代码已经结束,从而停止解析
250 0
目录遍历漏洞和文件读取漏洞的区别
通过操作URL强行访问web目录以外的文件,目录和命令。网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件、配置文件等,攻击者利用该信息可以为进一步入侵网站做准备。
104 0
文件上传
PHP单文件上传
933 0
第22天,文件上传
目录 1. 利用form表单上传文件 2. ajax上传文件 3. 上传头像时预览头像 4. 头像存储至数据库 头像存储的路径 访问上传的图片 models.
910 0
安全漏洞问题5:上传任意文件
上传任意文件漏洞是指用户可以上传所有文件,程序没有检测上传文件大小、类型是否是符合期望,或仅仅在客户端对上传文件大小、上传文件类型进行限制,未在服务器端进行验证。恶意用户可以利用例如上传一些恶意的程序,比如图片木马。
2505 0
文件解析漏洞总结
一、IIS 5.x/6.0解析漏洞 IIS 6.0解析利用方法有两种 1.目录解析 /xx.asp/xx.jpg 2.文件解析 cracer.asp;.jpg 第一种,在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
1172 0
上传文件
1.开启php_fileinfo.dll  拓展(php.ini) 2. php端代码 public function dotest(){ $file = Input::file('myfile'); if($file -> isValid()){ ...
526 0
+关注
挨踢叶
前端,移动,计算相关技术专家
72
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载