代码安全之上传文件

上传数据包

从数据包中可以看出,验证文件类型的参数有: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

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2017-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

配置Tomcat使用https协议(配置SSL协议) (http自动跳转到https)

1342
来自专栏hbbliyong

Git SSH Key 生成步骤

Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置。 github的SSH配置如下: 一 、 设置Git的us...

3896
来自专栏记事本

2018上海大学生安全竞赛web3解析

先看后缀名绕过吧。看着有点熟悉,总感觉在哪见过,后来才想起是pwnhub的公开赛里见过,考察的是end()函数。给个例子输出就清楚了。

71845
来自专栏云计算教程系列

如何在Debian 9上安装和配置Nextcloud

Nextcloud是ownCloud的一个分支,它是一个文件共享服务器,允许您将个人内容(如文档和图片)存储在集中位置,就像Dropbox一样。与Nextclo...

1.6K3
来自专栏FreeBuf

文件上传限制绕过技巧

文件上传漏洞是web安全中经常利用到的一种漏洞形式。一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意...

3742
来自专栏JMCui

Nginx 的安装与配置

1.1K6
来自专栏北京马哥教育

SSH协议详解

一、 前言 使用SSH可以在本地主机和远程服务器之间进行加密地传输数据,实现数据的安全。而OpenSSH是SSH协议的免费开源实现,它采用安全、加密的网络连接...

9234
来自专栏向治洪

在Windows下搭建Gitlab服务器

一.GitLab简介 GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。 可通过Web界面进行访问...

2K10
来自专栏PHP实战技术

你的api上锁了吗?

职责单一化,各司其职,后端只负责Api接口编写提供给各种不同类型的客户端去调用,但是客户端和服务器端调用是要有权限限制的,不能任何一个客户端都可以随便调用我们的...

1092
来自专栏FreeBuf

apple ID可绕过安全提示问题直接修改密码漏洞

利用前提:知道受害者的apple id及其注册时的出生日期 利用步骤: 第一步:登录https://iforgot.apple.com/iForgot/iFor...

25610

扫码关注云+社区

领取腾讯云代金券