配置文件中的数据库连接串加密了,你以为我就挖不出来吗?
一:背景
1. 讲故事
前几天在调试物联柜终端上的一个bug时发现 app.config 中的数据库连接串是加密的,因为调试中要切换数据库,我需要将密文放到专门的小工具上解密,改完连接串上的数据库名,还得再加密贴到 app.config 中,烦的要死,内容如下:
<appSettings><!-- 数据库连接字符串 --><add key="OLEDBConnStr" value="XfES27am6Muw48iB1GlMVqvUbq7/Pp9n4XbZJsDu19YDr/Zdb3m7KT6haD7f9HLj/ZEvIiZbmSU4O5L9g03Y5IUB6KLCZI7s3nDLwTIC+bXLf5quu/r8ZAI+rgNnsNZdwoDfquRLQy5Cf2X8/MFDOcMNaZYMpTYeHsZoEERU/TP9t3n5QllJTihrmDFbiGHLqe1kfN3uB3g1kgs0oobIEfNPr09kQ/pFgzZi/kZCrK10PLZZ0pFj1YU5ReFqBsdBlecV3D2Zl3lx1Ibls24t7w==" /></appSettings>
改完bug之后,我就想这玩意能防的了谁呢?私以为搞这么麻烦也就防防君子,像我这样的 晓人
,加不加密都是等于没加密,照样给你脱库。。。????????????
二:使用 ILSpy 去脱库
1. 从DAL/Repository层去反编译代码
要想得到明文的数据库连接串,可以从代码中反推,比如从 DAL
或者 Repository
中找连接串字段 ConnectionString
,我这边的终端程序是用 wpf 写的,采用的是经典的三层架构,所以在 bin
下可以轻松找到,如下图:
接下来用 ILSPy
反编译这个 dll。
从上图中可以看出,连接串的明文是存放在: OleDbHelper.ConnectionString
中的,然后可以看到,程序中定义了一个 Decrypt
方法专门用来解密连接串,哈哈,有了这个算法,是不是就可以脱库啦???如下代码所示:
class Program{static void Main(string[] args){var str = "XfES27am6Muw48iB1GlMVqvUbq7/Pp9n4XbZJsDu19YDr/Zdb3m7KT6haD7f9HLj/ZEvIiZbmSU4O5L9g03Y5IUB6KLCZI7s3nDLwTIC+bXLf5quu/r8ZAI+rgNnsNZdwoDfquRLQy5Cf2X8/MFDOcMNaZYMpTYeHsZoEERU/TP9t3n5QllJTihrmDFbiGHLqe1kfN3uB3g1kgs0oobIEfNPr09kQ/pFgzZi/kZCrK10PLZZ0pFj1YU5ReFqBsdBlecV3D2Zl3lx1Ibls24t7w==";Console.WriteLine(Decrypt(str));}public static string Decrypt(string str){if (!string.IsNullOrEmpty(str)){DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();byte[] key = Encoding.Unicode.GetBytes("Oyea");byte[] data = Convert.FromBase64String(str);MemoryStream MStream = new MemoryStream();CryptoStream CStream = new CryptoStream(MStream, descsp.CreateDecryptor(key, key), CryptoStreamMode.Write);CStream.Write(data, 0, data.Length);CStream.FlushFinalBlock();return Encoding.Unicode.GetString(MStream.ToArray());}return "";}}
不过还好,数据库也是在客户那边独立部署的,不存在走外网的情况,不然就玩大了。。。接下来我们来看看如何去防范。
2. 加壳/混淆/加密狗
现在市面上商业版和免费版都提供了给C#代码进行加密和混淆,不过我没用过,我想最多在反编译代码后阅读性上增加了一些障碍,这也不过是时间问题罢了,毕竟SqlConnection,SqlCommand 这些FCL的类你是没法混淆的,我从这些类上反推可以很轻松的就能找到明文的 ConnectionString ,所以这条路我觉得是走不通的。
3. 将解密算法放在 server 端
既然 解密算法
埋在客户端你都能挖出来,那把它放在 server 端不就可以啦?在程序启动的时候,调用一下 webapi 进行解密,这样你总没辙了吧 ???哈哈,大家可以开动脑子想一想,这种方法可行不可行?诚然,解密算法搬走了,再用 ILSpy 去挖已经没有任何意义了,但这里有一个重要突破点,不管是用什么形式解密的,最后的连接串明文都是存放在 OleDbHelper.ConnectionString
这个静态变量中,对吧!接下来的问题就是有没有办法把进程中的这个静态变量给挖出来?你说的对,就是抓程序的 dump文件 用 windbg 去挖。
三:使用 windbg 去脱库
1. 思路
要想挖出 OleDbHelper.ConnectionString
,其实也很简单,在 CLR via C#
第四章中关于对象类型和类型对象的解读有这么一张图,很经典。
从上图中可以看到,静态字段是在 Manager 类型对象
中,实例字段都是在 Manager 对象
中,对照这张图,我只需要通过 windbg 找到 OleDbHelper 类型对象
,也就是所谓的 EEClass
。
2. windbg 挖矿实战
使用 !name2ee 找到 Decrypt 方法描述符(MethodDesc)
0:000> !name2ee xxx.Utilities.dll xxx.Utilities.Database.OleDbHelper.Decrypt
Module: 08ed7cdc
Assembly: xxx.Utilities.dll
Token: 060002aa
MethodDesc: 08ed83b0
Name: xxx.Utilities.Database.OleDbHelper.Decrypt(System.String)
JITTED Code Address: 048b6af0
上面的 MethodDesc: 08ed83b0
就是方法描述符的地址。
使用 !dumpmd 导出方法描述符的详细信息,找到 OleDbHelper类型对象 的 EEClass 地址
0:000> !dumpmd 08ed83b0
Method Name: xxx.Utilities.Database.OleDbHelper.Decrypt(System.String)
Class: 08ecab30
MethodTable: 08ed8468
mdToken: 060002aa
Module: 08ed7cdc
IsJitted: yes
CodeAddr: 048b6af0
Transparency: Critical
上面的 Class: 08ecab30
就是 OleDbHelper类型对象 在堆上的内存地址。
使用 !dumpclass 导出
Class: 08ecab30
,从而找到 OleDbHelper类的静态字段
0:000> !dumpclass 08ecab30
Class Name: xxx.Utilities.Database.OleDbHelper
mdToken: 02000033
File: D:\code\A18001\Source\Main\TunnelClient\bin\Debug\xxx.Utilities.dll
Parent Class: 795115b0
Module: 08ed7cdc
Method Table: 08ed8468
Vtable Slots: 4
Total Method Slots: 6
Class Attributes: 100081 Abstract,
Transparency: Critical
NumInstanceFields: 0
NumStaticFields: 2MT Field Offset Type VT Attr Value Name
799bfd60 4000152 74 System.String 0 static 04c28270 ConnectionString
799bfd60 4000153 78 System.String 0 static 04c299e8 SecurityConnectionString
从上面导出信息中可以看到 OleDbHelper类中 有两个静态字段: ConnectionString
和 SecurityConnectionString
。
使用 !do 打印出两个静态字段
看到没有,上图中的两个紫色框框就是明文的 ConnectionString 哈,怎么样?????不????。
四:总结
当认识到上面的两种脱库方式,你应该就能想到,其实你在程序中连接数据库,这本身就是一种错,操作系统都能给你盗版,何况你这区区一个小软件?个人觉得完全杜绝的方式那应该就是:灭掉本地的sqlserver,让所有的数据获取都由远端的 webapi 提供,当然这又是在脱离业务聊技术啦!????????????
配置文件中的数据库连接串加密了,你以为我就挖不出来吗?相关推荐
- 【springboot】application.yml配置文件中数据库密码password加密后显示
转载自:https://blog.csdn.net/linjingke32/article/details/81329614 如果使用@SpringBootApplication注解启动的项目,只需增 ...
- Springboot项目中使用jasypt给配置文件中密码加密
前言: 近期所做的项目进入测试阶段,在源码扫描时被检测出一些安全风险,其中就有配置文件中连接数据库的密码不能以明文展示这一问题.思考一下如果以明文展示确实会有很大的安全隐患,万一得罪一些深藏不露的黑客 ...
- Springboot加密配置文件中数据库密码的两种解决方案
Springboot 加密配置文件中数据库密码的两种解决方案 第一种:jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring Boot 项目中,并提供了自动 ...
- ASP在 Web.config 中创建数据库连接字符串
在 Web.config 中创建数据库连接串 我们需要在网站的配置文件中增加一些行,以便 Entity Framework 知道如何连接到我们的数据库,双击Web.config 文件. 卷到文件的最后 ...
- java配置文件中数据库密码加密
最近,有位读者私信我说,他们公司的项目中配置的数据库密码没有加密,编译打包后的项目被人反编译了,从项目中成功获取到数据库的账号和密码,进一步登录数据库获取了相关的数据,并对数据库进行了破坏. 虽然这次 ...
- 服务器的配置文件中的加密方式,配置文件中的密码有没有必要加密?
通常情况下,我们将类似数据库连接类的信息保存在配置文件中,java里面喜欢用properties文件,以前没有考虑过,将文件中的密码加密,现在领导要求必须加密,那么,有没有必要对密码进行加密?如果有人 ...
- Springboot加密配置文件中的敏感信息(ps:数据库密码)的方法
SpringBoot配置文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysql登陆密码,redis登陆密 ...
- Springboot项目使用jasypt加密配置文件中的敏感信息
目录 目录 项目背景 需求 jasypt简介 使用 0,版本对应关系 1,引入依赖 2,启用加密 2.1,在启动类上配置注解 2.2,启用注解扫描和@Configuration配置 2.3,只针对指定 ...
- mysql连接字符串加密配置文件_Asp.net2.0如何加密Web.config配置文件数据库连接字符串...
在asp.net2.0中,发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下: ①添加密钥 执行:C:\WINDOWS\Microsoft.NET\Framewor ...
最新文章
- 专家答题:GB50311-2007 常见问题
- 密度聚类 DBSCAN python实现
- python 面向对象编程:类和实例
- Ansible 七(ad hoc任务)
- C++unique函数应用举例
- 在html页面中怎么打印区域,javascript打印web页面中指定区域的方法
- Aria2 - OS X 下载百度云资源神器
- 【javascript练习题】函数
- edius裁剪快捷键_EDIUS 快捷键大全 edius常用快捷键大全
- CTF密码学之SM4
- BP(BackPropagation)神经网络算法详解
- 档案管理学川大972 | 档案信息资源开发与利用
- 用python将文件夹里的图片统一修改名字
- CorelDRAW2023安装下载教程精简版矢量绘图软件
- Oracle sysman.mgmt_jobs导致数据库自动重启
- php输出次方,php如何实现数值的整数次方(代码实例)
- Java判断工作日、休息日和节假日
- 汇编语言of常用指令
- [闪存 第2回] NAND Flash 原理与挑战
- Linux-Nacos-服务注册中心搭建