当前位置: 首页 > article >正文

WEB安全漏洞之路径遍历、跳转等漏洞解析

1. 路径遍历漏洞(Path Traversal Vulnerability)

路径遍历漏洞(又叫目录遍历漏洞)是指攻击者通过操控文件路径,使得应用访问服务器上未授权的文件或目录。攻击者通常通过操控文件路径中的 ../ (路径上移符号)来绕过访问控制,获取服务器上的敏感文件。

案例:路径遍历漏洞

假设有一个 Web 应用提供下载文件的功能,用户通过 URL 提供文件名来下载文件。代码示例可能如下:

import os

def download_file(filename):
    base_path = '/var/www/files/'
    file_path = base_path + filename
    with open(file_path, 'rb') as f:
        return f.read()

攻击方式:攻击者可以通过 URL 改变文件路径,例如:

https://example.com/download_file?filename=../../../../etc/passwd

这将导致系统尝试读取 /etc/passwd 文件,这是一个 Linux 系统上的敏感文件,包含用户账户信息。

防御手段
  • 路径过滤:确保请求的文件路径不能包含 ../..\ 等绕过目录访问的路径。

    def sanitize_path(filename):
        # 过滤掉路径穿越字符
        if '..' in filename or filename.startswith('/'):
            raise ValueError("Invalid file path")
        return filename
    
    def download_file(filename):
        filename = sanitize_path(filename)
        base_path = '/var/www/files/'
        file_path = os.path.join(base_path, filename)
        with open(file_path, 'rb') as f:
            return f.read()
    
  • 使用绝对路径:避免依赖用户输入构建文件路径,而是通过服务器端事先定义的安全路径来定位文件。

  • 文件存储限制:限制用户可访问的文件目录,确保不允许访问 Web 服务器的敏感文件(如 /etc//var/)。

  • 操作系统级安全措施:确保服务器上的文件系统权限配置正确,仅允许应用程序访问其需要的文件目录。


2. 跳转漏洞(Redirect Vulnerability)

跳转漏洞是指攻击者能够控制 Web 应用的跳转行为,从而将用户重定向到恶意网站或页面。常见的攻击方式是利用 LocationHTTP 301HTTP 302 等 HTTP 跳转功能。

案例:跳转漏洞

假设一个 Web 应用允许用户输入回调 URL,系统在某些操作后会跳转到该 URL。

import urllib.parse

def redirect_user(url):
    safe_url = urllib.parse.urlparse(url)
    if safe_url.netloc != 'example.com':
        raise ValueError("Invalid redirect URL")
    # 重定向到指定 URL
    return f"Redirecting to: {url}"

攻击方式:如果没有对 URL 进行严格验证,攻击者可能通过以下 URL 向应用提交:

http://example.com/redirect?url=http://evil.com

如果应用直接跳转到 http://evil.com,攻击者就可以利用这一点来钓鱼攻击、传播恶意软件等。

防御手段
  • 白名单校验:对所有用户提供的 URL 进行白名单校验,确保重定向只发生到预先允许的安全域名或路径。

    allowed_domains = ['example.com', 'trusted.com']
    
    def redirect_user(url):
        safe_url = urllib.parse.urlparse(url)
        if safe_url.netloc not in allowed_domains:
            raise ValueError("Invalid redirect URL")
        return f"Redirecting to: {url}"
    
  • 避免直接跳转:尽量避免在用户输入的 URL 上进行重定向,或者在跳转之前让用户确认目标地址。

  • 使用 GET 请求代替 POST:避免使用 URL 进行跳转。通过安全的参数传递机制,例如 POST 请求,通过后端进行处理,而不是客户端直接跳转。

  • 登录/认证跳转保护:在用户登录后重定向时,确认目标地址的合法性,避免跳转到不安全的第三方页面。


3. SSRF(服务器端请求伪造漏洞,Server-Side Request Forgery)

SSRF 漏洞允许攻击者通过精心构造的请求伪造服务端向内部或外部发起请求。通过 SSRF,攻击者可以让服务器发起请求到攻击者控制的目标,甚至可能访问内网资源。

案例:SSRF 漏洞

假设一个 Web 应用允许用户输入 URL,并让服务器向该 URL 发起请求,获取并返回其内容。

import requests

def fetch_data(url):
    response = requests.get(url)
    return response.text

攻击方式:攻击者可以通过以下方式构造恶意 URL,访问本地服务器或内部网络资源:

http://example.com/fetch_data?url=http://localhost:8080/admin

如果服务器内网没有严格的访问控制,攻击者就能通过该漏洞访问敏感的内网资源,甚至执行进一步的攻击。

防御手段
  • 限制外部请求:限制服务器仅能访问预定义的、信任的外部资源,并禁止访问本地网络或内部资源(如 localhost127.0.0.1)。

    def fetch_data(url):
        if 'localhost' in url or '127.0.0.1' in url:
            raise ValueError("Access to local network is restricted")
        response = requests.get(url)
        return response.text
    
  • 白名单策略:对所有外部请求进行 URL 白名单过滤,只有信任的 URL 或 IP 地址才能被访问。

  • 请求头过滤:对请求头进行过滤,确保没有恶意的 HostX-Forwarded-For 头部。

  • 内部网络隔离:确保 Web 服务器与内部服务(如数据库、管理服务)之间进行网络隔离,防止内部服务被暴露给外部请求。


4. 短信/邮件炸弹/暴力破解

短信/邮件炸弹是指攻击者通过大量发送垃圾短信或邮件来使目标系统瘫痪。暴力破解是指通过不断尝试各种可能的用户名和密码组合,强行破解用户账户的密码。

案例:短信/邮件炸弹

假设一个 Web 应用提供短信/邮件通知功能,攻击者可以通过大量请求发送短信或邮件,导致服务被滥用。

攻击方式:攻击者通过脚本或工具不断向目标系统发送请求,触发大量的短信或邮件:

import requests

def send_sms(phone_number, message):
    requests.post('https://sms-service.com/send', data={'phone': phone_number, 'message': message})

攻击者可以循环调用该 API,向目标发送大量短信。

防御手段
  • 验证码与限流:为每个请求增加验证码,避免机器人滥用接口。同时实施限流(rate limiting),限制每个 IP 或每个账户的请求次数。

    from time import time
    from collections import defaultdict
    
    requests_per_user = defaultdict(int)
    
    def rate_limit(user_id):
        if requests_per_user[user_id] > 5:
            raise ValueError("Rate limit exceeded")
        requests_per_user[user_id] += 1
        return True
    
  • 黑名单和IP封禁:对于恶意来源的 IP 地址进行封禁,防止恶意攻击者发起暴力请求。

  • 多因素认证:防止暴力破解攻击,可以使用验证码、短信验证、身份验证等多因素认证方法。

  • 账号锁定:在连续错误尝试登录超过一定次数后,暂时锁定用户账户,防止暴力破解。

    def lock_account(user_id):
        # 锁定用户账户
        account_lock[user_id] = time() + 300  # 锁定 5 分钟
    

总结

漏洞类型攻击方式防御手段
路径遍历通过修改请求参数(如 ../)访问未经授权的文件输入过滤、路径规范化、限制文件访问目录、操作系统级别安全
跳转漏洞利用不安全的重定向功能跳转到恶意网站白名单校验、避免直接跳转、确认跳转目标安全
SSRF伪造服务器端请求,访问内部资源或外部恶意资源限制外部请求、白名单策略、请求头过滤、内部网络隔离
短信/邮件炸弹/暴力破解发送大量垃圾邮件/短信或通过暴力尝试破解账户限流、验证码、多因素认证、账号锁定、IP 封禁

通过综合应用这些防御措施,可以有效地防止这些漏洞对 Web 应用和系统的攻击。


http://www.kler.cn/a/453226.html

相关文章:

  • 深度学习blog-Transformer-注意力机制和编码器解码器
  • 处理被拒绝的promise
  • HTTP 协议规定的协议头和请求头
  • near-synonym反义词生成(2):Prompt +Bert-MLM(FT)
  • Kafka、RocketMQ、RabbitMQ 对比
  • 网站服务器被攻击了怎么办?
  • linux c++ ffmpeg推流
  • HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?
  • 大模型应用技术系列(四): 为RAG应用设计的缓存RAGCache
  • 【嵌入式C语言】指针数组结构体
  • Spring Boot项目开发常见问题及解决方案(下)
  • 《战神:诸神黄昏》游戏运行时提示mss32.dll丢失怎么办?
  • 【LeetCode】LCR 175.计算二叉树的深度
  • Halcon例程代码解读:安全环检测(附源码|图像下载链接)
  • windows nmake 安装openssl
  • Java 中压缩图片并应用 EXIF 旋转信息
  • .NET能做什么?全面解析.NET的应用领域
  • MPLS小实验:利用LDP动态建立LSP
  • c# 线程 AutoResetEvent 的Set()函数多次调用
  • JavaWeb 开发基础入门