公司项目重构-Web安全-文件上传漏洞


如时间有限,可直接阅读防范手段一节。

1、背景介绍

今年开始公司准备对项目做部分重构,其中安全性问题首当其冲,除了已知的问题外,还需要发散思维,尽可能找出更多的潜在问题。期间发现一本非常好的书《白帽子讲Web安全》,感谢吴翰清大佬,读完本书让我对web安全有了更深刻的理解,强烈推荐大家阅读。

我打算记录下整个安全性重构的过程,相关知识点大部分会摘抄自《白帽子讲Web安全》,因为总结的很到位了,最后记录下公司内采用的防范手段(敏感信息不会书写)。

2、攻击原理

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获取了执行服务器命令的能力(webshell)。
主要看文件上传后,服务器怎么处理、解析文件,如果处理逻辑不安全,则可能会带来问题。

常见的安全问题如下:
1、上传的文件是web脚本语言,服务器的web容器解析并执行了用户上传的脚本,导致代码执行
2、上传文件是Flash的策略文件crossdomain.xml(或其他修改策略文件的情况)
3、上传文件是病毒、木马,诱骗用户或管理员下载执行
4、上传文件是钓鱼图片或包含了脚本的图片,在某些低版本浏览器下会被作为脚本执行,被利用钓鱼或欺诈

多数情况下,以上漏洞都指”上传web脚本能够被服务器解析“的问题,那需要具备以下几个条件:
1、上传文件能够被web容器解释执行,所以上传文件所在目录必须是web容器所覆盖的目录
2、用户能访问上传的文件,不然没办法访问更无法执行了
3、上传的文件不能被格式化、图片压缩等处理而改变内容

本书还讲了可以绕过文件上传检查的手段
1、对于判断后缀名验证文件的网站,可以修改上传过程的POST包,在文件名后添加%00字节,比如:xxx.php[\0].JPG([\0]是十六进制的0x00字符),可能会绕过应用的类型判断(修改post包),但在c或php等语言中0x00被认为是终止符,最终被截断当成php文件解析。
2、对于通过上传文件的文件头来验证的,浏览器的MIME Sniff功能就是通过读取文件前256个字节来判断文件类型的,攻击者可能伪造一个合法的文件,将真实的PHP等脚本代码附在合法的文件头之后,但容器需要当做php文件来解析,在特定环境下可能会奏效。
3、利用web容器的功能攻击的
4、利用上传文件钓鱼,比如构造假的图片http://…/item.jpg,但实际上内容确实js脚本:

png
<script>location.href=...</script>

第一行的png是伪造的文件头,绕过上传时的文件类型检查。
这个方法在低版本的ie6、ie7和ie8的兼容模式,浏览器会缺陷的将文件当成html执行,后来微软才在ie8中增强的MIME Sniff。

3、防范手段

1)、做好文件类型检查(重要)

可以结合MIME Type、后缀检查等方式判断文件类型。
如果要限制上传的文件类型,建议采用白名单的方式配置允许的类型,因为黑名单可能会漏掉或后期不及时更新。建议公司封装公共的上传组件(前端+后端)代码,避免让技术人员单独实现。

2)、最好对图片进行压缩或resize

对图片进行压缩,以破坏图片中可能包含的HTML代码。如果不需要保存原图的话,可以对图片进行压缩减少大小。

3)、使用随机数改写文件名和文件路径(根据公司需求)

可以增加攻击成本,比如使上传策略文件的攻击失效(如flash的crossdomain.xml文件)。但会导致文件名展示不友好,有些场景是需要显示原文件名的,可将用户上传的文件名保存到数据库中,我们的做法是将上传的所有文件信息由单独的数据表保存(原文件名、访问url、上传时间、上传人等字段)。

4)、设置单独文件服务器和域名(重要)

应该将文件保存在专门的文件服务器上,做静态文件处理,一方面方便利用缓存加速,另一方杜绝脚本执行的可能。并为文件服务器配置单独域名可利用浏览器同源策略的关系,让部分攻击失效。

5)、检查病毒木马、色情、反政府等文件

自己实现比较难,我们是购买的云服务。

暂时就写到这里,如有变化,会及时更新的。如有错误,请大家及时提出。
再次感谢吴翰清大佬!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Spring Boot 和 MyBatis-Plus 进行项目重构,可以遵循以下步骤来完成: 1. 添加依赖:在项目的 `pom.xml` 文件中,添加 Spring Boot 和 MyBatis-Plus 的相关依赖。例如: ```xml <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> ``` 请确保将 MyBatis-Plus 的最新版本号替换到 `<version>` 标签中。 2. 配置数据库连接:在 `application.properties` 或 `application.yml` 文件中配置数据库连接信息,包括数据库 URL、用户名和密码等。 3. 创建实体类:根据项目需求,在 Java 包中创建实体类,用于映射数据库表结构。 4. 创建 Mapper 接口:创建一个继承自 MyBatis-Plus 的 `BaseMapper` 接口的 Mapper 接口,用于定义数据库操作方法。 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface YourEntityMapper extends BaseMapper<YourEntity> { // 在此定义自定义的数据库操作方法 } ``` 5. 编写 Mapper XML 文件:在 resources 目录下创建与 Mapper 接口对应的 XML 文件,编写 SQL 语句以实现数据库操作。 6. 创建 Service 层:创建一个 Service 层来处理业务逻辑,并注入 Mapper 接口的实例。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class YourEntityService { private final YourEntityMapper yourEntityMapper; @Autowired public YourEntityService(YourEntityMapper yourEntityMapper) { this.yourEntityMapper = yourEntityMapper; } // 在此编写业务逻辑方法 } ``` 7. 创建 Controller 层:创建一个 Controller 层来处理 HTTP 请求,并注入 Service 层的实例。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/your-entity") public class YourEntityController { private final YourEntityService yourEntityService; @Autowired public YourEntityController(YourEntityService yourEntityService) { this.yourEntityService = yourEntityService; } // 在此定义接口方法,处理请求 } ``` 8. 运行项目:启动 Spring Boot 应用程序,可以使用 `@SpringBootApplication` 注解标记启动类,并在其中添加 `main` 方法。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 以上是使用 Spring Boot 和 MyBatis-Plus 进行项目重构的基本步骤。你可以根据实际需求进行更多的配置和开发工作,如添加其他依赖、配置缓存、编写业务逻辑等。 希望以上内容对你有所帮助!如果有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值