[JavaWeb]Log4j的前因後果
Log4j的前因後果
簡介
Log4J的三大組件:
Logger:日誌記錄器,負責收集處理日誌記錄 (如何處理日誌)
Appender:日誌輸出目的地,負責日誌的輸出 (輸出到什麼地方)
Layout:日誌格式化,負責對輸出的日誌格式化(以什麼形式展現)
還是一如既往的先對其的應用有個大概的了解,有利於對 漏洞的全局把控
漏洞相關知識前置
由於Log4j漏洞是利用了Log4j.lookup的解析+jndi的相關漏洞,最終觸發了所謂的「核彈級」漏洞。
Log4j的應用架構
JNDI的應用結構
漏洞分析
先用網上的exp隨便測了測,發現error和fetal會觸發,而info和debug不會觸發
所以接下來,首先要來分析為什麼error和fetal會觸發?又為什麼info和debug不會觸發
流程分析
-
進入日誌記錄後,首先判斷了日誌是否需要記錄。確認記錄,繼續跟進
-
跟進後進行了日誌的格式化,在對事件資訊進行格式的同時進行了lookup判斷,可以看到如果對於${}包含的事件消息則先對offset進行回退,也就是先不保存,然後再開始對${}進行解析
-
先匹配到了${}中包裹的字元串
-
再對獲取到的字元串不斷進行遞歸檢測${},看是否還能進行替換
-
繼續進行識別,進行變數替換
-
經過無數遍的字元串掃描識別後,看到了解析器組會依次對變數進行解析,而且同時看到了可以解析jndi的相關變數
-
一直跟到jndiManager#lookup(),發現沒有任何過濾。
-
還有個問題就是為什麼info和debug不能進行jndi利用
分析了下,主要是因為我這裡測試的方式不是webAPP,所以不執行WebLookup的插件。也就無法進行jndi的利用了 -
到此,分析完了log4j的漏洞細節
分析下來就是log4j支援${}的表達式,會對其進行遞歸解析。官方開啟此種方式是為了能夠快速獲取其他資訊。但對jndi的支援,卻導致了此次的漏洞。
log4j中項目lookup的作用:** Lookups provide a way to add values to the Log4j configuration at arbitrary places. They are a particular type of Plugin that implements the StrLookup interface. **」
以上內容複製於log4j2的官方文檔lookup – Office Site。其清晰地說明了lookup的主要功能就是提供另外一種方式以添加某些特殊的值到日誌中,以最大化鬆散耦合地提供可配置屬性供使用者以約定的格式進行調用。
漏洞利用
直接就是套用jndi的exp。
漏洞修復
官方先是給出了內網白名單的修復–》被解析漏洞繞過–》然後又被發現邏輯漏洞
泛域名解析:就是多個子域名解析到同一個ip上
流程分析小結:跟的時候總是跟的目標不對,而且似乎對jndi的底層實現不熟。對關鍵類中的敏感方法不夠感冒。。。