一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 頻頻闖禍的 JNDI,到底是個(gè)什么垃圾玩意兒?

頻頻闖禍的 JNDI,到底是個(gè)什么垃圾玩意兒?

2021-12-13 23:11小姐姐味道小姐姐養(yǎng)的狗 Java教程

每次規(guī)模比較大的漏洞,JNDI好像都不會(huì)缺席。最近人盡皆知的Log4j2漏洞也和它有關(guān),讓人 不由得懷疑,是不是作者開(kāi)的后門(mén)。

每次規(guī)模比較大的漏洞,JNDI好像都不會(huì)缺席。最近人盡皆知的Log4j2漏洞也和它有關(guān),讓人 不由得懷疑,是不是作者開(kāi)的后門(mén)。

因?yàn)镴NDI這個(gè)玩意,別說(shuō)用過(guò),很多人連聽(tīng)都沒(méi)聽(tīng)說(shuō)過(guò)。這么冷門(mén)酸爽的東西,有什么理由把它放在一個(gè)日志框架里呢?恐怕只有作者想得通。

頻頻闖禍的 JNDI,到底是個(gè)什么垃圾玩意兒?

數(shù)據(jù)庫(kù)驅(qū)動(dòng)

很多人接觸JNDI,是從數(shù)據(jù)庫(kù)的驅(qū)動(dòng)開(kāi)始的。當(dāng)然,隨著SpringBoot單體發(fā)布模式的流行,現(xiàn)在用這種方式來(lái)獲取數(shù)據(jù)庫(kù)配置的古董公司,是越來(lái)越少了。

比如,我們可以在tomcat得server.xml里,配置一個(gè)叫做xjjdogDB的資源。

  1. <Resource name="jdbc/xjjdogDB" auth="Container" type="javax.sql.DataSource"
  2. maxTotal="100" maxIdle="30" maxWaitMillis="10000"
  3. username="xjjdog" password="123456" driverClassName="com.mysql.jdbc.Driver"
  4. url="jdbc:mysql://localhost:3306/xjjdog_db"/>

那么,我們只需要在SpringBoot中配置上JNDI這個(gè)名字,它就能加載正確的配置。前提是我們需要把SpringBoot服務(wù)打包成WAR包發(fā)布。像JBoss這樣的宣稱企業(yè)級(jí)服務(wù)器的軟件,就喜歡這么干。

  1. spring:
  2. datasource:
  3. jndi-name: jdbc/xjjdogDB

從這里,我們可以看出。JNDI到底是個(gè)神馬玩意呢?你可以認(rèn)為它是一個(gè)配置中心,也可以認(rèn)為它是一個(gè)命名服務(wù)。其根本功能,就是讓你可以通過(guò)一個(gè)簡(jiǎn)短的字符串,就能獲取一系列的復(fù)雜配置和初始化后的功能。

這樣,我們就可以避免將這些配置直接寫(xiě)在項(xiàng)目里。程序啟動(dòng)起來(lái),到底加載的什么東西,要看運(yùn)行的環(huán)境配置的什么東西。

具體實(shí)現(xiàn)的話,不就是一個(gè)可以根據(jù)key獲取value的HashMap嘛。

危險(xiǎn)由此而來(lái)

關(guān)鍵是這個(gè)value,它不是String,它是一個(gè)Object。要從字符串變身為一個(gè)正常的類,還要做到通用,那就不得不依靠反射。

頻頻闖禍的 JNDI,到底是個(gè)什么垃圾玩意兒?

這張圖是Oracle官方的一張關(guān)于JNDI的介紹。上面的都不是關(guān)鍵,關(guān)鍵的地方在于,JNDI通過(guò)SPI機(jī)制,可以和LDAP、RMI等各種技術(shù),產(chǎn)生聯(lián)動(dòng)。

任何為了追求方便而不遵守常規(guī)的便捷通道,都會(huì)產(chǎn)生問(wèn)題。SPI是為數(shù)不多的打破Java類加載機(jī)制的技術(shù),和Unsafe類一樣,強(qiáng)大但并不那么推薦使用。

頻頻闖禍的 JNDI,到底是個(gè)什么垃圾玩意兒?

