0x01 背景
近期有师傅反馈拿到了.NET web.config文件,发现含有数据库账密连接字符串所在的标签<connectionStrings>被加密了,导致看不到MSSQL账户和密码,如下图
图上可看出由DataProtectionConfigurationProvider类提供加密保护的,DataProtectionConfigurationProvider 使用windows内置的密码学技术加密的,除此之外.NET还提供了另一种RsaProtectedConfigurationProvider 使用RSA公钥加解密,以下内容将具体介绍基于这两类方式进行加解密。
0x02 配置
在.NET中有两种配置数据库连接代码的方式,它们分别是 appSettings 和 connectionStrings 。在使用 appSettings 和 connectionStrings 配置数据库连接代码时,可分别在 <configuration> 下添加如下代码
2.1 appSettings
<appSettings>
<add key="conn" value="server=服务器名;database=数据库名;uid=用户名;password=密码;"/>
</appSettings>
2.2 connectionStrings
<connectionStrings>
<add name="conn" connectionString="server=服务器名;database=数据库名;uid=用户名;password=密码" providerName="System.Data.SqlClient" />
</connectionStrings>
0x03 DataProtectionProvider
使用.NET FrameWork自带的aspnet_regiis.exe将配置文件web.config中指定的标签进行加解密,aspnet_regiis 位于%WinDir%\Microsoft.NET\Framework\<versionNumber>目录下,提供了以下几个常用的参数,因为笔者这里用物理路径表示,所以未用到 -app
-pef 指定要加密的配置节,这里是 connectionStrings
-app 指定该配置文件所在的虚拟目录
-prov 指定要使用的提供程序,这里使用的是 DataProtectionConfigurationProvider
加密的命令 aspnet_regiis.exe -pef "connectionStrings" "D:\WebSite\test" -prov "DataProtectionConfigurationProvider",解密的命令 aspnet_regiis.exe -pdf "connectionStrings" "D:\WebSite\test",解密后的结果如下图所示
0x04 RSAProtectedProvider
使用 RSAProtectedConfigurationProvider类加解密web.config时,第一步需要创建名称为dotnetKey的RSA密钥容器,命令如下
aspnet_regiis -pc "dotnetKey" -exp
将创建好的配置项内容粘贴到web.config里,主要是在config文件中加入configProtectedData配置节点,这里注意一下此时的容器创建的name是dotnetProvider,如下图
加密的命令 aspnet_regiis -pef "connectionStrings" "D:\WebSite\test" -prov "dotNetProvider",如图
解密的命令 aspnet_regiis -pdf "connectionStrings" "D:\WebSite\test"。需要注意一点aspnet_regiis.exe运行所需的权限较高,必须是管理员权限才能调用,像上月底爆出的用友畅捷通的默认权限是足够的,但在通常的iis权限属于Users组,权限不够的,另外因为加密过程中使用了一个基于本机的密钥,这意味着解密过程必须在同一台计算机上完成才可以,所以通过任意下载文件下载web.config回本地是解不开的,如下图在IIS权限下执行解密命令返回空,未能解密,通常需要提权后才能解密。
0x05 结语
技术群:添加小编微信并备注进群
小编微信:mm1552923
公众号:dotNet编程大全