# 【.NET小科普之一】数据库信息在哪儿

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2014-03-03T03:48:00Z
Canonical: https://wepostx.com/topics/369

> 乌云历史资料归档
>
> **原始作者：** wefgod
> **原始编号：** superkieran-wooyundrops:162
> **原始发布时间：** 2014-03-03 11:48
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

## 0x00 前言

最近有人问到ASP.NET里面的数据库连接信息一般去哪里找。
这里我简单总结一下我遇到过的一些情况，和大家分享一些简单的方法去找ASP.NET的数据库连接信息或数据库文件。

## 0x01 寻找方式

先说一般的数据库连接信息。

### 第一种
一般在web.config，如某套OA就是将连接字符串存放在该文件内，如下图：

![原文图片](/media/2016/06/74ab06f7530f9715727945ae9443d812)

### 第二种
有的ASP.NET程序功能较多，会自定义其它config文件，所以可能会存在多个config，而数据库连接信息就存放在其它config文件中，比如逐浪CMS（你们懂的）就有多个config文件，如下图:

![原文图片](/media/2016/06/ae5b559843004d8885c67e6fb42d7c78)

但数据库相关连接信息存放在ConfigConnectionStrings.config里：

![原文图片](/media/2016/06/c919784c2bec4219bb76b471e901ef72)

### 第三种
也有更标新立异的压根不存放在config中，比如信游（你们也懂的）的免费版，也有一个config文件夹，里面的文件大致如下：

![原文图片](/media/2016/06/99092a57a15374e0ecfb47456cf34fca)

数据库连接信息存放在server.apb中：

![原文图片](/media/2016/06/023975b67fe806957eef207a648208e0)

### 第四种
有一些比较奇葩的，直接写在代码中。这种情况下如果没有源码cs文件，就只能反编译bin目录下的dll文件了，必须扩展开来说，这是后话了。
数据库文件
那如果是access或者SQLite的情况又会有什么变化呢？他们的数据库会存放在什么位置？
现在大多CMS为了避免直接下载MDB或相关格式的问题，在.NET中采取了其它手段去防下载，比如50cms将SQLite的数据库存放在根目录的App_Data文件夹中：

![原文图片](/media/2016/06/fa1f8026bee88ed7460572ec7f84d843)

2013就是50cms的数据库：

![原文图片](/media/2016/06/7e732de53703bf27c54c233df2155b60)

另外还有直接将access数据库存放在App_Code文件夹中的，保存为.cs后缀，由于App_Code和App_Data是无法直接通过post和get来直接访问的（你有任意文件下载的话谁都拦不住你），所以在一定程度上保证了网站的安全性，比如下面的2013.cs实际就是网站的数据库：

![原文图片](/media/2016/06/6a5e15d4c283a9c201935308f6727635)

当然了，上面说的也是较为常见的，凡事总会有奇葩的，结合实际情况以不变应万变吧！
总结一下，数据库或者数据库相关信息会在哪里：

```text
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为例）：

![原文图片](/media/2016/06/71d454705af7f9100d079ad978590f4e)

Bin目录是编译后的两种类型的可执行文件：

![原文图片](/media/2016/06/f6a9c62dd54b2b562e69e7328a5bfd9b)

Debug编译后的程序会带有一些相关的调试信息，体积会大一点，release是发布版本的相对没带有那么多调试信息，体积会小一些。
第二种，就是我们要重点熟知的asp.net应用程序，一个很简单的asp.net应用程序的源码目录结构如下：

![原文图片](/media/2016/06/7c24f726a51c49e05abdc97cf50f8ef8)

一般来说，我们的关注点更多不在aspx文件中，因为VS2005之后都主要是将相关的代码分离到了cs文件中。所以我们更多要关注的是.cs后缀的文件，但是在发布版的网站中，是不包含cs文件的，此时我们要关注的就是bin目录了，bin目录中有相关的dll。比如上面的小网站的bin目录只有一个dll文件：

![原文图片](/media/2016/06/99b74dc8e18d755180f7f88c0928c7f0)

### 2. 用什么反编译.NET的程序
目前相对比较有名的.NET反编译程序主要有两款：

```text
Reflector ILSpy
```
Reflector是一个比较早出现而且功能也比较强大的反编译软件（在这略微提醒一下，是反编译不是反汇编），支持自定义插件和代码调试的功能，支持将源码反编译为IL语言、VB.NET、C#、Delphi.NET、F#和MC++等并可选择.NET框架的相关版本（不同版本有不同的语言特性），目前最新版已经是8.0，7.3版的截图如下：

![原文图片](/media/2016/06/e1808715c2f4ea10482bc36b4771b524)

选定某个dll后，可以在File菜单中选择导出源码：

![原文图片](/media/2016/06/00a73f29041d4e10a8c4999b2abe75b5)

ILSpy是一个开源且免费的反编译程序，主要功能还是反编译，不支持插件，可以翻译成的语言主要是C#、VB.NET和IL。最新版截图如下：

![原文图片](/media/2016/06/c163ca8a468080a9f0260cfa6b07fb0a)

选中某个dll后，可以在File菜单中导出源码：

![原文图片](/media/2016/06/a75c1a7f2f74c2b7363d7523c26d433f)

### 3. 反编译的简单实例
在这以简单免费的ILSPY做演示。
先来一个找源码中数据库连接信息的例子，示例是用我们上面提到的一个小网站。
先打开ILSpy，拖动相关的dll到左边的边栏中：

![原文图片](/media/2016/06/eadaf693cfd81034a7eb9b661ab90da7)

点击+号，展开相关的信息：

![原文图片](/media/2016/06/05eb1c6e58ce0061af5fda2ed3ddcf36)

这里没有做混淆（这是后后后话了），所以反编译出来的类比较容易从名词中看出其作用。 既然要找数据库连接信息，那要先考虑一点，什么时候会进行数据库的连接？很简单！登录的时候吗，所以一般来说，都是先围绕登录点相关的类和函数进行。点击上面的login：

![原文图片](/media/2016/06/7627644c291af3474a39e93ea453e62c)

此时右边的分栏可以看到该login类的源码了。里面主要有两个方法：Page_Load和Button1_Click。其中Page_Load是页面加载时一定会调用的方法，Button1_Click是按钮点击事件的方法（简单说就是点击登录按钮时调用的方法）。 点击左边的+号展开两个方法，会发现Page_Load是空的，Button1_Click是包含有源代码的：

![原文图片](/media/2016/06/85ec502f8abf10825123b4167b160f1f)

所以只能从按钮点击那下手了。

![原文图片](/media/2016/06/9bc35e5ae0f43f1329c2e09869cbb320)

看上图标蓝色的地方，很明显就是数据库连接信息，把数据库连接信息写入到源码中，不是很利于后期的维护。
另外一篇例子，可以参考我发布在zone里的
[http://zone.wooyun.org/content/3469](http://zone.wooyun.org/content/3469)
寻找正方教务系统数据库连接解密方法的一篇文章。
再展示下，如果没混淆和加密的.NET程序，我们可以做到什么。比如下面这个大牛写的程序：

![原文图片](/media/2016/06/4c29dbab16e4d8530ec5185479592d43)

确定就退出了，只要稍加修改马上可以去掉相关的代码，任意用了：

![原文图片](/media/2016/06/7af63e782d33c341e7b291898626c047)

最后就不总结什么了，祝大家0day多多！
浊文一篇为博大家一笑，请勿较真……第一次来提交，写得不好请指正。

## Replies
