0x00
在进行安全测试的时候经常遇到ASP.NET平台的各类系统,它们加密手段有强有弱。有的只加密用户信息,有的则将数据库连接字串也进行了加密。以前不熟悉ASP.NET的时候有时解密一个连接字串都要花费数小时。下面介绍三种方法(由难到易),以便快速解密加密的内容,适合新手。
0x01
工具:IIS(要配置支持ASP.NET)、.NET Reflector、记事本、任意浏览器……
要求:一定的代码阅读能力
0x02
方法一(适用于能看懂代码又能写代码的童鞋)
.NET Reflector定位至解密函数读懂代码,用任意一门编程语言编写同样解密算法的工具。(不详述此方法,因此方法跟自身的代码阅读能力、逆向跟踪能力有关。若是解密算法调用函数太多那么会消耗不少时间)
方法二(适用于能读代码但不会写代码的童鞋)
示例:
.NET Reflector定位至解密函数
查看无复杂的调用,只有string str2 = str_key;中的str_key是未知的。跟踪得到str_key是zysoftvschool。
复制整个函数到demo.aspx,添加要解密的字符串。demo.aspx内容如下:
<%@ Page Language="C#" ValidateRequest="false" %> <script runat ="server" > //===============直接复制 .NET Reflector中看到的函数================ public static string Decrypt(string str) { string str2 = "zysoftvschool"; string str3 = ""; int num5 = 0; if (str == "") { return ""; } int length = str2.Length; if (length == 0) { str2 = "Think Space"; } int num2 = 0; int num3 = Convert.ToInt32(str.Substring(0, 2), 0x10); int startIndex = 2; while (true) { try { num5 = Convert.ToInt32(str.Substring(startIndex, 2), 0x10); } catch (Exception) { } int num6 = num5 ^ Convert.ToInt32(str2[num2]); if (num6 <= num3) { num6 = (0xff + num6) - num3; } else { num6 -= num3; } str3 = str3 + Convert.ToChar(num6); num3 = num5; startIndex += 2; if (num2 < length) { num2++; } else { num2 = 1; } if (startIndex >= str.Length) { return str3; } } } /=========================================================== </script> <% //调用上面的解密函数Decrypt Response.Write(Decrypt("要解密的字串写这里")); %>
浏览器访问,得到密码:***ccom102668
方法三(适用于代码读不了更写不了的童鞋)
示例:
.NET Reflector定位至解密函数,解密函数调用非常复杂,跟了几步思路也跟丢了……
对付这类的加密那就使用最简单的方法吧——直接调用dll内的解密函数。调用方法:命令空间.类.方法
注意:本地解密需要把调用的xxx.dll放至Web目录的bin文件夹中!如果将写好的脚本放到目标Web目录则可以直接执行。
Demo:
<%@ Page Language="C#" ValidateRequest="false" Debug="true" %> <script runat ="server" > public static string Decrypt(string str) { string str3 = ""; //下面是调用方法 str3 = Newcapec.eCard.Utility.ConnectionInfo.DecryptDBConnectionString(str); return str3; } </script> <% Response.Write(Decrypt("AQAAANCMnd8BFdERjHoAwE/Cl +sBAAAAECVqcj9oCEGaJ0mZSN5kGAQAAAACAAAAAAAQZgAAAAEAACAAAAAhqwK0FIppu3zaId41oqAahOfebXIgpn6Y 9wtCSh66xwAAAAAOgAAAAAIAACAAAAA9kwoU8mJNSwcoouLxVGh9PIU8RLsqFehwf0nmMVUeamAAAABdTYklOfQhsR4 l8obq/PAZfLp12Ff1GvHiJBK1C7lJzi8d0dgs51TZvp5fOc0C2Ok6qqtXXcx07i9KlMGr1ETF23vFi0oE5wHy36bjGu 0OvTo9psUMFia7wVLkchDkDoRAAAAAULGxt/L13wLHBMpv85P+ruAczDqo5NG8ufk +F3VVaEdPr7PvFK3OeHYtMOlLRSTBZk6sKilhsQRuNNM4z0GouA==")); %>
浏览器中访问得到解密后内容:Data Source=orcl;User Id=ccense;Password=ecard;min pool size=1;max pool size=50;Pooling=true
0x03 总结
三种解密方法中第三种方法最为省时省力,且对那些绑定机器的加密最为简单有效。但是还是建议多使用第一种方法,虽耗时耗力但可以学到更多东西。
各种吐槽:
1#
看风者 | 2014-09-12 12:47
不顶没天理
2#
insight-labs (Root Yourself in Success) | 2014-09-12 12:52
赞一个
3#
梧桐雨 (ofni.uygnotuw) | 2014-09-12 13:01
好帖!顶。
4#
c4bbage (1z) | 2014-09-12 13:06
赞一个
5#
Vigoss_Z (好好活认真爱 多吃水果和蔬菜) | 2014-09-12 13:33
我来添一个吧。
还有一种情况是使用.NET自带的加密方法加密链接字符串
解密:
aspnet_regiis.exe -pd "connectionStrings" -app "/SampleWebSite"
(因是RSA加密,所以必须在同一台机器上进行;站点的web.config被加密,下载下来本机解不了。)
第二种方法:
代码:
using System; using System.Configuration; using System.Web.Configuration; string provider = "RSAProtectedConfigurationProvider"; string section = "connectionStrings"; protected void btnDecrypt_Click(object sender, EventArgs e) { Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); ConfigurationSection configSect = config.GetSection(section); if (configSect.SectionInformation.IsProtected) { configSect.SectionInformation.UnprotectSection(); config.Save(); } }
web.config被解密。
6#
工作专用 | 2014-09-12 16:42
神贴刘明!
7#
Nc4 | 2014-09-12 16:46
神贴
8#
Sunshine (0123456789) | 2014-09-13 09:59
嗯嗯
赞一个,平时用Reflector看看函数
9#
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2014-09-13 10:04
good jb~