作者:
wefgod
·
2014/03/03 11:48
0x00 前言
最近有人問到ASP.NET裡面的資料庫連線資訊一般去哪裡找。
這裡我簡單總結一下我遇到過的一些情況,和大家分享一些簡單的方法去找ASP.NET的資料庫連線資訊或資料庫檔案。
0x01 尋找方式
先說一般的資料庫連線資訊。
第一種
一般在web.config,如某套OA就是將連線字串存放在該檔案內,如下圖:
第二種
有的ASP.NET程式功能較多,會自定義其它config檔案,所以可能會存在多個config,而資料庫連線資訊就存放在其它config檔案中,比如逐浪CMS(你們懂的)就有多個config檔案,如下圖:
但資料庫相關連線資訊存放在ConfigConnectionStrings.config裡:
第三種
也有更標新立異的壓根不存放在config中,比如信遊(你們也懂的)的免費版,也有一個config資料夾,裡面的檔案大致如下:
資料庫連線資訊存放在server.apb中:
第四種
有一些比較奇葩的,直接寫在程式碼中。這種情況下如果沒有原始碼cs檔案,就只能反編譯bin目錄下的dll檔案了,必須擴充套件開來說,這是後話了。
資料庫檔案
那如果是access或者SQLite的情況又會有什麼變化呢?他們的資料庫會存放在什麼位置?
現在大多CMS為了避免直接下載MDB或相關格式的問題,在.NET中採取了其它手段去防下載,比如50cms將SQLite的資料庫存放在根目錄的App_Data資料夾中:
2013就是50cms的資料庫:
另外還有直接將access資料庫存放在App_Code資料夾中的,儲存為.cs字尾,由於App_Code和App_Data是無法直接透過post和get來直接訪問的(你有任意檔案下載的話誰都攔不住你),所以在一定程度上保證了網站的安全性,比如下面的2013.cs實際就是網站的資料庫:
當然了,上面說的也是較為常見的,凡事總會有奇葩的,結合實際情況以不變應萬變吧!
總結一下,資料庫或者資料庫相關資訊會在哪裡:
1. web.config
2. 其它config檔案
3. 某些有特徵的資料夾下的某個檔案(如上面信遊的那個)
4. 原始碼中,去dll翻翻吧
5. App_Code或App_Data
6. 其它各種奇葩情況……
下面重點說說第四種尋找方式。
0x02 反編譯.NET程式
1 .NET的程式是怎樣的?
我們這說的.NET不是什麼www.caoliu.net,都指的是微軟的開發語言。下文對.NET的分析主要是我個人的總結,並非官方語言。
那常見的.NET程式其簡單構成是咋樣的呢?
第一種,我們常見的桌面應用,可以是winform和console型別,比如常見的winform應用其可編譯的專案原始檔結構大概如下(以VS2008為例):
Bin目錄是編譯後的兩種型別的可執行檔案:
Debug編譯後的程式會帶有一些相關的除錯資訊,體積會大一點,release是釋出版本的相對沒帶有那麼多除錯資訊,體積會小一些。
第二種,就是我們要重點熟知的asp.net應用程式,一個很簡單的asp.net應用程式的原始碼目錄結構如下:
一般來說,我們的關注點更多不在aspx檔案中,因為VS2005之後都主要是將相關的程式碼分離到了cs檔案中。所以我們更多要關注的是.cs字尾的檔案,但是在釋出版的網站中,是不包含cs檔案的,此時我們要關注的就是bin目錄了,bin目錄中有相關的dll。比如上面的小網站的bin目錄只有一個dll檔案:
2. 用什麼反編譯.NET的程式
目前相對比較有名的.NET反編譯程式主要有兩款:
Reflector
ILSpy
Reflector是一個比較早出現而且功能也比較強大的反編譯軟體(在這略微提醒一下,是反編譯不是反彙編),支援自定義外掛和程式碼除錯的功能,支援將原始碼反編譯為IL語言、VB.NET、C#、Delphi.NET、F#和MC++等並可選擇.NET框架的相關版本(不同版本有不同的語言特性),目前最新版已經是8.0,7.3版的截圖如下:
選定某個dll後,可以在File選單中選擇匯出原始碼:
ILSpy是一個開源且免費的反編譯程式,主要功能還是反編譯,不支援外掛,可以翻譯成的語言主要是C#、VB.NET和IL。最新版截圖如下:
選中某個dll後,可以在File選單中匯出原始碼:
3. 反編譯的簡單例項
在這以簡單免費的ILSPY做演示。
先來一個找原始碼中資料庫連線資訊的例子,示例是用我們上面提到的一個小網站。
先開啟ILSpy,拖動相關的dll到左邊的邊欄中:
點選+號,展開相關的資訊:
這裡沒有做混淆(這是後後後話了),所以反編譯出來的類比較容易從名詞中看出其作用。
既然要找資料庫連線資訊,那要先考慮一點,什麼時候會進行資料庫的連線?很簡單!登入的時候嗎,所以一般來說,都是先圍繞登入點相關的類和函式進行。點選上面的login:
此時右邊的分欄可以看到該login類的原始碼了。裡面主要有兩個方法:Page_Load和Button1_Click。其中Page_Load是頁面載入時一定會呼叫的方法,Button1_Click是按鈕點選事件的方法(簡單說就是點選登入按鈕時呼叫的方法)。
點選左邊的+號展開兩個方法,會發現Page_Load是空的,Button1_Click是包含有原始碼的:
所以只能從按鈕點選那下手了。
看上圖示藍色的地方,很明顯就是資料庫連線資訊,把資料庫連線資訊寫入到原始碼中,不是很利於後期的維護。
另外一篇例子,可以參考我釋出在zone裡的
http://zone.wooyun.org/content/3469
尋找正方教務系統資料庫連線解密方法的一篇文章。
再展示下,如果沒混淆和加密的.NET程式,我們可以做到什麼。比如下面這個大牛寫的程式:
確定就退出了,只要稍加修改馬上可以去掉相關的程式碼,任意用了:
最後就不總結什麼了,祝大家0day多多!
濁文一篇為博大家一笑,請勿較真……第一次來提交,寫得不好請指正。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!