Log4j2漏洞浅析
Apache Log4j是一个基于Java的日志框架,已于2015年8月5日停止维护。Log4j2是其重构升级版本,新增的Lookups
方法设计用于通过多种途径动态引入外部变量。log4j2版本 < log4j-2.15.0-rc2
可由JNDI注入实现远程代码执行。
执行流程
当POC作为message传递给Logger
类的error
、fatal
等方法后,略去一些非关键流程,会进入到MessagePatternConverter
类format
方法对${
内容进行解析替换:
之后进入Interpolator
类的lookup
方法,由前缀值jndi
获取到JndiLookup
类:
最终调用对应的lookup
方法发起请求,也就是遍地开花的dnslog。。。
利用流程
JDK版本<8u191,可通过LDAP引入外部JNDI Reference:
JDK版本>=8u191,当存在org.apache.naming.factory.BeanFactory
与com.springsource.org.apache.el
等依赖时,可在返回的JNDI Reference中指定相应工厂类及setter方法,或是由LDAP引入序列化链实现RCE:
同时可以结合一些其它StrLookup
适当变形,以及配合官方测试用例中脏数据"?Type=A Type&Name=1100110&Char=!"
绕过rc1。
RC2版本对此异常进行了捕获。。。