web安全--文件上传漏洞解决

今天学习的漏洞自己以前也没有接触过,文件上传漏洞,直面意思可以利用WEB上传一些特定的文件。一般情况下文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。文件上传本身是互联网中最为常见的一种功能需求,关键是文件上传之后服务器端的处理、解释文件的过程是否安全。一般的情况有:
-1. 上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行;
-2. 上传文件FLASH策略文件crossdomain.xml,以此来控制Flash在该域下的行为;
-3. 上传文件是病毒、木马文件,攻击者用以诱骗用户或管理员下载执行;
-4. 上传文件是钓鱼图片或为包含了脚本的图片,某些浏览器会作为脚本执行,实施钓鱼或欺诈;
   总结一点:文件上传的文件载体要么在服务器端具备可执行性,要么具备影响服务器端行为的能力,其发挥作用还需要具备以下几个条件:
-1. 上传的文件具备可执行性或能够影响服务器行为,所以文件后所在的目录必须在WEB容器覆盖的路径之内;
-2. 用户可以从WEB上访问这个文件,从而使得WEB容器解释执行该文件;
-3. 上传后的文件必须经过安全检查,不会被格式化、压缩等处理改变其内容;

一、FCKEditor文件上传漏洞
   我们来看个简单的例子,FCKEditor是一款非常流行的富文本编辑器,其具有的文件上传功能出过许多漏洞,其中PHP版本的一个漏洞出在文件上传类型检查方面。文件上传后被保存在/UserFiles/all下,其文件检查代码如下:

点击(此处)折叠或打开

  1. $Config['AllowdExtensions']['File'] = array();//允许上传的类型
  2. $Config['DenedExtensions']['File'] = 
  3. array('php', 'php3', 'php5', 'phtml', 'asp', 'aspx', 'ascx', 'jsp', 'cfm', 'cfc', 'pl','pl','bat', 'exe', 'dll', 'reg', 'cgi' );//禁止上传的类型
    我们可以看到这段代码针对文件类型进行了检查,但是却不幸使用了黑名单,所以如果我们使用'php2'、'inc'等类型名就可以通过检查,导致了文件上传的漏洞。

二、绕过文件上传检查功能
   常见的文件上传检查针对文件类型进行,攻击者可以使用手动修改POST包然后添加%00字节用于截断某些函数对文件名的判断。如xxx.php[\0].JPG,对于一个只允许上传JPG格式的服务器,此文件可以绕过文件上传检查,但是对于服务器端解释来说,函数会被[\0]截断,导致成为xxx.php代码。除了修改文件名来绕过类型检查外,还可以修改文件头来伪造文件头,欺骗文件上传检查。

三、如何安全上传文件
   针对文件上传漏洞的特点和必须具备的三个条件,我们阻断任何一个条件就可以达到组织文件上传攻击的目的:
-1. 最有效的,将文件上传目录直接设置为不可执行,对于Linux而言,撤销其目录的'x'权限;实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理,一是方便使用缓存加速降低能耗,二是杜绝了脚本执行的可能性;

-2. 文件类型检查:强烈推荐白名单方式,结合MIME Type、后缀检查等方式;此外对于图片的处理可以使用压缩函数或resize函数,处理图片的同时破坏其包含的HTML代码;(MIME Type依赖于文件头,因此也可以用文件头进行检查,比如:rmvb就没有明确的MIME Type)

下面是文件头的获取代码(java)

/**
	 * 获取文件头
	 * @param filePath
	 * @return
	 */
	public static String getFileHeader(String filePath){
		FileInputStream in = null;
		String value = null;
		try {
			in = new FileInputStream(new File(filePath));
			byte[] b = new byte[4];
			in.read(b,0,b.length);
			value = byteToHexString(b);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				in.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return value;
	}

/**
	 * 16进制转换读取的文件byte
	 * @param b
	 * @return
	 */
	private static String byteToHexString(byte[] b) {
		StringBuffer sb = new StringBuffer();
		if(b == null || b.length <= 0){
			return null;
		}
		String hv;
		for(int i=0; i
-3. 使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件;

-4. 单独设置文件服务器的域名;

-5. 限制文件上传大小,防止上传文件中压缩有其他脚本文件,限制上传大小可以一定程度上防止,图片携带等等问题;

-6. 对文件头进行加密处理,防止黑客读取文件头信息

你可能感兴趣的:(web安全)