我們應該了解的JNDI數據源配置

收藏待读

我們應該了解的JNDI數據源配置

JNDI數據源配置是一種常用的數據源配置方法,代碼審計中可作為一種修復建議,滲透測試時則需要撥開迷霧。

一、寫在前面

文章主要介紹了JNDI數據源配置和找回密碼的方法,只嘆範圍太大只能寫下冰山一角,如有錯誤還請指出。

如需了解配置:Tomcat請看2.1,WebLogic請看2.2,WebSphere請看2.3。

如需找回數據庫連接、用戶名和密碼:Tomcat請看2.1,WebLogic請看3.1,WebSphere請看3.2。

二、JNDI數據源

JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司 提供的一種標準的Java命名系統接口,JNDI提供統一的客戶端 API,通過不同的訪問提供者接口JNDI服務供應接口(SPI)的實現,由管理者將JNDI API映射為特定的命名服務和目錄系統,使得Java應用程序 可以和這些命名服務和目錄服務 之間進行交互。[1]

JNDI數據源則是JNDI常見的應用形式,將數據源交由應用服務器託管不再由應用程序創建,只需在應用程序中設置正確的JNDI名稱,即可進行數據操作。

三、常見應用服務器配置

2.1 Tomcat 8.5

Tomcat應是非常常見的Web應用容器,其配置的關鍵點包括文件:context.xml、server.xml、 confCatalina {servername}{appname}.xml。( { servername}指tomcat中應用的服務器名稱, { appname}指tomcat中應用的名稱。)

1)根據數據庫類型,在{tomcat}lib下放入對應數據庫的jdbc包,我這裡演示用的是mysql。({tomcat}指tomcat安裝目錄。)

我們應該了解的JNDI數據源配置

2) 方法一: 配置server.xml和context.xml。在{tomcat}conf下編輯server.xml,在GlobalNamingResources中寫入Resource配置

我們應該了解的JNDI數據源配置

3)在context.xml中寫配置,將servers中的配置引用

我們應該了解的JNDI數據源配置 4)那接下來新建一個JavaWeb項目,由三個文件組成:index.jsp,web.xml,ConnExample.java。

index.jsp






JNDI測試頁面


<%
	ResultSet resultSet = ConnExample.doSelect();
out.print("");
int colcount = resultSet.getMetaData().getColumnCount();
out.print("");
while (resultSet.next()) {
	out.print("");
	for (int i = 1; i <= colcount; i++) {
		out.print("");
	}
	out.print("");
}
out.print("
ID用戶名年齡
" + resultSet.getString(i) + "
"); %>

web.xml

	TMP
	
		index.html
		index.htm
		index.jsp
		default.html
		default.htm
		default.jsp
	
	
		DB Connection
		jdbc/example
		javax.sql.DataSource
		Container
	

ConnExample.java

package jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnExample {
	public static ResultSet doSelect() throws NamingException, SQLException {
		Context context = new InitialContext();
		DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/example");
		Connection connection = dataSource.getConnection();
		Statement statement = connection.createStatement();
		String sql = "select * from users";
		ResultSet resultSet = statement.executeQuery(sql);
		return resultSet;
	}
}

5)組建項目,打包成war部署一下就好了。

我們應該了解的JNDI數據源配置

6) 方法二: 當然還有更弱化的,就是直接在context.xml中寫入配置即可。

我們應該了解的JNDI數據源配置 7) 這樣訪問之前配置的應用即可使用。

我們應該了解的JNDI數據源配置

8) 方法三: 之前的配置的作用域是全局作用域,只要是tomcat下的應用都可以訪問對應的數據源配置。如果需要針對單個應用配置數據源,可以根據應用項目名稱在目錄{tomcat}confCatalina{servername}下增加配置文件。比如我這個項目叫「JNDIDataSourceExample」,就新增文件 JNDIDataSource Example.xml。 一一對應是必須的,不然找不到配置了。

