在国外怎么做网站,wordpress环境包,北京手机专业网站建设公司,深圳网站制作推广文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用… 文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用场景Java代码实现基于Hutool的Magic Number验证详细说明Hutool的FileTypeUtil工作原理代码流程支持的文件类型防御措施分析文件上传防御流程 组合攻击文件上传与路径穿越文件上传与代码注入文件上传与CSRF 漏洞Code演示与修复存在文件上传漏洞的代码漏洞分析修复示例 文件上传漏洞与其他常见漏洞的组合攻击文件上传漏洞 路径穿越攻击场景绕过文件存储路径限制高级利用步骤防御措施 文件上传漏洞 远程代码执行RCE漏洞攻击场景利用脚本文件上传实现RCE高级利用步骤防御措施 文件上传漏洞 跨站脚本XSS攻击场景通过文件上传传播XSS攻击利用步骤防御措施 文件上传漏洞 CSRF攻击场景利用CSRF强制上传恶意文件利用步骤防御措施 组合漏洞Code : 路径穿越与远程代码执行RCE场景介绍问题代码漏洞分析利用步骤防御措施修复代码防御措施分析详细说明攻击原理防御机制 OWASP 2023 TOP 10 OWASP Top 10 概述 OWASP (Open Web Application Security Project) Top 10 是一份最常见和最危险的Web应用安全风险列表由安全专家定期更新。 旨在提高开发人员、测试人员以及组织的安全意识并帮助他们预防这些漏洞。 2023年OWASP Top 10 列表 主流防范措施 Broken Access Control 描述未能正确执行访问控制允许用户访问他们不应该拥有的权限或资源。这可能导致数据泄露、数据篡改等问题。防御措施严格实施基于角色的访问控制RBAC并确保敏感操作具有足够的授权检查。 Cryptographic Failures 描述不当的加密实践或加密算法的使用不当可能导致敏感数据如密码、信用卡信息被暴露或窃取。防御措施使用最新的加密标准如AES-256-GCM、RSA-2048并避免使用弱或过时的加密算法。 Injection 描述应用未能对用户输入进行有效的验证或转义导致恶意代码注入如SQL注入、命令注入并执行在服务器上。防御措施使用参数化查询、输入验证、输出转义技术避免拼接SQL或动态代码。 Insecure Design 描述系统在设计阶段未考虑安全问题导致应用架构中的基本安全漏洞。防御措施在开发生命周期中引入威胁建模、攻击面分析等设计阶段的安全审查。 Security Misconfiguration 描述错误的配置如不安全的默认设置、过时的软件或未配置的安全功能可能使应用程序面临攻击。防御措施定期审计和测试系统配置使用自动化工具识别和修复配置问题。 Vulnerable and Outdated Components 描述使用了具有已知漏洞或未及时更新的第三方库和组件可能被攻击者利用。防御措施确保使用依赖管理工具如Maven、npm并定期更新组件避免使用过时的版本。 Identification and Authentication Failures 描述认证和身份验证流程中的缺陷可能导致用户冒充、会话劫持等问题。防御措施实施强密码策略、使用多因素认证MFA和加固会话管理机制。 Software and Data Integrity Failures 描述未能保证软件更新和数据的完整性可能使攻击者篡改关键数据或上传恶意更新。防御措施使用签名机制来验证更新包的完整性确保数据在传输和存储过程中的可靠性。 Security Logging and Monitoring Failures 描述缺乏适当的日志记录和监控无法有效检测、响应或追踪安全事件。防御措施实施集中化的日志记录、主动的监控和告警系统确保能够及时发现并响应异常行为。 Server-Side Request Forgery (SSRF) 描述攻击者通过伪造服务器端的请求来获取未授权的内部资源或数据通常利用未受限制的服务器端请求机制。防御措施限制服务器端可以发起的请求范围避免允许用户输入直接控制服务器端的请求参数。 重点风险与防御措施建议 Broken Access Control最重要的防御措施是定期审查权限设计确保每个用户只能访问必要的资源。建议结合应用的访问控制系统与自动化测试工具确保权限配置不被篡改。 Cryptographic Failures确保敏感数据加密和密钥管理机制符合行业标准如使用硬件安全模块HSM来保护密钥。避免明文传输或存储敏感数据。 Injection对于Web应用来说防止注入攻击的最佳实践是始终使用参数化查询和预编译的语句。严禁直接拼接用户输入构建SQL或命令。 Security Misconfiguration安全配置管理应作为持续改进的一部分尤其是在引入新服务或更新系统时保持自动化的安全配置审计机制至关重要。 SSRF严格限制后端服务器能够访问的网络和资源禁止对内部资源如metadata或本地IP发起请求。 导图 定义
文件上传漏洞是指Web应用允许用户上传文件但没有对上传文件进行充分的验证和限制导致攻击者可以上传恶意文件如脚本、恶意代码等进一步执行恶意操作。这种漏洞常见于文件管理、头像上传或文档管理等功能中。 攻击场景
文件上传漏洞有多种利用方式攻击者可能会
1. 上传恶意脚本
攻击者上传一个恶意文件例如PHP、ASP、JSP等然后通过URL直接访问该文件导致服务器执行其中的恶意代码。这是最常见的文件上传利用方式尤其是在Web服务器允许解析用户上传的文件时。
2. 目录遍历
攻击者可能通过上传文件并结合路径穿越漏洞将文件保存到特定位置例如Web可执行目录或系统目录以进一步执行代码或操控服务器。
3. 覆盖现有文件
通过上传文件覆盖系统中的重要文件攻击者可能篡改配置文件、脚本或数据库配置导致服务瘫痪或安全性失效。
4. 文件上传结合社会工程攻击
攻击者上传看似无害的文件如图像或PDF诱骗其他用户下载并打开实际包含恶意代码导致用户系统感染恶意软件。 防御措施
为了防止文件上传漏洞应采取多层次的防御措施
1. 文件类型验证
验证上传文件的MIME类型和文件扩展名确保只允许上传预期的文件类型。然而文件扩展名容易被伪装应使用文件内容的签名如Magic Number进一步验证。
2. 文件名限制
对上传的文件名进行严格限制禁止使用特殊字符和文件路径符号如../以防止路径穿越攻击。文件名应进行随机化处理防止攻击者通过猜测文件名进行操作。
3. 文件存储位置
上传的文件应存储在安全的目录之外不能直接通过Web服务器访问。例如上传目录应放置在Web根目录之外避免通过URL直接访问。如果必须存放在可访问的目录中确保该目录不具有执行权限。
4. 文件权限设置
上传的文件应设置为只读权限并禁止脚本执行。利用操作系统的权限控制或设置Web服务器的目录权限来限制上传文件的访问范围。
5. 文件内容检测
对上传文件进行内容审查避免恶意代码注入。可以使用杀毒软件或基于规则的扫描器检查上传文件的安全性。
6. 访问控制
限制文件上传功能仅供授权用户使用并确保不同用户之间的文件操作隔离。上传后验证用户身份确保文件仅能被合法的用户访问或处理。
7. 服务器配置
在服务器配置层面禁用执行特定类型的文件如PHP、JSP等确保即使恶意脚本被上传也无法被执行。在Nginx或Apache中可以通过设置Content-Disposition头将文件强制下载而不是直接在浏览器中执行。 文件类型验证实现
Hutool的FileTypeUtil
Hutool是一个功能强大的Java工具库提供了丰富的工具类简化了许多常见的Java开发任务。FileTypeUtil工具类能够根据文件的内容Magic Number自动判断文件类型无需手动编写文件签名比对逻辑。
使用场景
通过Hutool的FileTypeUtil可以直接读取文件头部字节判断文件的真实类型防止攻击者伪装文件扩展名上传恶意文件。 Java代码实现基于Hutool的Magic Number验证
package com.artisan.fileVunl;import cn.hutool.core.io.FileTypeUtil;
import java.io.File;
import java.io.IOException;
/*** author 小工匠* version 1.0* date 2024/10/2 11:50* mark: show me the code , change the world*/public class HutoolMagicNumberValidator {public static void main(String[] args) throws IOException {// 示例文件路径File file new File(D:\\Blog\\006Xzox4gy1gdmmzfm2ioj303a03awem.jpg);// 调用Hutool的FileTypeUtil验证文件类型String fileType FileTypeUtil.getType(file);if (isValidFileType(fileType)) {System.out.println(文件类型验证通过文件类型是: fileType);} else {System.out.println(文件类型无效上传被拒绝);}}/*** 根据文件类型判断是否为允许的类型*/private static boolean isValidFileType(String fileType) {// 允许的文件类型如JPEG、PNG和PDFreturn jpg.equals(fileType) || png.equals(fileType) || pdf.equals(fileType);}
} 详细说明
Hutool的FileTypeUtil工作原理
FileTypeUtil.getType(File file)方法通过读取文件的前几个字节文件头部的Magic Number匹配Hutool库中已知的文件签名然后返回文件的实际类型如jpg、png、pdf等。
代码流程
读取文件通过Hutool的FileTypeUtil读取文件内容判断其实际类型。验证文件类型将文件类型与允许的类型列表进行比对确保文件符合预期的类型。输出验证结果如果文件类型匹配允许上传否则拒绝文件上传。
支持的文件类型
Hutool的FileTypeUtil支持多种常见文件类型包括图片、文档、视频等适用于多种文件上传场景的安全防护。 防御措施分析
简化实现Hutool封装了Magic Number验证逻辑开发者无需手动维护文件签名列表减少了代码复杂度。扩展性强Hutool支持多种常见文件类型可以根据项目需求进行扩展适应复杂的文件上传场景。结合多层防御在Magic Number验证基础上依然可以结合文件扩展名和MIME类型的验证提供多层次的防御。
文件上传防御流程
第一步文件扩展名验证确保上传文件的扩展名符合预期。第二步MIME类型验证确保文件的MIME类型与扩展名和内容一致。第三步Magic Number验证利用Hutool的FileTypeUtil进一步确认文件内容的真实性避免伪造文件上传。 组合攻击
文件上传与路径穿越
如果文件上传功能存在路径穿越漏洞攻击者可以通过操控上传路径将恶意文件上传至特定目录如Web根目录从而直接通过URL访问并执行。
文件上传与代码注入
在文件上传漏洞中如果攻击者可以上传动态脚本文件如PHP他们可以利用该文件直接注入代码并执行例如通过浏览器直接访问http://example.com/uploads/shell.php。
文件上传与CSRF
文件上传功能如果缺乏适当的CSRF保护攻击者可以诱导受害者提交恶意上传请求从而在服务器上上传恶意文件。 漏洞Code演示与修复
存在文件上传漏洞的代码
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;public class FileUploadServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Part filePart request.getPart(file); // 获取上传的文件String fileName filePart.getSubmittedFileName();// 存储文件到服务器的目录File file new File(/var/www/uploads/ fileName);filePart.write(file.getAbsolutePath());response.getWriter().println(File uploaded successfully);}
}漏洞分析
没有验证文件类型和文件名攻击者可以上传任意文件如恶意脚本。文件直接存储在Web目录下可能被直接访问和执行。 修复示例
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;public class SafeFileUploadServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Part filePart request.getPart(file);String fileName filePart.getSubmittedFileName();// 1. 验证文件扩展名if (!fileName.endsWith(.jpg) !fileName.endsWith(.png)) {response.getWriter().println(Invalid file type);return;}// 2. 生成随机文件名避免文件覆盖和预测String safeFileName System.currentTimeMillis() _ fileName;// 3. 文件存储在Web目录之外File uploadDir new File(/var/uploads/);if (!uploadDir.exists()) {uploadDir.mkdir();}File file new File(uploadDir, safeFileName);filePart.write(file.getAbsolutePath());// 4. 设置文件权限为只读file.setReadable(true, true);file.setWritable(false, false);response.getWriter().println(File uploaded successfully);}
}代码分析 文件扩展名验证只允许特定类型的文件如.jpg、.png。文件名随机化使用时间戳生成唯一文件名防止覆盖和预测。文件存储在安全目录避免直接存储在Web目录中确保无法通过URL访问到文件。权限设置上传的文件被设置为只读避免后续操作。 文件上传漏洞与其他常见漏洞的组合攻击
文件上传漏洞常常被攻击者用作攻击链中的一环。由于单一漏洞利用的效果可能有限攻击者往往结合其他漏洞来扩大攻击影响范围实现更高级的攻击目标。下面探讨几种常见的组合利用场景
路径穿越结合文件上传绕过文件上传目录限制访问或执行敏感位置的文件。远程代码执行RCE结合文件上传通过上传并执行恶意文件实现远程控制。跨站脚本XSS结合文件上传通过文件传播恶意脚本跨站点执行攻击。跨站请求伪造CSRF结合文件上传在不知情的情况下诱使用户上传恶意文件。 文件上传漏洞 路径穿越
攻击场景绕过文件存储路径限制
在某些应用程序中即使存在文件上传功能文件通常会被限制在特定目录下如/uploads无法直接上传到服务器的关键目录。然而结合路径穿越漏洞攻击者可以通过构造恶意的文件路径来绕过这些限制上传文件到敏感目录并执行恶意代码。
高级利用步骤
上传构造路径文件攻击者上传文件时在文件名中使用路径穿越符号例如../../../../var/www/html/shell.php尝试绕过目录限制。利用路径穿越漏洞服务器没有正确处理文件名或路径导致文件实际存储在/var/www/html/目录中。执行上传文件通过URL直接访问http://example.com/shell.php执行上传的PHP文件从而进行远程代码执行。
防御措施
严格验证文件路径使用getCanonicalPath()检查文件的真实路径防止路径穿越。限制上传目录并确保该目录无执行权限。 文件上传漏洞 远程代码执行RCE漏洞
攻击场景利用脚本文件上传实现RCE
最具破坏性的攻击之一是上传恶意脚本文件如PHP、ASP或JSP文件并通过直接访问这些文件来执行远程代码。文件上传漏洞允许上传任意类型的文件而Web服务器将这些文件存储在可被Web访问的目录中导致攻击者可以通过URL直接访问并执行这些文件。
高级利用步骤
上传恶意脚本文件攻击者上传一个恶意的PHP脚本如?php system($_GET[cmd]); ?并将其存储在可访问的Web目录中。触发代码执行攻击者通过浏览器访问恶意文件并通过URL传递命令参数如http://example.com/uploads/shell.php?cmdwhoami。获得服务器控制权攻击者可以执行任何命令获取服务器的敏感信息或进一步传播攻击。
防御措施
禁止可执行脚本类型的文件上传尤其是像.php、.jsp、.exe等危险文件。将上传目录设置为不可执行防止服务器执行上传的文件。使用应用层的WAFWeb Application Firewall过滤异常的请求模式。 文件上传漏洞 跨站脚本XSS
攻击场景通过文件上传传播XSS攻击
攻击者可以通过上传包含恶意JavaScript代码的文件来进行XSS攻击。例如攻击者上传一个包含恶意脚本的HTML文件或图片通过伪装的文件名并诱导其他用户访问该文件。浏览器解析这些文件时可能执行其中的JavaScript代码从而危害其他用户。
利用步骤
上传含有恶意脚本的文件例如攻击者上传一个伪装成图片的HTML文件其中嵌入了恶意JavaScript如scriptalert(XSS);/script。诱导用户访问文件攻击者通过诱骗手段诱导其他用户访问此恶意文件的URL。脚本执行浏览器执行恶意JavaScript代码导致用户的会话劫持、数据泄露或其他操作。
防御措施
对上传文件的MIME类型进行严格校验并使用内容检查工具确保文件的合法性。对上传文件名及其内容进行HTML转义防止浏览器错误地解析文件中的恶意代码。 文件上传漏洞 CSRF
攻击场景利用CSRF强制上传恶意文件
跨站请求伪造CSRF攻击可以通过诱导用户在不知情的情况下上传恶意文件。例如攻击者构造一个恶意链接或表单诱骗受害者在登录状态下访问从而自动触发文件上传请求将恶意文件上传到服务器。
利用步骤
构造恶意表单攻击者创建一个隐藏的表单包含文件上传功能并预置恶意文件通过URL传递或base64编码等方式。诱导受害者点击受害者在登录的情况下点击恶意链接或提交表单不知不觉中上传恶意文件。攻击者执行恶意文件恶意文件被成功上传到服务器后攻击者可以通过直接访问该文件进行进一步攻击。
防御措施
为上传功能添加CSRF Token验证确保上传请求只能由合法用户发起。限制文件上传功能的访问权限只有经过授权的用户才能上传文件。结合验证码机制确保用户交互的真实性防止自动化攻击。 组合漏洞Code : 路径穿越与远程代码执行RCE
场景介绍 攻击场景路径穿越与远程代码执行RCE的结合利用 攻击者上传恶意脚本文件如PHP、JSP并通过路径穿越漏洞将文件存放到Web服务器的可执行目录下随后通过URL访问该恶意文件实现远程代码执行从而获得服务器控制权。 问题代码
这是一个存在文件上传漏洞与路径穿越漏洞的示例代码展示了如何利用这些漏洞进行攻击。
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;MultipartConfig
public class VulnerableFileUploadServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取上传文件的部分Part filePart request.getPart(file);String fileName filePart.getSubmittedFileName();// 路径穿越漏洞攻击者可以通过文件名控制文件存储路径String uploadPath /var/www/uploads/ fileName;// 将文件写入指定路径filePart.write(uploadPath);response.getWriter().println(File uploaded successfully to: uploadPath);}
}漏洞分析
路径穿越漏洞fileName来自用户的输入未经过滤和验证攻击者可以构造诸如../../webapps/ROOT/shell.jsp的文件名从而将文件写入服务器的Web目录中。远程代码执行漏洞上传恶意脚本文件后攻击者可以通过URL直接访问该文件从而执行恶意代码例如http://example.com/shell.jsp。
利用步骤 上传恶意文件攻击者上传一个JSP文件如shell.jsp内容为 % page importjava.io.* %
%String cmd request.getParameter(cmd);Process p Runtime.getRuntime().exec(cmd);OutputStream os p.getOutputStream();InputStream in p.getInputStream();BufferedReader reader new BufferedReader(new InputStreamReader(in));String line null;while ((line reader.readLine()) ! null) {out.println(line);}
%路径穿越上传的文件名为../../webapps/ROOT/shell.jsp将文件存储到Tomcat服务器的Web可执行目录中。 远程执行命令攻击者通过浏览器访问http://example.com/shell.jsp?cmdwhoami远程执行命令并获得服务器权限。 防御措施
为了防止上述路径穿越与RCE漏洞需要对代码进行修复和增强安全性
修复代码
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;MultipartConfig
public class SecureFileUploadServlet extends HttpServlet {private static final String UPLOAD_DIR /var/uploads/;Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取上传的文件部分Part filePart request.getPart(file);String fileName filePart.getSubmittedFileName();// 1. 验证文件名防止路径穿越if (fileName.contains(..) || fileName.contains(/) || fileName.contains(\\)) {response.getWriter().println(Invalid file name.);return;}// 2. 验证文件类型防止上传恶意脚本String mimeType getServletContext().getMimeType(fileName);if (!isAllowedFileType(mimeType)) {response.getWriter().println(Invalid file type.);return;}// 3. 生成安全的文件名避免文件名冲突和预测String safeFileName System.currentTimeMillis() _ fileName;// 4. 使用安全路径将文件存储在不可执行的目录中Path uploadPath Paths.get(UPLOAD_DIR safeFileName);// 确保上传目录存在if (!Files.exists(uploadPath.getParent())) {Files.createDirectories(uploadPath.getParent());}// 将文件写入磁盘filePart.write(uploadPath.toString());response.getWriter().println(File uploaded successfully to: uploadPath);}private boolean isAllowedFileType(String mimeType) {return mimeType.equals(image/jpeg) || mimeType.equals(image/png) || mimeType.equals(application/pdf);}
}防御措施分析
验证文件名代码检查文件名是否包含路径穿越符号如..避免文件被上传到非预期目录。文件类型验证通过检查文件的MIME类型确保只允许上传预期的文件类型如图片或PDF防止上传脚本文件。文件名随机化使用时间戳生成唯一文件名避免文件覆盖和文件名预测攻击。安全目录存储将上传文件存储在不可执行的目录中防止上传文件被直接执行。限制文件访问配置Web服务器禁止访问上传目录中的文件或将上传目录存储在Web根目录之外。 详细说明
攻击原理
路径穿越攻击攻击者通过上传带有路径穿越符号的文件名如../../webapps/ROOT/shell.jsp将文件上传到服务器可执行目录中从而获得远程执行权限。远程代码执行RCE上传的恶意文件是可执行脚本如JSP攻击者可以通过浏览器远程访问该文件并执行任意命令。
防御机制
路径验证通过检查文件名和路径避免攻击者操控文件存储位置。文件类型限制通过限制上传的文件类型防止攻击者上传脚本文件。安全的文件存储将上传文件存储在Web根目录之外确保上传文件不会被直接访问和执行。文件权限设置确保上传的文件目录没有执行权限限制潜在的恶意操作。