工做準備java
•一臺SQLSERVER 2005/SQLSERVER 2008服務算法
•SQLSERVER jdbc驅動程序sql
•Java開發環境eclipse + jdk1.8服務器
•java反編譯工具JD-Coreeclipse
反編譯JDBC分析SQLSERVER客戶端與服務器通訊原理函數
SQLServerConnection.class工具
一、通過反編譯分析SQLServerConnection.class文件咱們能夠看到登陸時所執行的算法,代碼以下圖所示: sqlserver
因而可知sqlserver在用戶名密碼傳輸過程當中使用了SSL加密,從上圖中咱們能夠看到在啓用SSL加密前執行了Prelogin(String param,int param2)函數,該函數算法大體以下圖所示:
加密
二、通過一些列分析得知,在啓用SSL加密前客戶端向服務器發送了客戶端驅動信息以後當即讀取服務返回的版本內容以做判斷當前所使用的驅動是否支持。設計
三、在反編譯分析代碼過程當中能夠看到用戶名密碼加密算法分別所示:
由此能夠經過逆向推算得出用戶名密碼解密算法以下所示:
TDSChannel.class
一、通過反編譯分析SQLServerConnection.class 文件得知經過調用TDSChannel.class 中的函數enableSSL(String param,int param2),那麼通過反編譯TDSChannel.class文件分析得知該函數主要代碼段以下所示:
二、因而可知SQLSERVER客戶端僅在傳輸用戶名密碼時啓用了ssl加密,登陸認證先後數據傳輸均採起明文傳輸。
SSL通道攔截設計
一、SQLSERVER原始SSL通訊以下:
二、攔截後通訊以下:
程序設計
一、認證服務僞代碼以下:
二、讀取客戶端驅動版本等信息並模擬sqlserver返回的版本信息,僞代碼以下所示:
三、完成以上兩步操做後當即開啓SSL通道等待客戶端開啓SSL並握手,僞代碼以下:
四、若SSL握手成功則接收客戶端發送的用戶名密碼信息,並當即鏈接目標服務僞代碼以下:
五、若鏈接成功則模擬客戶端發送驅動版本信息並讀取目標服務返回的信息反饋給真正的用戶,緊接着開始SSL握手,若握手成功則當即發送真實的用戶名密碼,僞代碼以下所示:
SSL通道用戶名密碼替換以及實時監控
一、使用SQLSERVER標準客戶端工具填寫堡壘主機地址和端口號用戶名密碼以及目標主機信息,以下所示:
二、點擊「鏈接」登陸實現轉發鏈接功能,登陸成功以下所示:
三、經過實時監控窗口查看SQLSERVER客戶端執行的命令,以下圖所示:
四、新建查詢執行命令,以下所示:
五、經過實時監控查看執行的命令信息,以下所示:
到此爲止已完成全部工做。