1. 项目概述一次典型的路径遍历漏洞实战最近在梳理一些历史遗留的、在企业内网中仍广泛部署的视频会议或协同办公系统时AVCON系统管理平台进入了我的视野。这类系统往往因为上线时间早、功能稳定而被长期使用但其背后的安全风险却容易被忽视。今天要拆解的这个“download.action任意文件读取漏洞”就是一个非常经典的路径遍历漏洞案例。它不涉及复杂的绕过技巧却因为开发人员对用户输入缺乏有效过滤直接导致了攻击者可以读取服务器上的任意文件包括敏感的配置文件、日志、甚至源代码。简单来说这个漏洞的核心在于系统提供了一个用于下载文件的功能接口通常是一个Struts2的Action比如download.action但它在处理请求参数时没有对用户传入的文件路径进行严格的校验和限制。攻击者通过构造一个包含../上级目录跳转符的特殊路径就能“穿越”出程序设定的下载目录直接指向服务器文件系统的其他位置。对于安全研究人员和渗透测试工程师而言这类漏洞的复现是基本功它能帮助我们快速评估一个系统的脆弱性理解不安全的编码实践会带来多么直接的后果。对于企业运维和开发同学了解其原理和危害则是做好安全加固的第一步。2. 漏洞原理深度解析为什么“下载”功能会变成“任意读”2.1 漏洞产生的根本原因未过滤的用户输入这个漏洞属于“路径遍历”或“目录穿越”漏洞。其根源在于一个最基本的安全原则被打破永远不要信任用户输入。在Web应用中任何来自客户端浏览器、API调用者的数据都应被视为不可信的必须经过严格的验证、过滤或映射后才能使用。在AVCON系统管理平台中设想存在这样一个业务场景管理员需要从服务器的某个特定目录例如/opt/avcon/upload/下载用户上传的会议纪要或资料。后端可能会有一个类似DownloadAction的类它接收一个fileName或filePath参数。不安全的代码逻辑可能如下// 伪代码展示问题逻辑 String userProvidedPath request.getParameter(filePath); File fileToDownload new File(/opt/avcon/upload/ userProvidedPath); // ... 后续读取文件并输出到响应的代码这段代码直接将用户传入的filePath拼接到基础目录后就尝试打开文件。如果攻击者传入的filePath是../../../etc/passwd那么拼接后的完整路径就变成了/opt/avcon/upload/../../../etc/passwd。经过操作系统路径解析../会向上回退一级目录最终这个路径就等价于/etc/passwd。于是本该下载会议资料的接口变成了读取系统关键文件的通道。2.2download.action的常见实现与风险点.action后缀通常暗示这是一个基于Struts2框架的接口。Struts2框架通过配置文件将URL映射到具体的Action类和方法。download.action可能对应一个execute()或download()方法。风险点往往集中在参数绑定环节。如果开发人员使用了像Param(fileName)这样的注解直接将请求参数注入到成员变量而又没有在方法内部或通过拦截器进行校验漏洞就产生了。更深层的风险即使程序在拼接路径后检查了文件是否存在、是否可读但如果检查发生在路径标准化normalize之前攻击者依然可能利用空字节、编码等方式进行绕过。例如传入../../../etc/passwd%00.pdf在某些Java版本中%00空字节会被解析导致系统在检查时看到的是.pdf结尾认为“合法”但在实际文件系统调用时空字节会截断后面的内容最终读取的仍是/etc/passwd。注意现代Web框架和容器对这类攻击有了一定的防护但历史系统或配置不当的环境依然广泛存在。理解原理比记忆一个Payload更重要。2.3 任意文件读取的危害性评估很多人可能觉得“只是读取不能执行命令或上传木马危害不大”这是一个严重的误区。任意文件读取的危害往往是突破内网、获取更高权限的“敲门砖”。泄露敏感配置读取WEB-INF/web.xml、application.properties、config.php等文件直接获取数据库连接字符串、加密密钥、第三方API凭证。有了数据库密码整个系统的数据就暴露了。获取源代码通过读取*.jsp、*.class可反编译或*.java文件进行白盒审计可能发现更严重的逻辑漏洞或隐藏接口。收集系统信息读取/etc/passwd了解系统用户读取/proc/self/environ获取进程环境变量可能包含敏感信息读取日志文件分析系统运行状态和潜在错误信息。为后续攻击铺路获取到的信息可用于密码撞库、社会工程学攻击或者结合其他漏洞如SSRF实现更深入的渗透。3. 漏洞复现环境搭建与工具准备3.1 实验环境规划为了安全、合法地复现漏洞我们必须在隔离的环境中进行。绝对禁止对互联网上未经授权的真实系统进行测试。虚拟机环境使用VMware Workstation或VirtualBox创建一个干净的虚拟机。推荐使用Ubuntu 20.04 LTS或CentOS 7因为它们在企业中仍很常见。目标系统我们需要找到存在漏洞的AVCON系统管理平台安装包。由于这是历史漏洞相关版本可能已从官网下架。我们可以通过一些合法的漏洞研究平台、镜像站点或从旧设备备份中获取。请务必确保你使用的软件来源合法仅用于授权测试或个人学习。中间件AVCON通常基于Java因此需要安装JDK如OpenJDK 8和一款Servlet容器如Tomcat 8或9。网络配置将虚拟机设置为Host-Only或NAT模式确保其与宿主机互通但与外网隔离。3.2 必备工具清单工欲善其事必先利其器。以下是复现过程中会用到的核心工具Burp Suite Professional/Community拦截、重放、修改HTTP请求的核心工具。社区版足以完成本次复现。我们将用它来捕获浏览器发送的请求并修改filePath参数。浏览器Chrome或Firefox并配置代理指向Burp Suite通常是127.0.0.1:8080。文本编辑器/IDE用于查看配置文件、日志如VS Code、Sublime Text。终端/ShellLinux自带的Bash或Windows下的WSL/PowerShell用于操作服务器。目录扫描工具可选如dirsearch或gobuster用于在获得Web路径信息后探测可能存在的其他敏感文件或接口。命令示例python3 dirsearch.py -u http://target-ip:8080/avcon -e jsp,action,xml,properties3.3 AVCON平台部署与初始访问假设我们已经获得了avcon-system-manager.war这样一个部署包。部署到Tomcat将WAR包复制到Tomcat的webapps/目录下例如/usr/local/tomcat/webapps/。启动Tomcat后它会自动解压该包。访问管理后台通常这类系统会有默认的管理员入口和密码。通过浏览器访问http://[虚拟机IP]:8080/avcon-system-manager/login.jsp。如果不知道默认密码可能需要查阅有限的公开资料或通过其他方式如查看数据库初始化脚本获取。在实验环境中我们可以手动修改数据库或配置文件来设置一个已知密码。验证功能点登录后寻找任何与“下载”、“导出”、“查看附件”相关的功能。这些功能点最有可能调用到存在漏洞的download.action。实操心得对于老旧的Java Web应用经常会有默认的弱口令如admin/admin、admin/123456。此外关注WEB-INF目录下的web.xml文件里面定义了所有的Servlet和URL映射是寻找接口的宝藏。4. 漏洞手工复现与利用步骤详解4.1 定位漏洞接口漏洞复现的第一步是找到攻击入口。我们假设通过功能点探索或目录扫描发现了一个可能的URLhttp://target:8080/avcon/download.action。正常请求捕获使用浏览器代理已配置Burp访问一个正常的下载链接例如点击“下载用户手册”。Burp Suite的Proxy模块会拦截到这个请求。分析请求结构查看拦截到的HTTP请求重点关注GET或POST参数。一个正常的请求可能长这样GET /avcon/download.action?filePathusermanual.pdftypedoc HTTP/1.1 Host: target:8080 ...这里filePathusermanual.pdf是一个明显的信号。我们需要测试这个参数是否可控且未过滤。4.2 构造并发送恶意Payload这是漏洞利用的核心环节。发送到Repeater模块在Burp Proxy的拦截历史中右键点击这个请求选择“Send to Repeater”。Repeater模块允许我们手动修改并重复发送请求是测试漏洞的利器。修改filePath参数在Repeater中将filePath参数的值修改为路径遍历Payload。基础Payload../../../etc/passwd尝试不同深度因为不确定Web应用的具体部署路径可能需要尝试不同数量的../。例如../../../../etc/passwd../../../../../etc/passwd。编码绕过如果需要如果系统对../进行了简单过滤可以尝试URL编码..%2f..%2f..%2fetc%2fpasswd%2f是/的编码。或者双重编码..%252f..%252f..%252fetc%252fpasswd。发送请求并观察响应点击“Send”按钮。仔细观察HTTP响应的状态码和内容。状态码200且返回了/etc/passwd文件的内容恭喜漏洞存在且利用成功。状态码404或500可能路径深度不对或文件不存在或存在一些基础防护。需要调整Payload或尝试读取其他已知存在的文件如WEB-INF/web.xmlPayload:../../../WEB-INF/web.xml。状态码403可能服务器配置了目录权限限制或者对某些路径的访问被禁止。4.3 关键敏感文件读取实战一旦确认漏洞存在就可以系统地读取敏感信息为后续分析做准备。以下是一个常见的敏感文件清单和对应的利用思路目标文件预期路径Payload示例信息价值系统密码文件../../../etc/passwd获取系统用户列表用于后续攻击。Web应用配置../../../WEB-INF/web.xml获取数据库配置、过滤器、Servlet映射等核心配置。数据库配置文件../../../WEB-INF/classes/application.properties../../../WEB-INF/classes/jdbc.properties直接拿到数据库IP、端口、用户名、密码。日志文件../../../logs/catalina.out../../../avcon-system-manager.log分析应用运行错误、其他用户操作记录可能包含敏感数据。源代码文件../../../WEB-INF/classes/com/avcon/action/DownloadAction.class下载后可用反编译工具如JD-GUI查看源码进行白盒审计。操作系统信息../../../proc/self/environ(Linux)获取当前进程的环境变量可能包含路径、密钥等。操作示例在Burp Repeater中我们系统性地修改filePath参数发送以下序列请求../../../WEB-INF/web.xml../../../WEB-INF/classes/dbconfig.properties../../../../Program Files/Apache Software Foundation/Tomcat 8.0/conf/server.xml(Windows路径猜测)每次发送后仔细阅读响应体。如果返回的是XML、Properties或明文文本信息就直接泄露了。如果是Class文件则会是一堆二进制乱码需要右键选择“Save Response” - “Response to file”保存到本地再用反编译工具打开。注意事项在真实授权测试中读取/etc/passwd或web.xml作为漏洞存在的证明通常已足够。切勿过度读取和下载数据尤其是可能包含用户隐私信息的数据库或日志这涉及法律和道德红线。5. 漏洞修复方案与安全开发建议复现漏洞的最终目的不是为了攻击而是为了理解和修复它。针对这个漏洞可以从多个层面进行加固。5.1 临时应急措施如果漏洞正在被利用急需止损可以采取以下临时方案WAFWeb应用防火墙规则在现有的WAF或网络设备上添加规则拦截含有../、..\、%2e%2e%2f等路径遍历特征的HTTP请求。应用层拦截如果无法立即修改代码可以在Tomcat的web.xml中配置一个全局过滤器对所有请求的参数进行清洗过滤掉路径遍历字符。但这可能影响正常业务需谨慎测试。访问控制严格限制运行Tomcat的系统用户权限确保其只能访问Web应用目录和必要的资源即使被遍历也无法读取关键系统文件。5.2 根本性代码修复这才是治本之策。修复的核心思想是“白名单”和“路径标准化后校验”。方案一白名单验证推荐如果下载的文件是有限的、已知的最佳实践是使用白名单机制。// 安全代码示例 - 白名单 public void download() { String userProvidedFileName request.getParameter(fileName); MapString, String allowedFiles new HashMap(); allowedFiles.put(usermanual, /opt/avcon/docs/usermanual.pdf); allowedFiles.put(template, /opt/avcon/templates/default.zip); String safeFilePath allowedFiles.get(userProvidedFileName); if (safeFilePath null) { // 文件不在允许列表中返回错误 response.sendError(404, File not found.); return; } File file new File(safeFilePath); // ... 后续安全的文件下载逻辑 }通过一个预定义的映射Map将用户传入的标识符如usermanual映射到服务器上的绝对安全路径。用户无法控制路径本身。方案二路径标准化与目录锁定如果必须允许一定程度的灵活性则必须标准化路径使用getCanonicalPath()或Paths.get().normalize().toAbsolutePath()等方法将包含../的路径解析为绝对路径。校验是否在允许目录内检查标准化后的路径是否以我们设定的安全基础目录如/opt/avcon/safe-download/开头。// 安全代码示例 - 路径校验 public void download() { String userProvidedPath request.getParameter(filePath); if (userProvidedPath null || userProvidedPath.contains(..)) { // 简单过滤更严格的应在标准化后校验 response.sendError(400, Invalid request.); return; } String baseDir /opt/avcon/safe-download/; File supposedFile new File(baseDir, userProvidedPath); try { String canonicalPath supposedFile.getCanonicalPath(); // 标准化路径 if (!canonicalPath.startsWith(new File(baseDir).getCanonicalPath())) { // 标准化后的路径不在基础目录内判定为非法访问 response.sendError(403, Access denied.); return; } // 通过校验进行下载... } catch (IOException e) { response.sendError(404, File not found.); } }5.3 安全开发规范与SDL建议要从根源上避免此类问题需要在开发流程中融入安全思考输入验证对所有用户输入实施“白名单”原则。明确哪些字符、哪些格式是允许的拒绝其他一切。最小权限原则运行Web服务的账户如tomcat用户应仅拥有所需的最小文件系统权限。安全编码培训让开发人员了解OWASP Top 10中的安全风险路径遍历A1:2017-注入类是基础课程。代码审计与渗透测试在系统上线前和定期巡检中进行专业的安全测试主动发现此类漏洞。依赖库与框架升级及时更新Struts2、Spring等框架修复已知的安全漏洞。很多路径遍历漏洞也可能由底层库的缺陷引起。6. 漏洞复现中的常见问题与排查技巧在实际操作中你可能会遇到各种情况导致复现失败。以下是一些常见问题及排查思路。6.1 漏洞无法复现的排查清单现象可能原因排查步骤返回4041. Payload路径深度不对。2. 目标文件不存在。3. 参数名猜错。1. 尝试不同数量的../3到8个。2. 尝试读取一个肯定存在的文件如WEB-INF/web.xml。3. 使用Burp Intruder对常见参数名如file,path,filename,doc进行模糊测试。返回500错误1. 服务器端代码异常。2. 输入触发了某些安全防护或导致解析错误。1. 查看Tomcat的catalina.out日志获取详细错误堆栈。2. 尝试更“温和”的Payload如..\Windows或URL编码版本。返回空白或乱码1. 文件成功读取但内容是二进制如.class。2. 服务器设置了错误的Content-Type。1. 在Burp中查看Response的Raw标签页看原始字节。保存为文件后用相应工具打开。2. 检查响应头Content-Type。请求被重定向到登录页接口需要会话认证而你的请求未携带有效Cookie。1. 先用浏览器正常登录系统确保Burp能捕获到包含JSESSIONID的Cookie。2. 在Burp Repeater中确保从Proxy history发送请求时Cookie被正确携带。可以手动复制Cookie到头信息。6.2 高级利用与绕过技巧如果基础Payload无效可以考虑以下进阶方法空字节截断在一些老旧的系统或特定语言处理中可以在文件名后添加空字节%00来截断后续的扩展名检查。例如../../../etc/passwd%00.jpg。服务器端代码可能检查文件名是否以.jpg结尾但实际读取时%00后的内容被忽略。绝对路径直接引用有时程序逻辑是直接使用用户输入没有拼接基础路径。可以尝试直接传入绝对路径如/etc/passwd或C:\Windows\win.ini。编码与双重编码WAF或简单的过滤可能只检查../可以尝试使用URL编码..%2f、Unicode编码..%c0%af不完全通用或双重编码..%252f。从已知文件推断路径如果成功读取到web.xml可以从里面找到其他配置文件的路径然后进行精准读取。6.3 自动化工具辅助验证对于批量测试或更复杂的绕过可以借助一些工具FFUF一个快速的Web模糊测试工具。可以用于模糊测试参数和路径。ffuf -u http://target:8080/avcon/download.action?filePathFUZZ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -fs 4242这个命令会尝试用字典中的词替换FUZZ位置并过滤掉大小是4242字节的响应可能是统一的错误页面从而找出有效的路径。自定义Python脚本编写一个简单的脚本自动尝试不同深度和编码的Payload并解析响应可以提高效率。最后一点个人体会漏洞复现就像解谜需要耐心和细心。从信息收集开始大胆假设小心验证。每一次失败的尝试都在帮你更接近系统的真实逻辑。对于这类路径遍历漏洞其原理之简单恰恰说明了安全开发中“安全左移”将安全考虑提前到设计和编码阶段的重要性。作为防御方定期对老旧系统进行资产梳理和漏洞扫描及时打补丁或升级替换是避免“黑天鹅”事件的关键。而对于学习者和研究者在合法的环境中亲手复现一遍远比读十篇分析文章来得深刻。
路径遍历漏洞实战:从原理到修复的任意文件读取攻防解析
发布时间:2026/6/25 18:04:33
1. 项目概述一次典型的路径遍历漏洞实战最近在梳理一些历史遗留的、在企业内网中仍广泛部署的视频会议或协同办公系统时AVCON系统管理平台进入了我的视野。这类系统往往因为上线时间早、功能稳定而被长期使用但其背后的安全风险却容易被忽视。今天要拆解的这个“download.action任意文件读取漏洞”就是一个非常经典的路径遍历漏洞案例。它不涉及复杂的绕过技巧却因为开发人员对用户输入缺乏有效过滤直接导致了攻击者可以读取服务器上的任意文件包括敏感的配置文件、日志、甚至源代码。简单来说这个漏洞的核心在于系统提供了一个用于下载文件的功能接口通常是一个Struts2的Action比如download.action但它在处理请求参数时没有对用户传入的文件路径进行严格的校验和限制。攻击者通过构造一个包含../上级目录跳转符的特殊路径就能“穿越”出程序设定的下载目录直接指向服务器文件系统的其他位置。对于安全研究人员和渗透测试工程师而言这类漏洞的复现是基本功它能帮助我们快速评估一个系统的脆弱性理解不安全的编码实践会带来多么直接的后果。对于企业运维和开发同学了解其原理和危害则是做好安全加固的第一步。2. 漏洞原理深度解析为什么“下载”功能会变成“任意读”2.1 漏洞产生的根本原因未过滤的用户输入这个漏洞属于“路径遍历”或“目录穿越”漏洞。其根源在于一个最基本的安全原则被打破永远不要信任用户输入。在Web应用中任何来自客户端浏览器、API调用者的数据都应被视为不可信的必须经过严格的验证、过滤或映射后才能使用。在AVCON系统管理平台中设想存在这样一个业务场景管理员需要从服务器的某个特定目录例如/opt/avcon/upload/下载用户上传的会议纪要或资料。后端可能会有一个类似DownloadAction的类它接收一个fileName或filePath参数。不安全的代码逻辑可能如下// 伪代码展示问题逻辑 String userProvidedPath request.getParameter(filePath); File fileToDownload new File(/opt/avcon/upload/ userProvidedPath); // ... 后续读取文件并输出到响应的代码这段代码直接将用户传入的filePath拼接到基础目录后就尝试打开文件。如果攻击者传入的filePath是../../../etc/passwd那么拼接后的完整路径就变成了/opt/avcon/upload/../../../etc/passwd。经过操作系统路径解析../会向上回退一级目录最终这个路径就等价于/etc/passwd。于是本该下载会议资料的接口变成了读取系统关键文件的通道。2.2download.action的常见实现与风险点.action后缀通常暗示这是一个基于Struts2框架的接口。Struts2框架通过配置文件将URL映射到具体的Action类和方法。download.action可能对应一个execute()或download()方法。风险点往往集中在参数绑定环节。如果开发人员使用了像Param(fileName)这样的注解直接将请求参数注入到成员变量而又没有在方法内部或通过拦截器进行校验漏洞就产生了。更深层的风险即使程序在拼接路径后检查了文件是否存在、是否可读但如果检查发生在路径标准化normalize之前攻击者依然可能利用空字节、编码等方式进行绕过。例如传入../../../etc/passwd%00.pdf在某些Java版本中%00空字节会被解析导致系统在检查时看到的是.pdf结尾认为“合法”但在实际文件系统调用时空字节会截断后面的内容最终读取的仍是/etc/passwd。注意现代Web框架和容器对这类攻击有了一定的防护但历史系统或配置不当的环境依然广泛存在。理解原理比记忆一个Payload更重要。2.3 任意文件读取的危害性评估很多人可能觉得“只是读取不能执行命令或上传木马危害不大”这是一个严重的误区。任意文件读取的危害往往是突破内网、获取更高权限的“敲门砖”。泄露敏感配置读取WEB-INF/web.xml、application.properties、config.php等文件直接获取数据库连接字符串、加密密钥、第三方API凭证。有了数据库密码整个系统的数据就暴露了。获取源代码通过读取*.jsp、*.class可反编译或*.java文件进行白盒审计可能发现更严重的逻辑漏洞或隐藏接口。收集系统信息读取/etc/passwd了解系统用户读取/proc/self/environ获取进程环境变量可能包含敏感信息读取日志文件分析系统运行状态和潜在错误信息。为后续攻击铺路获取到的信息可用于密码撞库、社会工程学攻击或者结合其他漏洞如SSRF实现更深入的渗透。3. 漏洞复现环境搭建与工具准备3.1 实验环境规划为了安全、合法地复现漏洞我们必须在隔离的环境中进行。绝对禁止对互联网上未经授权的真实系统进行测试。虚拟机环境使用VMware Workstation或VirtualBox创建一个干净的虚拟机。推荐使用Ubuntu 20.04 LTS或CentOS 7因为它们在企业中仍很常见。目标系统我们需要找到存在漏洞的AVCON系统管理平台安装包。由于这是历史漏洞相关版本可能已从官网下架。我们可以通过一些合法的漏洞研究平台、镜像站点或从旧设备备份中获取。请务必确保你使用的软件来源合法仅用于授权测试或个人学习。中间件AVCON通常基于Java因此需要安装JDK如OpenJDK 8和一款Servlet容器如Tomcat 8或9。网络配置将虚拟机设置为Host-Only或NAT模式确保其与宿主机互通但与外网隔离。3.2 必备工具清单工欲善其事必先利其器。以下是复现过程中会用到的核心工具Burp Suite Professional/Community拦截、重放、修改HTTP请求的核心工具。社区版足以完成本次复现。我们将用它来捕获浏览器发送的请求并修改filePath参数。浏览器Chrome或Firefox并配置代理指向Burp Suite通常是127.0.0.1:8080。文本编辑器/IDE用于查看配置文件、日志如VS Code、Sublime Text。终端/ShellLinux自带的Bash或Windows下的WSL/PowerShell用于操作服务器。目录扫描工具可选如dirsearch或gobuster用于在获得Web路径信息后探测可能存在的其他敏感文件或接口。命令示例python3 dirsearch.py -u http://target-ip:8080/avcon -e jsp,action,xml,properties3.3 AVCON平台部署与初始访问假设我们已经获得了avcon-system-manager.war这样一个部署包。部署到Tomcat将WAR包复制到Tomcat的webapps/目录下例如/usr/local/tomcat/webapps/。启动Tomcat后它会自动解压该包。访问管理后台通常这类系统会有默认的管理员入口和密码。通过浏览器访问http://[虚拟机IP]:8080/avcon-system-manager/login.jsp。如果不知道默认密码可能需要查阅有限的公开资料或通过其他方式如查看数据库初始化脚本获取。在实验环境中我们可以手动修改数据库或配置文件来设置一个已知密码。验证功能点登录后寻找任何与“下载”、“导出”、“查看附件”相关的功能。这些功能点最有可能调用到存在漏洞的download.action。实操心得对于老旧的Java Web应用经常会有默认的弱口令如admin/admin、admin/123456。此外关注WEB-INF目录下的web.xml文件里面定义了所有的Servlet和URL映射是寻找接口的宝藏。4. 漏洞手工复现与利用步骤详解4.1 定位漏洞接口漏洞复现的第一步是找到攻击入口。我们假设通过功能点探索或目录扫描发现了一个可能的URLhttp://target:8080/avcon/download.action。正常请求捕获使用浏览器代理已配置Burp访问一个正常的下载链接例如点击“下载用户手册”。Burp Suite的Proxy模块会拦截到这个请求。分析请求结构查看拦截到的HTTP请求重点关注GET或POST参数。一个正常的请求可能长这样GET /avcon/download.action?filePathusermanual.pdftypedoc HTTP/1.1 Host: target:8080 ...这里filePathusermanual.pdf是一个明显的信号。我们需要测试这个参数是否可控且未过滤。4.2 构造并发送恶意Payload这是漏洞利用的核心环节。发送到Repeater模块在Burp Proxy的拦截历史中右键点击这个请求选择“Send to Repeater”。Repeater模块允许我们手动修改并重复发送请求是测试漏洞的利器。修改filePath参数在Repeater中将filePath参数的值修改为路径遍历Payload。基础Payload../../../etc/passwd尝试不同深度因为不确定Web应用的具体部署路径可能需要尝试不同数量的../。例如../../../../etc/passwd../../../../../etc/passwd。编码绕过如果需要如果系统对../进行了简单过滤可以尝试URL编码..%2f..%2f..%2fetc%2fpasswd%2f是/的编码。或者双重编码..%252f..%252f..%252fetc%252fpasswd。发送请求并观察响应点击“Send”按钮。仔细观察HTTP响应的状态码和内容。状态码200且返回了/etc/passwd文件的内容恭喜漏洞存在且利用成功。状态码404或500可能路径深度不对或文件不存在或存在一些基础防护。需要调整Payload或尝试读取其他已知存在的文件如WEB-INF/web.xmlPayload:../../../WEB-INF/web.xml。状态码403可能服务器配置了目录权限限制或者对某些路径的访问被禁止。4.3 关键敏感文件读取实战一旦确认漏洞存在就可以系统地读取敏感信息为后续分析做准备。以下是一个常见的敏感文件清单和对应的利用思路目标文件预期路径Payload示例信息价值系统密码文件../../../etc/passwd获取系统用户列表用于后续攻击。Web应用配置../../../WEB-INF/web.xml获取数据库配置、过滤器、Servlet映射等核心配置。数据库配置文件../../../WEB-INF/classes/application.properties../../../WEB-INF/classes/jdbc.properties直接拿到数据库IP、端口、用户名、密码。日志文件../../../logs/catalina.out../../../avcon-system-manager.log分析应用运行错误、其他用户操作记录可能包含敏感数据。源代码文件../../../WEB-INF/classes/com/avcon/action/DownloadAction.class下载后可用反编译工具如JD-GUI查看源码进行白盒审计。操作系统信息../../../proc/self/environ(Linux)获取当前进程的环境变量可能包含路径、密钥等。操作示例在Burp Repeater中我们系统性地修改filePath参数发送以下序列请求../../../WEB-INF/web.xml../../../WEB-INF/classes/dbconfig.properties../../../../Program Files/Apache Software Foundation/Tomcat 8.0/conf/server.xml(Windows路径猜测)每次发送后仔细阅读响应体。如果返回的是XML、Properties或明文文本信息就直接泄露了。如果是Class文件则会是一堆二进制乱码需要右键选择“Save Response” - “Response to file”保存到本地再用反编译工具打开。注意事项在真实授权测试中读取/etc/passwd或web.xml作为漏洞存在的证明通常已足够。切勿过度读取和下载数据尤其是可能包含用户隐私信息的数据库或日志这涉及法律和道德红线。5. 漏洞修复方案与安全开发建议复现漏洞的最终目的不是为了攻击而是为了理解和修复它。针对这个漏洞可以从多个层面进行加固。5.1 临时应急措施如果漏洞正在被利用急需止损可以采取以下临时方案WAFWeb应用防火墙规则在现有的WAF或网络设备上添加规则拦截含有../、..\、%2e%2e%2f等路径遍历特征的HTTP请求。应用层拦截如果无法立即修改代码可以在Tomcat的web.xml中配置一个全局过滤器对所有请求的参数进行清洗过滤掉路径遍历字符。但这可能影响正常业务需谨慎测试。访问控制严格限制运行Tomcat的系统用户权限确保其只能访问Web应用目录和必要的资源即使被遍历也无法读取关键系统文件。5.2 根本性代码修复这才是治本之策。修复的核心思想是“白名单”和“路径标准化后校验”。方案一白名单验证推荐如果下载的文件是有限的、已知的最佳实践是使用白名单机制。// 安全代码示例 - 白名单 public void download() { String userProvidedFileName request.getParameter(fileName); MapString, String allowedFiles new HashMap(); allowedFiles.put(usermanual, /opt/avcon/docs/usermanual.pdf); allowedFiles.put(template, /opt/avcon/templates/default.zip); String safeFilePath allowedFiles.get(userProvidedFileName); if (safeFilePath null) { // 文件不在允许列表中返回错误 response.sendError(404, File not found.); return; } File file new File(safeFilePath); // ... 后续安全的文件下载逻辑 }通过一个预定义的映射Map将用户传入的标识符如usermanual映射到服务器上的绝对安全路径。用户无法控制路径本身。方案二路径标准化与目录锁定如果必须允许一定程度的灵活性则必须标准化路径使用getCanonicalPath()或Paths.get().normalize().toAbsolutePath()等方法将包含../的路径解析为绝对路径。校验是否在允许目录内检查标准化后的路径是否以我们设定的安全基础目录如/opt/avcon/safe-download/开头。// 安全代码示例 - 路径校验 public void download() { String userProvidedPath request.getParameter(filePath); if (userProvidedPath null || userProvidedPath.contains(..)) { // 简单过滤更严格的应在标准化后校验 response.sendError(400, Invalid request.); return; } String baseDir /opt/avcon/safe-download/; File supposedFile new File(baseDir, userProvidedPath); try { String canonicalPath supposedFile.getCanonicalPath(); // 标准化路径 if (!canonicalPath.startsWith(new File(baseDir).getCanonicalPath())) { // 标准化后的路径不在基础目录内判定为非法访问 response.sendError(403, Access denied.); return; } // 通过校验进行下载... } catch (IOException e) { response.sendError(404, File not found.); } }5.3 安全开发规范与SDL建议要从根源上避免此类问题需要在开发流程中融入安全思考输入验证对所有用户输入实施“白名单”原则。明确哪些字符、哪些格式是允许的拒绝其他一切。最小权限原则运行Web服务的账户如tomcat用户应仅拥有所需的最小文件系统权限。安全编码培训让开发人员了解OWASP Top 10中的安全风险路径遍历A1:2017-注入类是基础课程。代码审计与渗透测试在系统上线前和定期巡检中进行专业的安全测试主动发现此类漏洞。依赖库与框架升级及时更新Struts2、Spring等框架修复已知的安全漏洞。很多路径遍历漏洞也可能由底层库的缺陷引起。6. 漏洞复现中的常见问题与排查技巧在实际操作中你可能会遇到各种情况导致复现失败。以下是一些常见问题及排查思路。6.1 漏洞无法复现的排查清单现象可能原因排查步骤返回4041. Payload路径深度不对。2. 目标文件不存在。3. 参数名猜错。1. 尝试不同数量的../3到8个。2. 尝试读取一个肯定存在的文件如WEB-INF/web.xml。3. 使用Burp Intruder对常见参数名如file,path,filename,doc进行模糊测试。返回500错误1. 服务器端代码异常。2. 输入触发了某些安全防护或导致解析错误。1. 查看Tomcat的catalina.out日志获取详细错误堆栈。2. 尝试更“温和”的Payload如..\Windows或URL编码版本。返回空白或乱码1. 文件成功读取但内容是二进制如.class。2. 服务器设置了错误的Content-Type。1. 在Burp中查看Response的Raw标签页看原始字节。保存为文件后用相应工具打开。2. 检查响应头Content-Type。请求被重定向到登录页接口需要会话认证而你的请求未携带有效Cookie。1. 先用浏览器正常登录系统确保Burp能捕获到包含JSESSIONID的Cookie。2. 在Burp Repeater中确保从Proxy history发送请求时Cookie被正确携带。可以手动复制Cookie到头信息。6.2 高级利用与绕过技巧如果基础Payload无效可以考虑以下进阶方法空字节截断在一些老旧的系统或特定语言处理中可以在文件名后添加空字节%00来截断后续的扩展名检查。例如../../../etc/passwd%00.jpg。服务器端代码可能检查文件名是否以.jpg结尾但实际读取时%00后的内容被忽略。绝对路径直接引用有时程序逻辑是直接使用用户输入没有拼接基础路径。可以尝试直接传入绝对路径如/etc/passwd或C:\Windows\win.ini。编码与双重编码WAF或简单的过滤可能只检查../可以尝试使用URL编码..%2f、Unicode编码..%c0%af不完全通用或双重编码..%252f。从已知文件推断路径如果成功读取到web.xml可以从里面找到其他配置文件的路径然后进行精准读取。6.3 自动化工具辅助验证对于批量测试或更复杂的绕过可以借助一些工具FFUF一个快速的Web模糊测试工具。可以用于模糊测试参数和路径。ffuf -u http://target:8080/avcon/download.action?filePathFUZZ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -fs 4242这个命令会尝试用字典中的词替换FUZZ位置并过滤掉大小是4242字节的响应可能是统一的错误页面从而找出有效的路径。自定义Python脚本编写一个简单的脚本自动尝试不同深度和编码的Payload并解析响应可以提高效率。最后一点个人体会漏洞复现就像解谜需要耐心和细心。从信息收集开始大胆假设小心验证。每一次失败的尝试都在帮你更接近系统的真实逻辑。对于这类路径遍历漏洞其原理之简单恰恰说明了安全开发中“安全左移”将安全考虑提前到设计和编码阶段的重要性。作为防御方定期对老旧系统进行资产梳理和漏洞扫描及时打补丁或升级替换是避免“黑天鹅”事件的关键。而对于学习者和研究者在合法的环境中亲手复现一遍远比读十篇分析文章来得深刻。