Next.js靶场实战:从信息搜集到提权的完整渗透测试记录(附CVE-2025-29927利用)
最近在复现一个内部靶场时,遇到了一个基于Next.js构建的Web应用。整个过程从端口扫描开始,到利用一个特定的Next.js信息泄露漏洞(CVE-2025-29927)获取关键凭证,最终通过Linux系统权限配置缺陷完成提权,算是一次比较典型的“白盒”渗透测试演练。对于刚入门Web安全或者想了解现代前端框架安全风险的朋友来说,这个案例包含了信息搜集、漏洞利用、权限提升等多个环节,实战性很强。接下来,我会把整个流程拆解开,结合每一步的原理和工具使用细节,分享给大家。这不仅仅是操作记录,更重要的是理解背后的“为什么”以及如何防御。
1. 靶场环境侦察与信息搜集
渗透测试的第一步永远是信息搜集,目标是尽可能全面地描绘出目标系统的“数字画像”。对于这个靶场,我们只知道一个IP地址:192.168.21.12。我的侦察策略是从外到内,先进行端口扫描,再对开放的服务进行深度指纹识别。
1.1 全面的端口与服务识别
我习惯使用Nmap进行初步扫描,但参数的选择很有讲究。简单的-sS(SYN扫描)虽然快,但可能会漏掉一些信息。对于这种内部靶场环境,我倾向于使用更全面的参数组合,以获取尽可能多的信息。
nmap -A -p- 192.168.21.12
这里解释一下参数:
-A:启用操作系统检测、版本检测、脚本扫描和路由追踪。这是一个“激进”的选项,能提供大量信息,但也会产生更多流量并被目标日志记录。-p-:扫描所有65535个TCP端口,而不是默认的1000个常用端口。
扫描结果如下(已精简关键部分):
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3
80/tcp open http Apache httpd 2.4.62 ((Debian))
3000/tcp open ppp?
| fingerprint-strings:
| GetRequest:
| HTTP/1.1 200 OK
| X-Powered-By: Next.js
| ETag: "wvpz46leg16iz"
| Content-Type: text/html; charset=utf-8
...
从结果中,我们立刻获得了三个关键信息:
- SSH服务 (22端口):运行的是OpenSSH 8.4p1,基于Debian系统。这暗示了底层操作系统可能是Debian或Ubuntu。
- 传统Web服务 (80端口):Apache 2.4.62。这是常见的配置,但扫描显示其返回的页面没有标题(
http-title: Site doesn‘t have a title),可能是一个默认页面或占位符。 - 未知服务 (3000端口):Nmap将其识别为
ppp?,但指纹字符串显示HTTP响应头中包含X-Powered-By: Next.js。这是一个强烈的信号,表明3000端口运行着一个Next.js应用。Next.js默认的开发服务器端口就是3000,生产环境也常使用此端口。
注意:Nmap的
-A参数有时会对非标准端口的服务识别不准确,这时需要结合响应内容手动判断。X-Powered-By这个HTTP头是框架或语言常见的“签名”,虽然可以被隐藏,但很多开发环境会默认开启。
1.2 针对Next.js应用的深度信息搜集
发现Next.js应用后,我们的侦察重点就转移到了3000端口。首先,用浏览器或curl访问一下主页,看看有什么内容。
curl http://192.168.21.12:3000
返回的HTML代码中,除了一个名为“maze-sec”的网络安全公司官网模版外,我在<head>部分发现了一个有趣的<meta>标签:
<meta name="hint" content="Authorized access at a secret endpoint. Try 2025." class="jsx-..."/>
这显然是一个开发者留下的线索或“彩蛋”。在真实测试中,这种信息可能来源于注释、隐藏字段、JavaScript文件甚至robots.txt。这里的提示是:存在一个秘密端点(secret endpoint),尝试“2025”。
基于这个线索,我尝试了几个常见的路径猜测:

&spm=1001.2101.3001.5002&articleId=151350191&d=1&t=3&u=857958b1d6064e2089dcdc059f974ee7)
376

被折叠的 条评论
为什么被折叠?



