验证代码准备:
在项目登录接口中增加类似如下代码:
@PostMapping("login")
public R login(@RequestBody LoginBody form) {
//form.getUsername()="${java:version}"
logger.info("登录:{}",form.getUsername());
// 用户登录
LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
// 获取登录token
return R.ok(tokenService.createToken(userInfo));
}
或
public class App {
private static Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.info("user {}", "${java:version}");
System.out.println("Hello World!");
}
}
存在漏洞时输出结果:org.example.App - user Java version 1.8.0_181
无漏洞时的输出结果:org.example.App - user ${java:version}
输出结果:org.example.App - user ${java:version}
结论:有效
注意:在应用程序入口logger初始化之前,写入代码System.setProperty("log4j2.formatMsgNoLookups", "true");
输出结果:org.example.App - user ${java:version}
结论:有效
输出结果:org.example.App - user Java version 1.8.0_181
结论:Win10 无效【本人在Win10上测试的,而且没有尝试重新启动电脑】
以Idea Maven项目Log4J依赖包为例:
输出结果:org.example.App - user ${java:version}
结论:有效
以Idea Maven项目spring-boot-starter-logging依赖包为例:
ctrl+鼠标左键 单击artifactId内容spring-boot-starter-logging进入如下界面:
原始配置:
强制修改后:
输出结果:org.example.App - user ${java:version}
结论:有效
根据以上测试结果,对于正式环境有以下解决方案:
set _JAVA_OPTIONS=-Dlog4j2.formatMsgNoLookups=true
示例: