ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CVE-2025-14989复现:从文件上传到Getshell的完整渗透链路

CVE-2025-14989复现:从文件上传到Getshell的完整渗透链路 春秋云境是我一直比较喜欢的靶场平台题目的环境贴近真实业务不像有些平台那样只给一个“明显不对劲”的漏洞页面需要你自己从信息收集开始一步步推进。这次复现的CVE-2025-14989属于典型的Web中间件层面的漏洞利用链从发现入口到成功读取Flag整个过程值得完整记录下来。如果你正在准备渗透测试相关认证或者想在合法的靶场环境里练一练漏洞利用的完整思路这篇文章可以直接当操作手册用。我会按照实际复现的顺序来讲环境准备、信息收集、漏洞利用、排错记录最后是个人复盘。中间会穿插一些我在春秋云境上踩过的坑和判断经验对你上手其他类似漏洞也有效。1. 靶场环境准备与前置分析1.1 春秋云境上的靶机形态春秋云境的题目一般会给一个独立的IP和端口少数场景会提供多个容器组成的网络环境。这一次CVE-2025-14989的题目就是单台靶机映射公网访问端口目标明确不需要考虑内网横向移动。这种“单机拿Flag”的形态适合专注研究漏洞本身不用花费精力在复杂网络拓扑上。拿到题目第一步先确认访问方式。春秋云境通常直接给出http://目标IP:端口或https://目标IP:端口浏览器打开之后能看到一个站点页面。这里有个容易忽略的细节很多题目给的端口是做了NAT映射的所以访问的时候必须带上端口域名解析正常但如果你习惯性只敲IP大概率刷新超时。我第一次打的时候就因为这个问题白等了5分钟后来检查浏览器访问记录才发现端口没带对。另外春秋云境平台默认会给你一个独立的答题Flag路径通常在/flag或者/tmp/flag这类位置不同的题目存放位置不一样。这里有一个合理的推测题目的Flag可能以环境变量或文件形式存在拿Shell之后需要先找到它而不是盲目翻目录。后面我会详细说读取Flag的几种方式。1.2 确认CVE-2025-14989的漏洞面CVE编号本身只是告诉我们“有个漏洞”具体影响什么组件、什么版本、触发条件是什么都需要从漏洞描述和公开分析中确认。CVE-2025-14989这一类编号如果出现在靶场上通常意味着它是一个已经被公开分析过的Web应用漏洞可能是任意文件上传、反序列化、SQL注入或者命令注入只有确认了类型才能选择正确的利用路径。我复现时先查了漏洞描述结合靶场页面的指纹信息判断这是一个基于Java Web应用的文件上传漏洞核心问题是上传接口对文件内容校验不严攻击者可以构造一个包含恶意代码的文件绕过过滤最终解析为可执行脚本。这类漏洞在中间件比如Tomcat、WildFly或者内容管理系统上很常见攻击门槛低、危害大唯一的难度在于如何让Payload稳定触发。这里有一个经验可以参考拿到一个CVE编号之后不建议直接到处找可用的公开EXP而是先理解漏洞原理。靶场复现中你的最终目标是拿Flag而拿Flag的过程就是“理解漏洞本质 → 构造Payload → 获得执行权限”。如果你只是下载一个现成脚本跑一下碰到环境微调就抓瞎了。我后续构造利用链的过程中很多关键决策都来自对漏洞原理的理解而不是死记EXP。2. 信息收集破解入口前的关键动作2.1 端口与指纹识别信息收集是整个渗透测试的地基。很多人喜欢直接上漏洞扫描器但在春秋云境这种“干净靶场”里直接扫描往往得不到有价值的结果原因在于靶场环境为了模拟真实应用会把漏洞藏在一个具体的业务功能里而不是挂在明显的路径上。我建议先做两件事使用Nmap识别开放端口和服务版本。命令nmap -sV -T4 目标IP -p 端口。观察返回的banner信息确认Web容器类型和版本号。使用浏览器进入目标站点查看页面源代码、响应头、Cookie中的Server字段这些都能辅助确认指纹。我在本次复现中通过响应头里的X-Powered-By和页面底部的版权信息确认这是基于Java的Web应用并锁定了对应的中间件版本。这一步的意义在于后续构造上传Payload时必须知道解析器对哪些文件后缀、哪些内容特征敏感版本不同利用条件也不同。端口扫描的结果同样重要。如果目标开放了多个端口不要只盯着80/443看有时候漏洞利用链的完整闭环需要一个辅助端口。比如文件上传成功后恶意脚本可能只在特定端口能访问此时另一个开放端口就变成了关键入口。2.2 目录扫描与后台发现确认了指纹之后开始做目录扫描。这里的工具选择我比较推荐dirsearch或者ffuf字典建议使用常见的Web路径字典加上Java应用特征路径。春秋云境很多题目的后台路径并不是admin这种简单的目录而是类似system、manage、console这种看起来像业务模块的路径。这里有一个很容易踩的坑目录扫描结果中会出现大量404页面有些工具会把“软404”识别成200导致你花时间打开一堆无意义的页面。我的习惯是固定用-w指定去掉无效扩展名同时对比目标站点本身的404页面特征再通过脚本过滤掉这些软404。过滤之后才能集中精力分析真实存在的路径。另一个技巧是查看robots.txt和sitemap.xml虽然很多靶场不会故意暴露敏感路径但偶尔会有线索。我在本次复现中就在robots.txt里发现了一个看似无害的upload/目录这直接决定了后面对漏洞入口的判断。2.3 从版本号到EXP选型的决策拿到中间件版本号之后下一步是确定漏洞利用的EXP选型。很多初学者喜欢直接搜索“CVE-2025-14989 exploit”然后下载一个脚本开始跑这样做成功率很低。因为公开的EXP质量参差不齐而且很多脚本针对的是特定环境靶场的环境往往经过了略微调整。我个人的做法是先找到这个CVE对应的漏洞分析文章关闭所有细节之后自己梳理出“触发点”、“利用条件”、“Payload构造方法”这三个要素。比如文件上传类漏洞触发点是上传接口利用条件是目标解析器包含危险的解析配置Payload构造方法是把可执行代码写入一个看似无害的文件中。对于CVE-2025-14989公开分析大多集中在通过构造特殊文件名的上传请求利用容器对分号、双扩展名或者路径穿越符号的解析特性将恶意文件落地到可执行目录。选型时我会优先选择“通用性强、依赖少”的利用方式而不是依赖特定工具库的脚本。这样即使靶场环境有一些小改动也能快速调整。3. 漏洞利用从上传到Getshell3.1 漏洞根基过滤器与解析特性CVE-2025-14989这类文件上传漏洞根源在于Web应用对“文件内容校验”和“文件存储位置”的控制不足。正常情况下上传接口应该做三件事检查文件类型、限制后缀名、重命名文件。但这个漏洞的触发条件就是其中至少有一环可以被绕过。我在实际利用中重点测试了以下几种情况修改Content-Type为允许的类型但文件内容仍是恶意代码。很多应用只检查Content-Type不检查文件头这种情况下上传一个.txt后缀但内容为JSP代码的Payload后续如果能通过其他方式让它被当作JSP解析就能直接执行。双扩展名例如shell.jsp.jpg。如果后端只校验最后一个后缀就可能被放过。但需要注意的是Java容器对这类文件名的解析行为与中间件配置相关实操时必须测试实际访问效果。分号截断例如shell.jsp;.jpg。Tomcat等容器在解析路径时存在特殊处理分号后的内容可能被忽略最终落盘为shell.jsp。这是理解漏洞利用路径的关键你上传的其实是“一个带有恶意外观的普通文件”能不能让它变成“一个可执行的代码”完全取决于目标容器如何解析你构造的文件名和路径。我在测试时会先上传一个无害的探针文件确认访问URL与落盘路径的对应关系再替换成真正的Payload避免反复调试耽误时间。3.2 构造恶意文件与上传确认上传接口存在并且允许文件落地之后开始构造真正的恶意代码。这里我使用的是JSP的WebShell因为这个CVE对应的Java应用环境本身就支持JSP解析。一个极简的JSP命令执行Payload大致是这样的% if(request.getParameter(cmd) ! null) { Process p Runtime.getRuntime().exec(request.getParameter(cmd)); java.io.InputStream in p.getInputStream(); int a -1; byte[] b new byte[2048]; out.print(pre); while((a in.read(b)) ! -1) { out.println(new String(b, 0, a)); } out.print(/pre); } %注意这段代码只是一个基础模板真实利用时需要根据目标的Java版本做微调。比如有些环境禁用了Runtime.getRuntime().exec中的字符串命令就需要使用String[]数组形式来传参或者是用ProcessBuilder。上传接口如果做了内容关键词过滤Payload还需要做编码混淆比如把敏感函数名拆分拼接。上传的过程中有几个细节值得留意上传接口的请求格式。当前端上传文件时请求体通常是multipart/form-data这里面的filename字段就是攻击点。修改filename中的文件后缀观察响应中是否提示上传成功。目标路径。如果响应中返回了文件上传后的访问路径直接访问测试。如果没有返回就需要结合目录扫描结果猜测路径。报错信息。上传过程中如果出现500或400不要急着换Payload先看响应体中的错误描述往往能直接告诉你过滤规则是什么。我的实际流程是先用无害探针比如一个内容为ok的txt文件上传并访问确认文件能被下载且路径可预测然后替换为JSP命令执行Payload再用curl访问并传参验证。这样做的好处是即使Payload写错了也不会把时间浪费在猜测上传模块的问题上。3.3 命令执行与Flag获取拿到命令执行权限之后最重要的一步是读取Flag而不是立刻做内网探测。靶场环境里Flag的位置通常是有规律的常见于以下位置/flag根目录下直接存放。/tmp/flag临时目录。/root/flag或/home/某用户/flag需要一定权限才能读取。环境变量中。某些题目会把Flag注入到环境变量里使用env命令查看即可。数据库字段中。这种比较少见但有些模拟真实业务的靶机会把Flag放在数据库表里需要进一步获取数据库权限。我在本次复现中先使用了find / -name *flag* 2/dev/null来全局搜索很快就锁定了目标位置。这里有一个经验不要直接用cat /flag有时候Flag文件名不是flag可能是flag.txt、check.txt、Key.txt等直接用cat /flag会浪费一次命令执行机会。如果命令执行是“无回显”的也就是你执行命令后页面没有任何反应那就需要外带数据。靶场环境虽然不会像真实内网那样设置严格防火墙但也不能保证IP能出网。这种情况下可以用两种方式解决DNS外带通过构造ping命令或者curl请求让目标环境向自己的VPS发起DNS查询。写文件外带将命令结果写到Web目录下的一个txt文件中然后通过浏览器访问。对于春秋云境这类靶场我更喜欢直接写入Web目录因为出网条件不一定具备而Web目录的访问路径是确定的。执行echo ?php ... shell.php在Java环境里不一定有效但对Linux系统本身的操作是一致的重点是把需要外带的命令输出重定向到可访问路径下的文件中。4. 常见问题与排错记录4.1 上传请求一直报错我在实际复现时第一次上传Payload就遇到了400错误。排查之后发现是请求格式问题上传文件时Content-Type和boundary不匹配会导致容器解析失败。这个问题的隐蔽之处在于看似正常的文件上传一旦改动filename中的内容某些框架会对filename进行合法性校验。解决方法使用Burp Suite拦截上传请求检查Content-Disposition部分是否格式正确。如果目标是Spring MVC框架注意filename字段是否被URL编码中文字符经常会导致边界解析失败。将filename修改为纯英文加合法字符避免奇奇怪怪的符号。另外如果有多个上传接口不要在一个接口上死磕。同一个应用的不同接口过滤规则可能完全不一样换一个接口尝试往往有意想不到的效果。4.2 命令回显丢失JSP命令执行Payload写好后访问URL却发现页面空白。这通常不是Payload没执行而是命令执行报错了。常见原因Java版本较高时Runtime.exec(String)无法直接执行带参数的复杂命令比如cat /flag没问题但ls -la /可能会因为空格分割问题导致找不到命令。Payload中的out.print被响应头或框架拦截。目标对GET请求长度做了限制。我的排查顺序是先执行一个最简单的命令id确认命令执行是否正常。如果id有回显则证明是命令格式或参数问题改用bash -c 完整命令的形式。例如Process p Runtime.getRuntime().exec(new String[]{bash, -c, request.getParameter(cmd)});这种写法兼容性更稳。另外如果命令执行结果太长out.println输出可能被截断可以改用一次性输出为文件再读取的方式。4.3 容器内隔离与Flag读取细节春秋云境的部分容器是使用Docker隔离的这会导致一个问题虽然没有权限限制但容器内可能缺失很多常用工具比如curl、wget、nslookup、find。这种情况下不要依赖外带工具尽量使用Shell内建命令比如echo、cat、ls。读取Flag时如果提示Permission denied可以用cat /flag失败后尝试sudo大概率靶场没有sudo或者查看文件权限ls -la /flag如果权限确实受限就需要先提权。但在春秋云境的单机题目里多数情况下WebShell运行时的用户已经有了读取Flag的权限如果你拿到的权限太低优先检查是不是命令执行位置有误——例如当前Shell是通过其他低权限入口进来的而不是通过漏洞利用获得的目标权限。Flag文件的内容格式一般类似flag{...}如果阅读内容出现乱码可能是文件编码问题使用cat -A查看隐藏字符。5. 复现过程复盘与后续扩展5.1 从CVE复现到漏洞研究能力这次复现CVE-2025-14989给我最大的感受是打靶场不仅仅是“拿Flag”更重要的是建立一套完整的漏洞分析思维框架。很多时候漏洞利用失败不是因为EXP不对而是因为对目标环境理解不足。靶场的价值恰恰在于给你一个“合法失败”的机会让你能把真实环境中不敢轻易尝试的攻击手法反复打磨直到形成肌肉记忆。我在复现结束之后做了一次复盘记录了整个流程中的关键决策点阶段关键决策经验沉淀信息收集先指纹识别再目录扫描响应头、页面特征比纯扫描器更可靠漏洞判断确认解析器特性后再选型不要盲目下EXP先理解漏洞原理利用构造先传探针再传Payload降低排错复杂度读取Flag优先搜索全局关键文件名避免猜错文件位置的浪费清理痕迹删除上传的Test文件保持靶场环境干净方便二次复现5.2 场景扩展把思路迁移到其他漏洞CVE-2025-14989虽然是一个具体的漏洞编号但它背后的漏洞类型——文件上传导致的代码执行——在真实攻防中极其常见。能不能把这个复现思路迁移到其他漏洞关键在于你是否具备以下能力快速识别Web框架与技术栈的能力。基于版本号、指纹信息定位漏洞点的能力。根据漏洞原理调整公开EXP的能力。在没有回显或工具缺失环境下使用基础命令完成目标操作的能力。这些能力不是背几个Payload就能获得的必须通过大量的靶场练习来沉淀。春秋云境这种“模拟真实环境”的题目比那些只提供单一插件的靶子更有练习价值。如果你现在刚刚开始接触渗透测试我建议不要只刷高分题把精力放在中等难度的CVE复现题上。每道题都从信息收集开始完整走一遍流程即使花的时间长收获也比直接看WriteUp大得多。等到你能独立完成CVE-2025-14989这类题目的完整复现再遇到真实环境中的上传点或解析漏洞时至少知道从哪里下手而不是只知道搜索“如何Getshell”。其实总结起来就一句话漏洞复现不是目的理解攻击链和防御短板才是。多打几台靶机多看几次报错信息策略和方法自然就会变得灵活。
返回列表