修复路径穿越、任意文件写入漏洞

背景

前段时间随手写的一个文件上传服务,在公司的渗透测试下漏洞百出,其中少不了路径穿越和任意文件写入漏洞。其实这两个漏洞的修复并不复杂,只要对入参进行两个条件的校验就可以了。

问题分析

先来了解一下这两个漏洞是什么

路径穿越漏洞

路径穿越(Path Traversal)是一种常见的安全漏洞,攻击者通过该漏洞可以访问系统中未授权的文件或目录。修复该漏洞的方法包括以下几个步骤:

  1. 验证输入:首先,需要对所有输入进行严格的验证。攻击者通常会利用路径穿越漏洞通过输入特定字符来访问系统中的敏感文件或目录。因此,在代码中验证输入是非常重要的。
  2. 检查路径:在使用输入来构造路径之前,需要检查路径是否存在于预期的目录中。如果路径指向系统中未授权访问的目录,应该立即停止程序的执行,并返回错误。
  3. 使用绝对路径:为了避免路径穿越攻击,最好使用绝对路径而不是相对路径。相对路径可能会导致程序访问不想访问的目录。使用绝对路径可以确保程序只访问所期望的目录。
  4. 限制访问:最后,为了保护系统中的文件和目录,应该限制程序的访问权限。程序只应该访问必要的文件和目录,不应该访问不需要的文件或目录。

通过上述步骤,可以有效修复路径穿越漏洞,并提高系统的安全性。

任意文件写入漏洞

任意文件写入漏洞(Arbitrary File Write)是一种常见的安全漏洞,攻击者可以利用此漏洞将任意数据写入到服务器上的任意位置,从而可能导致服务器上的敏感信息泄漏或系统被控制。

攻击者通常利用应用程序中存在的缺陷或漏洞来进行攻击,例如:

  • 输入验证不充分:如果应用程序没有对用户输入的数据进行充分的验证和过滤,攻击者可以将恶意代码或脚本注入到应用程序中,从而使其执行任意操作,包括写入任意文件。
  • 路径遍历攻击:攻击者可以利用路径遍历漏洞来绕过应用程序的安全检查,从而写入到系统上的任意文件,例如 /etc/passwd 文件。
  • 错误的文件权限:如果应用程序具有写入某些目录的权限,而该目录的权限过于宽松(例如,目录的权限为777),攻击者可以将任意数据写入该目录。

为了防止任意文件写入漏洞,开发人员可以采取以下几个措施:

  • 输入验证:开发人员应该对输入的数据进行充分的验证和过滤,以避免攻击者能够注入恶意代码或脚本。
  • 文件权限控制:开发人员应该限制应用程序的访问权限,例如仅允许访问特定目录,并使用适当的文件权限设置,以确保只有授权用户才能访问该目录。
  • 安全编程实践:开发人员应该遵循安全编程实践,例如使用编程语言提供的安全函数,如 Java 中的 File.createTempFile() 或 Python 中的 tempfile.mkstemp(),以确保应用程序在创建临时文件时安全可靠。
  • 日志监控:监控应用程序的访问日志,以及服务器上的文件系统活动,以及对文件系统进行的任何非正常操作,例如对未知目录的写入操作。这有助于尽早发现潜在的任意文件写入漏洞并进行修复。

说白了,路径穿越就是别人攻击你的时候,文件名带有/\../这类的相对路径,篡改了你保存文件的目录;任意文件写入就是,攻击你的服务器时,比如说你原先只能上传图片的,它给你上传了一个shell脚本到服务器的敏感位置,那你的数据安全就别妄想了。

问题解决

基于上面的分析,我们很容易想到了,对传入的文件名进行两道校验:

  • 文件名只能包含数字、英文(大小写)、下划线、横杠、小数点
  • 后缀只能支持指定的文件类型

我们来编码实现一下这两个功能

