代码安全之上传文件

上传数据包

从数据包中可以看出,验证文件类型的参数有:Content-Type、Filename、Filedata。

客户端JS验证

原理介绍

通过JS验证上传文件类型是最不安全的做法,因为这个方式是最容易被绕过的。我们先来看下JS实现文件检测的代码如下:

客户端JS验证通常做法是验证上传文件的扩展名是否符合验证条件。

绕过姿势

1 通过firefox的F12修改js代码绕过验证

2 使用burp抓包直接提交,绕过js验证

服务端MIME类型检测

MIME类型介绍

不同的文件类型有不同的MIME头,常见的MIME头如下:

验证MIME头的测试代码

以上是一个简单的服务器上传验证代码,只要MIME头符合image/gif就允许上传。

绕过方式

使用Burp截取上传数据包,修改Content-Type的值,改为image/gif即可成功绕过上传webshell。

服务端文件扩展名检测

扩展验证测试代码

默认上传后的文件保存的名字是以获取到名字。

绕过技巧

1 使用大小写绕过(针对对大小写不敏感的系统如windows),如:PhP

2 使用黑名单外的脚本类型,如:php5

3 借助文件解析漏洞突破扩展名验证,如:test.jpg.xxx(apache解析漏洞)

4 借助系统特性突破扩展名验证,如:test.php_(在windows下下划线是空格,保存文件时下划线被吃掉剩下test.php)

5 双扩展名之间使用00截断,绕过验证上传恶意代码如:test.php%00.jpg

6 借助.htaccess文件上传恶意代码并解析。如:上传一个.htaccess文件,内容为AddTypeapplication/x-httpd-php .jpg,上传的jpg文件就可以当作php来解析

7 使用00截断,绕过后缀验证获取webshell(php<5.3.4+关闭GPC)

8 超长文件名截断上传(windows 258byte | linux 4096byte)

服务端文件内容检测

检测文件头

文件头简介

不同的图片文件都有不同文件头,如:

PNG: 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A

JPEG: 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)

GIF: 文件头标识 (6 bytes) 47 49 46 38 39(37) 61

绕过方式

绕过这个检测只需要在恶意脚本前加上允许上传文件的头标识就可以了。

文件内容检测

检测方式

使用正则对内容进行匹配,一旦匹配到恶意代码,就中断上传,提示用户重新上传。

绕过方式

通过fuzz,绕过正则上传。

安全建议

1 使用白名单限制可以上传的文件扩展

2 验证文件内容,使用正则匹配恶意代码限制上传

3 对上传后的文件统一随机命名,不允许用户控制扩展名

4 修复服务器可能存在的解析漏洞

5 严格限制可以修改服务器配置的文件上传如:.htaccess

原文地址:https://www.cnblogs.com/chenlove/p/10551434.html

时间: 2024-10-11 16:38:23

代码安全之上传文件的相关文章

FTP文件操作之上传文件

上传文件是一个比较常用的功能,前段时间就做了一个上传图片的模块.开始采用的是共享文件夹的方式,后来发现这种方法不太好.于是果断将其毙掉,后来选择采用FTP的方式进行上传.个人感觉FTP的方式还是比较好用的,所以跟大家分享一下.   /// <summary> /// FTP上传文件 /// </summary> /// <param name="fileUpload">上传控件</param> /// <param name=&qu

selenium之上传文件或图片的操作

逛网站的时候经常会遇到需要上传图片的操作,这里主要来说下selenium操作上传文件的操作. 前提条件:定位的元素必须是type 属性是file类型.即type="file",如下图: 详细用法: 参考代码: from selenium import webdriver import time driver = webdriver.Chrome() def test_open_page(): '''打开界面''' driver.maximize_window() driver.get(

JAVA代码实现上传文件至文件服务器(远程服务器、非项目当前所在服务器)

步骤一:添加依赖 <!--sftp文件上传--> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </dependency> 步骤二:编写工具类 package com.example.vue.vuedemo; import com.jcraft.js

PHP学习之上传文件一

1.is_uploaded_file图片是否存在在临时文件夹内 move_loaded_file移动临时文件到指定根目录下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/x

安卓之上传文件,即HTTP提交表单

获取文件: public void Init()    {        noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);        noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));        adapter = new GridAdapter(this);        adapter.update1();      

php的表单提交之上传文件

首先创建含表单的html文件:upload.html <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <form action="upload.php" method="post"

Express采坑系列之上传文件

封装文件上传工具multerUtil.js 创建util文件夹并在其下创建multerUtil.js var multer=require('multer'); var storage = multer.diskStorage({ //设置上传后文件路径,uploads文件夹会自动创建. destination: function (req, file, cb) { cb(null, './public/uploads') }, /** * 给上传文件重命名,获取添加后缀名 * 参数名 + 文件

Struts2之上传文件

一.单文件上传 1.定义form表单 <form action="uploadFile" method="post" enctype="multipart/form-data"> 上传文件:<input type="file" name="myFile"> <input type="submit" value="提交"> </

Jmeter之上传文件

前言 我们可以利用postman工具来测试上传文件的接口,那么假如要利用Jmeter工具来进行上传接口的测试,又该如何测试呢? 上传文件的接口地址:/pinter/file/api/upload:接口类型:post:参数名称:file :MINE类型:application/octet-stream : 一:添加上传接口的请求,填入接口地址,添加察看结果树,勾选对POST使用multipart/form-data 二:选择文件上传,导入需要上传的文件 原文地址:https://www.cnblo