专栏首页信安之路代码安全之上传文件

代码安全之上传文件

上传数据包

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

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 记一次有趣的渗透测试

    最近在做渗透测试的练习中遇到一个比较有意思的站点,在此记录下来,希望能给向我一样刚入安全圈不久的萌新提供一些基本思路吧。

    信安之路
  • 简单粗暴的文件上传漏洞

    文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接。但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的...

    信安之路
  • WeTool逆向:借用别人的成果打造自己的程序

    这是一款专业的微信粉丝和社群的管理工具,是目前市面上微信 HOOK 做的非常不错的一款产品。不管是从产品设计角度还是用户体验角度或者是产品安全角度来看都无可挑剔...

    信安之路
  • 文件上传限制绕过技巧

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

    FB客服
  • python下的日期与时间(时间格式转换、时间戳处理,时间差处理)

    时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX和Windows只支持到2038年。

    学到老
  • Python第二个项目:爬取一个网站的所有图片

    前面搭建爬虫环境完成第一个实例爬取信息,今天继续,Python第二个项目:爬取一个网站的所有图片,看到一个网站的图片,想要弄到本地,一张张保存太过于麻烦,于是,...

    祈澈菇凉
  • 谈谈Unity的资源管理

    在Unity最佳实践明确指出, 要使用AssetBundle而不是Resources目录来管理资源。

    重归混沌
  • 云原生进程再提速,腾讯云发布四款云中间件产品

     “以微服务、容器、无服务器以等为代表的云原生技术正在成为下一代云计算发展的重要支撑,腾讯云云原生团队正在从技术、产品、生态等多个层面全面布局,引领整个行业的...

    腾讯云serverless团队
  • UNIX编程艺术之“文本化”

        本章的标题表达了作者的主旨:Good Protocols Make Good Practice。的确,好的协议或文件格式,会大大提升使用者的效率。这里的...

    王亚昌
  • Python|While循环和For循环

    pass是空语句,它的出现是为了保持程序结构的完整性。pass不做任何事情,一般用作占位符。

    算法与编程之美

扫码关注云+社区

领取腾讯云代金券