public class UploadCheckUtil {// 检查文件名是否合法public static boolean checkFileName(String fileName) {String reg = "^[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z0-9]+$";Pattern p = Pattern.compile(reg);return p.matcher(fileName).find();}// 检查文件类型public static boolean checkSuffix(String fileName) {int index = fileName.lastIndexOf(".");String suffix = index == -1 ? "" : fileName.substring(index + 1);String reg = "(jpg|jpeg|gif|png|mp4|flv|avi|rm|wmv)";Pattern p = Pattern.compile(reg);return p.matcher(fileName).find();}
}

^[a-zA-Z0-9][a-zA-Z0-9._-]*\.[a-zA-Z0-9]+$这个正则表达式的含义是:

  • ^ 和 $ 表示匹配整个字符串,不能有额外的字符;
  • [a-zA-Z0-9]+ 表示文件名由至少一个字母或数字组成;
  • ([.-][a-zA-Z0-9]+)* 表示文件名中可以包含多个分隔符(.、、-),以及一个或多个字母或数字;
  • . 表示文件名和文件类型之间有一个点号;
  • [a-zA-Z0-9]+ 表示文件类型由至少一个字母或数字组成。
    这个正则表达式可以匹配例如 test.png、test_image.jpg、document.txt 这样的文件名,但不能匹配 …/test.png 这样的包含路径遍历符号的文件名。可能有些同学就很疑惑我为什么都是写0-9、a-z、A-Z这种,通配符我是不是不懂,质疑我\w\d是否有了解过。那是因为如果用通配符攻击者可能会将路径信息编码成文件名中的特殊字符。

(jpg|jpeg|gif|png|mp4|flv|avi|rm|wmv)匹配的是其中的任意一个短语。你可以替换成你实际开发需要限制的文件类型。

在使用时,我们只需要把上传的文件名进行传入,当两个校验都通过时,方可进行transfer,否则抛出文件名不合规的异常即可。

这个正则表达式可以有效地预防路径穿越攻击,但并不能彻底地预防路径穿越攻击。

总结

正则表达式的作用主要是限制上传的文件名只包含特定的字符和格式,从而减少路径穿越攻击的风险。但是,如果攻击者利用其他漏洞(例如文件上传的身份验证绕过漏洞)来绕过这个限制,仍然可以上传包含路径遍历符号的恶意文件。

因此,防止路径穿越攻击需要综合考虑多种安全措施,包括但不限于:

对上传的文件进行验证,确保文件类型和大小符合预期。

对上传的文件进行存储限制,防止上传可执行文件或恶意脚本。

对上传的文件进行安全性检查,例如扫描病毒、检查文件内容是否包含恶意代码等。

对上传的文件进行隔离,避免上传的文件对其他文件和系统资源产生影响。

综上所述,虽然正则表达式可以有效地预防路径穿越攻击,但是仍然需要综合考虑多种安全措施来保护系统安全。

