专栏首页用户6517667的专栏软件安全性测试(连载14)

软件安全性测试(连载14)

顾翔老师近期推出一对一入职面试辅导。有兴趣者可加微信xianggu19720625与我联系。先要提供简历初选,合适者进一步洽谈。

顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:

https://item.jd.com/34295655089.html

《基于Django的电子商务网站》网上购买地址:

https://item.jd.com/12082665.html

店铺二维码:

2.9文件上传漏洞

1.两个著名的文件上传漏洞

1)IIS 6.0文件上传漏洞

l 在建立一个目录名为a.asp,该目录下所有文件均可被解析为asp文本。

l 建立文件a.asp;1.jpg,分号将会被截断,仍旧作为a.jsp被解析。

设想如果恶意用户写了一段具有破坏性质的asp脚本,命名为a.asp;1.jpg,上传到网站服务器上,然后运行这个文件,不就可以达到攻击的目的了。

2)Apache文件上传漏洞

在Apache1.X和2.X中,建立一个文件为1.php.rar,由于rar文件没有在%APACHE_HOME%/conf/mime.types定义,所以会被误认为是1.php文件。和IIS 6.0文件上传漏洞一样,如果恶意用户写了一段具有破坏性质的php脚本,命名为1.php.rar,上传到网站服务器上,然后运行这个文件,也就可以达到攻击的目的。

2.绕过前端检查

有如下HTML代码。

<form action="http://doUpload.jsp"method="post" enctype="multipart/form-data">

请选择要上传的文件<input type="file" name="upfile"size="50">

<input type="button"value="提交" id="submit"onsubmit="checkFileType()">

点击【提交】按键,运行javascript函数checkFileType(),只有后缀为jpg、png、gif、bmp格式的文件才可以上传。黑客写了一段具有破坏性质的jsp代码,命名为1.jpg。1.jpg这个文件可以绕过前端javascript函数checkFileType()检查,这个时候用类似于Burn Suite的截包工具把这个HTTP请求截获,改名为1.jsp,如30所示。

30 上传文件绕过前端检查

发送修改好的请求包,这样一个名为1.jsp带有恶意代码的文件就被上传到服务器上。

3. 文件上传的防护方法

由上面的例子可以看出,仅仅在前端进行防护是远远不够的,重要的是在后端进行防护检验。

1)黑名单法

BlackList=array('asp','asa','aspx');

对于黑名单而言,不允许上传在黑名单里面的文件。用这种方法好像可以解决文件上传问题,但是这种方法是不推荐的,主要因为。

l 容易遗漏:使用黑名单,对有些文件类型是很容易遗漏的。

l Windows大小写不敏感:如果服务器是Windows,这里定义了'asp','asa','aspx',如果用户上传的是1.ASP文件是否可以接受?

2)白名单法

WhiteList=array('jpg','png','bmp','gif');

上面程序是一个典型的白名单,只允许白名单里面的文件被上传。使用这种方法是相对比较安全的。

另外,检查文件类型不要仅仅通过文件后缀去判断,对于后端建议采用基于MIME属性去判断。下面代码是JAVA获得文件属性的一种方法。

importjavax.activation.MimetypesFileTypeMap;

import java.io.File;

class GetMimeType {

public static void main(String args[]) {

File f = newFile("gumby.gif");

System.out.println("Mime Type of" + f.getName() + " is " +

newMimetypesFileTypeMap().getContentType(f));

// expected output :

// "Mime Type of gumby.gif isimage/gif"

}

}

3)其他措施

处理检查文件类型,还可以使用以下三个方面进行加固。

l 确保上传的目录是不可执行的:如果被上传上来的文件是不可以运行的,中途即使被截获修改了名称也是无所谓的。

l 上传后修改文件名:对于上传上来的文件修改文件名,比如可以把类似于mysql.ini文件改名为1.ini,从而使其失去作用。

l 单独设置文件服务器的域名。设置单独的文件服务域名是一种不错的选择,这样类似于XSS注入也受到了一定控制。

顾翔老师与云测学院联合推出:软件测试分析与设计,请点击https://v.youku.com/v_show/id_XNDQ3MzkyNjk3Ng==.html?spm=a2hzp.8244740.0.0,收看。有不同观念欢迎与顾翔老师交流!

本文分享自微信公众号 - 软件测试培训(iTestTrain),作者:顾翔

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

原始发表时间:2020-01-06

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 测试开发之路--Flask 之旅 (三):数据库

    通过前两次的努力,我们对环境有了增删查改以及部署和查看日志的能力。 现在已经处于将就可用的状态。但其实还差了很重要的东西,就是权限的管理。 因为不能说每个用户上...

    小老鼠
  • DevOps工具介绍连载(41)——Vault

    Ansible 1.5的新版本中, “Vault” 作为 ansible 的一项新功能可将例如passwords,keys等敏感数据文件进行加密,而非存放在明文...

    小老鼠
  • 软件性能测试(连载5)

    线程单元中的处理器队列的即时长度,如果大于CPU数量+1,说明处理器处于堵塞状态。

    小老鼠
  • Linux编程--文件操作

    所有执行I/O操作的SystemCall都是以文件描述符(File Describtion,简称fd)来代指打开的文件。它是一个非负小整数。包括:Pipe,FI...

    None_Ling
  • Python学习笔记5:文本的读写

    先做下名词解释,所谓文本文件,就是指以特定的编码方式构成的数据序列。我们日常办公处理的.txt文件,.csv文件等都是文本文件。在进行网络爬虫、数据分析时,数据...

    光学小豆芽
  • Python中的File文件操作#学习猿地

    > 针对磁盘中的文件的读写。文件I/O I 输入(input) O输出(Output)

    学习猿地
  • 工作了这么久,文档管理这样做才最有效率

    今年以来,因为疫情的原因经常远程在家办公,很多工作中的文档无可避免的就保存在了家中的电脑上。在恢复现场办公后,又需要将家中电脑的文档与工作电脑中的文档合并起来。...

    大江小浪
  • Python中的File文件操作#学习猿地

    > 针对磁盘中的文件的读写。文件I/O I 输入(input) O输出(Output)

    学习猿地
  • 上帝托梦给我说:一切皆文件

    后记:这些故事当然是我杜撰的,Ken Thompson和Dennis Ritchie在设计Unix的时候,具体是怎么想的,我们无从知道。TCP/IP协议也不是B...

    用户6543014
  • 【答疑释惑】标准C语言如何操作文件?

    C语言中操作文件功能都用ANSI C提供的一组标准库函数来实现。文件操作标准库函数有如下: fprintf:往文件中写格式化数据 fscanf:格式化读取文件中...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券