我們應該了解的JNDI數據源配置 9)在JNDIDataSourceExample中寫入配置即可。


我們應該了解的JNDI數據源配置

10) 這樣訪問之前配置的應用即可使用。

我們應該了解的JNDI數據源配置

2.2 WebLogic 12c

WebLogic應是非常常見的Web應用容器,其配置的主要通過WebLogic控制台完成,比tomcat容易的得多。

1)登錄控制台在服務裏面找到數據源,然後新建一條一般數據源。

我們應該了解的JNDI數據源配置 2)配置數據源名稱,JNDI名稱,數據庫類型。當然這裡需要注意JNDI名稱,這裡是要應用程序的一致的呢,比如:web.xml中配置的JNDI名稱

我們應該了解的JNDI數據源配置 3)選擇數據庫驅動。這點吧對比WebSphere就能看出,同一體系的好處了,至少驅動有的。

我們應該了解的JNDI數據源配置 4)後續的一些配置截圖參考,可採用默認設置。當然,數據庫名稱、主機名、端口、數據庫用戶名、口令這個肯定要和需要被連接的數據庫一致。

我們應該了解的JNDI數據源配置我們應該了解的JNDI數據源配置我們應該了解的JNDI數據源配置 5)完成之後部署之前的war包 即可使用。

我們應該了解的JNDI數據源配置

2.3 WebSphere 8.5.5.14

WebSphere是非常常見的Web應用容器,其配置的主要通過 WebSphere 控制台完成,比weblogic複雜太多,以下是建議流程。

1)WebSphere沒有自帶mysql的jdbc,需要自己添加。我這裡先拷貝放到{WebSphere}lib。

我們應該了解的JNDI數據源配置 2)登錄控制台,首先先配置資源中JDBC的JDBC提供程序,新建一個JDBC提供程序。作用域可任選,不過不能是全部,畢竟全部並不是一個選項,會提示錯誤。

我們應該了解的JNDI數據源配置 3)配置實現類名,這裡就要到mysql的jdbc包中去找了,找含有名稱DataSource或ConnectionPoolDataSource的類文件。其他的則是描述性質字段可自便。完整內容截圖看下圖第二張即可。 我們應該了解的JNDI數據源配置

我們應該了解的JNDI數據源配置 4)配置類的jar包路徑,之前我放在lib下這裡則圖個方便,依靠環境變量${WAS_INSTALL_ROOT}獲取WebSphere安裝路徑,然後再指向jar包。

我們應該了解的JNDI數據源配置 5)核對下配置,沒問題就可以完成了。

我們應該了解的JNDI數據源配置 6)以上是第一個麻煩。接下來配置JDBC中的數據源,點擊新建。作用域可任選。

我們應該了解的JNDI數據源配置 7)配置數據源名和JNDI名稱,重點是 JNDI 名稱,需要與應用中引用的一致。

我們應該了解的JNDI數據源配置

8)選擇剛才設置好的JDBC提供程序。

我們應該了解的JNDI數據源配置

9)一路默認設置到完成

我們應該了解的JNDI數據源配置我們應該了解的JNDI數據源配置我們應該了解的JNDI數據源配置 10)是的我咋沒有配置數據庫連接地址、數據庫用戶名、口令等呢?接下來就是了。進入之前新建的數據源配置。

我們應該了解的JNDI數據源配置

11)進入J2C認證數據。

我們應該了解的JNDI數據源配置 12)新建一項

我們應該了解的JNDI數據源配置 13)別名可自定義,用戶標識和密碼需要填寫為數據庫的用戶名和密碼。

我們應該了解的JNDI數據源配置 14)確定之後,再次打開剛新建的數據源配置,選擇右側定製屬性。

我們應該了解的JNDI數據源配置 15)新建一條屬性

我們應該了解的JNDI數據源配置 16)名稱為「url」,這個是固定的。值則是數據庫地址,java一般是jdbc:mysql://開頭。