修复路径穿越、任意文件写入漏洞相关推荐

  1. 08 - vulhub - Aria2 任意文件写入漏洞

    文章目录 漏洞名称:Aria2 任意文件写入漏洞 漏洞原理 漏洞复现 漏洞利用限制 环境准备 漏洞利用 验证漏洞利用是否成功并反弹 修复建议 漏洞名称:Aria2 任意文件写入漏洞 简介: Aria2 ...

  2. 【安全狐】CVE-2016-3088_ActiveMQ任意文件写入漏洞

    CVE-2016-3088_ActiveMQ任意文件写入漏洞 0x01漏洞背景 ActiveMQ的web控制台分三个应用,admin.api和fileserver,其中admin是管理员页面,api是 ...

  3. ThinkCMF任意文件写入漏洞----学习记录

    ThinkCMF框架任意文件写入漏洞 一.ThinkCMF介绍: ThinkCMF是一款基于ThinkPHP+MYSQL开发的中文内容管理框架.ThinkCMF提出灵活的应用机制,框架自身提供基础的管 ...

  4. Aria2任意文件写入漏洞 漏洞复现

    Aria2任意文件写入漏洞 by ADummy 0x00利用路线 ​ 第三方UI与目标进行通信->搭建http服务器->让目标下载恶意文件->定时任务执行->反弹shell 0 ...

  5. 锐捷某系统前台任意文件写入漏洞分析

    0x00前言 这套系统我估计是全网第一个公开能拿shell的吧(不是的话当我没说),哪套系统自己猜,这次先分享下前台任意文件写入,还有几个rce日后分享,也感谢独立团孙德胜Alan提供的思路. 0x0 ...

  6. 致远a8-v5-6.0协同管理软件_高危漏洞利用预警:近期利用“致远OA任意文件写入漏洞”的攻击较多...

    概述腾讯御界高级威胁检测系统近期监测到"致远OA系统上的GetShell漏洞"在网上被频繁利用攻击政企客户. 对于存在漏洞的OA系统,攻击者无需任何权限,即可向服务器上传websh ...

  7. CVE-2017-12615 tomcat任意文件写入漏洞复现

    目录 一.环境搭建 1.下载vulhub 2.启动环境 二.漏洞复现 1.Windows使用burp suite抓包 三.修复方案 一.环境搭建 1.下载vulhub kali系统命令行中输入 git ...

  8. 致远a8 java_致远A8任意文件写入漏洞_getshell_exp

    1 #coding=utf-8 2 importsys3 importrequests4 5 defencode(origin_bytes):6 """ 7 重构 bas ...

  9. CactiEZ weathermap插件任意文件写入

    漏洞特征 CactiEZ的登录界面,大多数都会存在weathermap的插件,这样我们就可以尝试该网站是否存在任意文件写入漏洞了 漏洞复现 我们直接在url处进行文件写入命令的操作即可. /plugi ...

最新文章

  1. 机器学习基础专题:评估指标
  2. hdu 2295 Radar(二分+DLX)
  3. SQL用于更新ID为顺序ID(用于删除了几条数据导致id不连续)
  4. Python3 configparser 中文乱码
  5. keybd_event跟SendMessage,PostMessage模拟键盘消息的区别 z
  6. java 防止拷贝_[改善Java代码]避免对象的浅拷贝
  7. list 数据类型的应用场景
  8. 【js】vue 2.5.1 源码学习(二) 策略合并
  9. 06Prism WPF 入门实战 - Log控件库
  10. iOS学习笔记-自己动手写RESideMenu
  11. webrtc自动增益
  12. ROS 日志消息(C++)
  13. w10连接远程计算机控制,win10系统教你如何远程控制他人电脑的方法
  14. ubuntu16.04调整屏幕分辨率
  15. 【音视频基础】(一):显示器是如何显示图形数据的一
  16. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效
  17. 四轴自适应控制算法的一些尝试开源我的山猫飞控和梯度在线辨识自适应等算法—(转)
  18. “价格+产品+服务”:京东手机开启“复合竞赛”
  19. 地表最强gVim编写Verilog插件 automatic-verilog
  20. ssm在线教学质量评价系统 毕业设计-附源码141550

热门文章

  1. Windows AD证书服务系列---部署及管理证书模板(1)
  2. 51开发板上为什么会有多个晶振
  3. [转]深入Mysql字符集设置
  4. Vue预览PDF,使用vue-pdf,基本使用教程
  5. Thread 类的基本用法(附详细代码),通俗易懂。
  6. C3P0(数据库连接池)详解
  7. 中科爱讯WiFi探针在客流分析统计的应用
  8. NBIOT模块 BC26升级固件
  9. 华硕路由器固件 虚拟服务器,华硕路由器开启设置虚拟服务器
  10. 极大似然估计的理解 为什么要取似然函数最大值 似然函数的意义是什么?