如上圖,就是NamingManager類里面的方法getObjectFactoryFromReference。當(dāng)它從本地加載相應(yīng)類的時(shí)候,如果加載不到,它干了一件不該干但又不得不干的事情,那就是從網(wǎng)絡(luò)上的代碼里面構(gòu)造相應(yīng)的對(duì)象!

頻頻闖禍的 JNDI,到底是個(gè)什么垃圾玩意兒?

這下,在炫肌肉的同時(shí),可完?duì)僮恿恕H缟蠄D,我們只需要在8000端口啟動(dòng)一個(gè)nginx。或者直接使用python啟動(dòng)一個(gè)小小的web服務(wù)器。

  1. python -m http.server 8000

能夠發(fā)起外網(wǎng)請(qǐng)求的服務(wù)器,將會(huì)乖乖的自動(dòng)從我們指定的服務(wù)器上撈下非法的class文件進(jìn)行加載。

制作這些攻擊性的playload也非常容易,有marshalsec這樣的工具,可以很方便的生成。

根據(jù)java的類加載機(jī)制,在static代碼塊里面,就可以干一些實(shí)際的代碼執(zhí)行邏輯。我們只需要把編譯后的a.class放在該放的地方,JNDI這玩意就能夠加載它。

  1. public class a {
  2. static {
  3. try {
  4. String[] cmd = {"calc.exe"};
  5. java.lang.Runtime.getRuntime().exec(cmd).waitFor();
  6. } catch ( Exception e ) {
  7. e.printStackTrace();
  8. }
  9. }
  10. }

上面的代碼將會(huì)在你部署的服務(wù)器上啟動(dòng)一個(gè)calc計(jì)算器。當(dāng)然,它還可以干更多事情。

END

從上面可以看出,Java的反射很強(qiáng)大,但是也很危險(xiǎn)。SPI功能繼承了這個(gè)特性,勇猛的暴露了它的弱點(diǎn)。我覺(jué)得功能很好啊,但它為什么要存在于日志框架呢?

這可能是因?yàn)榫戆伞.吘挂粋€(gè)日志框架,也是要有元宇宙的夢(mèng)想的!

原文地址:https://mp.weixin.qq.com/s?__biz=MzA4MTc4NTUxNQ==&mid=2650525085&idx=1&sn=38cdf800ec574d1f7990ec019b49f0a2&chksm=8780ca59b0f7434fd22831ef9be29e37976c5ba8a4b95bc3fafa3d75654dbb4596237dfeb6ce&mpshare=1&s

延伸 · 閱讀

精彩推薦
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒(méi)有升過(guò)級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開(kāi)發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
主站蜘蛛池模板: 国产探花在线观看 | 午夜综合网| 欧美贵妇vs高跟办公室 | 欧美日韩精 | 青青国产成人久久91网 | 国内外精品免费视频 | 久久视频这有精品63在线国产 | 日本黄大片影院一区二区 | 欧美国产视频 | 欧美xxx000喷水 | 疯狂伦交1一6小说 | 免费看国产精品麻豆 | 日韩一区二区三区在线 | 亚洲国产精品ⅴa在线观看 亚洲国产高清一区二区三区 | 无码专区aaaaaa免费视频 | 亚洲国产成人精品无码区5566 | 久久se精品一区二区国产 | yy8090韩国日本三理论免费 | 午夜影院一区二区三区 | 国产精品毛片久久久久久久 | 蜜桃视频一区二区三区四区 | 日本视频高清免费观看xxx | 四虎影音在线 | 吃大胸寡妇的奶 | 国产一区二区三区日韩 | 成年人免费看的视频 | 欧美日韩中文字幕久久伊人 | 国产成人精品免费视频大全五级 | 2022日韩理论片在线观看 | 2012中文字幕中字视频 | a级毛片毛片免费观看永久 a级黄色片免费 | 亚洲精品一线二线三线 | 男女肉粗暴进来下面好紧 | 成人福利在线视频免费观看 | 午夜精品久久久 | 被肉日常np高h | 丝瓜草莓香蕉绿巨人幸福宝 | 欧美日韩国产亚洲一区二区三区 | 精品一久久香蕉国产线看观 | 欧美大奶艳星 | 欧美视频精品一区二区三区 |