我們應該了解的JNDI數據源配置 17)確定之後返回JNDI數據源配置,保存到主配置。點擊測試連接,只要沒有錯誤就OK, 警告可以忽略

我們應該了解的JNDI數據源配置

18) 完成之後部署之前的war包 即可使用。

我們應該了解的JNDI數據源配置

三、反向思考

以上三種配置,各位看官看還行?Tomcat上應該已經很透徹了,如果是Weblogic和Websphere要是某一天我進入不了控制台,又要找到數據庫的配置,咋辦???還請繼續往下看。

3.1 WebLogic 12c

1)WebLogic當配置好JNDI數據源後,對應的配置會存放到域目錄的configjdbc下。(域目錄由WebLogic由用戶指定,安裝或控制台皆可配置,我安裝的時候直接無腦下一步自然就在這裡了C:OracleMiddlewareOracle_Homeuser_projectsdomainsbase_domain)

我們應該了解的JNDI數據源配置 2)根據WebLogic控制台中配置的名稱,在此處就會保存為對應名稱的配置文件。上面配置案例是」example-jdbc」,所以文件名也就是example-jdbc.xml。打開配置文件查看配置內容,配置中包含數據庫連接、數據庫用戶名、加密後的口令、JNDI名稱。

我們應該了解的JNDI數據源配置 3)既然是找回密碼,那還需要解密一下密碼才算完結。WebLogic的密碼解密需要兩個條件,一個是加密後的字符串,一個是域目錄下securitySerializedSystemIni.dat文件。具備兩者就可以進行解密了。解密工具地址: https://github.com/NetSPI/WebLogicPasswordDecryptor 。(當然解密控制台密碼也是可以的。)

我們應該了解的JNDI數據源配置

3.2 WebSphere 8.5.5.14

1)WebSphere稍稍麻煩點,大概就像前面配置一樣麻煩。值得回顧一下之前在配置的時候有作用域的選項, 不同的作用域配置,會導致數據庫配置保存在不同的位置。慶幸的是文件名是固定的都是resources.xml。

我們應該了解的JNDI數據源配置

2)無腦下一步安裝後 單元作用域 默認路徑C:Program Files (x86)IBMWebSphereAppServerprofilesAppSrv01configcellsDESKTOP-29LUD0JNode01Cell,這裏面需要注意 AppSrv01, DESKTOP-29LUD0JNode01Cell都是可以自由配置無固定形式,但是中間的路徑結構是固定的。( DESKTOP-29LUD0JNode01Cell意思是{SystemHostName} Node01Cell。

我們應該了解的JNDI數據源配置 2)再深入 節點作用域 則是在單元作用域路徑的基礎上深入目錄nodesDESKTOP-29LUD0JNode01。 DESKTOP-29LUD0JNode01 意思是{SystemHostName}Node01。)

我們應該了解的JNDI數據源配置 3)再再深入 服務器作用域 則是在節點作用域的基礎上深入目錄serversserver1。

我們應該了解的JNDI數據源配置 4)那麼根據配置的作用域打開對應的resources.xml就可以了,然後在文件中搜索我們的jndi名稱。我上面2.3的配置是設置在節點作用域下,故打開節點作用域的 resources.xml。這裡離目標更近一步了,我們獲得了 authDataAlias和數據庫連接地址,接下來是找到真實的認證信息

我們應該了解的JNDI數據源配置我們應該了解的JNDI數據源配置

5)authDataAlias的值是保存在單元作用域下的security.xml文件中,打開security.xml搜索我們的別名。userId是數據庫用戶名,password則是數據庫口令。

我們應該了解的JNDI數據源配置

我們應該了解的JNDI數據源配置 6)又是一個處理過後的密碼,這裡有個網頁工具可以一試 http://strelitzia.net/wasXORdecoder/wasXORdecoder.html ,就可以獲得密碼了。

我們應該了解的JNDI數據源配置

原文 : FreeBuf

相關閱讀

免责声明:本文内容来源于FreeBuf,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。