目录
前置知识:
DLL文件
.NET和DLL文件
C#和DLL文件
关系总结
.NET 配置调试-信息泄露
.NET 源码反编译-DLL 反编译与未授权访问
编译DLL文件
反编译DLL文件
注意事项
案例:
验证代码文件有没有可以绕过(Cookie&Session)
找那些文件没有包含验证代码文件
前置知识:
DLL文件
DLL文件(Dynamic Link Library)是Windows操作系统中的一种二进制文件格式,它包含可以由多个程序同时使用的代码和数据。DLL文件通常包含函数、数据、资源等,它们可以被执行文件(如.exe文件)或其他DLL文件调用。DLL文件有助于代码重用和模块化,因为多个应用程序可以共享同一个DLL文件中的代码。
.NET和DLL文件
在.NET中,DLL文件通常指的是程序集(Assembly),它们是.NET框架下的可重用代码单元。程序集可以是DLL文件或EXE文件,它们都包含MSIL(Microsoft Intermediate Language)代码,这是.NET框架下的中间语言。当程序集被加载到.NET运行时环境(CLR)中时,MSIL代码会被编译成机器码并执行。
C#和DLL文件
C#是一种编译型语言,但它编译成的不是直接可以在CPU上执行的机器码,而是MSIL代码。这意味着C#编写的代码在编译时会生成DLL或EXE文件,这些文件包含MSIL代码。当这些文件被执行时,CLR会负责将MSIL代码编译成机器码,并在适当的时候执行它。
关系总结
- C#编译成DLL或EXE文件:C#编写的代码在编译时会生成DLL或EXE文件,这些文件包含MSIL代码。
- .NET提供运行时环境:.NET框架的CLR提供运行时环境,负责将MSIL代码编译成机器码并执行。
- DLL文件是.NET程序集:在.NET中,DLL文件是程序集的一种形式,它包含可由多个应用程序共享的代码。
因此,C#、.NET和DLL文件之间的关系是:C#编写的代码编译成包含MSIL代码的DLL或EXE文件,这些文件在.NET框架的CLR运行时环境中执行。DLL文件作为程序集,在.NET中扮演着重要角色,使得代码可以模块化、重用和共享。
.NET 配置调试-信息泄露
在ASP.NET应用程序中,web.config
文件用于配置应用程序的行为。customErrors
元素是 web.config
文件中的一个重要部分,它允许你控制当应用程序发生错误时显示给用户的错误信息。customErrors
元素的 mode
属性决定了是否启用自定义错误页面,以及如何处理这些错误。
mode
属性可以设置为以下几个值:
-
Off
:禁用自定义错误页面。当发生错误时,会显示详细的错误信息给最终用户,包括堆栈跟踪。这通常只在开发环境中使用,因为它可能会泄露敏感信息。 -
On
:启用自定义错误页面。当发生错误时,会重定向到指定的错误页面(通常是一个友好的错误消息),而不是显示详细的错误信息。这是生产环境中常用的设置,因为它可以防止敏感信息泄露给最终用户。 -
RemoteOnly
:这是一个介于Off
和On
之间的选项。当请求来自本地服务器(即开发机器)时,会显示详细的错误信息;而当请求来自远程客户端时,会重定向到自定义错误页面。这允许开发人员在本地开发时看到完整的错误信息,而在部署到生产环境时仍然保护用户免受敏感信息的侵害。
要配置 customErrors
元素和 mode
属性,你需要在 web.config
文件的 <system.web>
部分中添加或修改 customErrors
元素。下面是一个配置 customErrors
的示例:
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="~/Error.aspx">
<error statusCode="404" redirect="~/Error404.aspx" />
<error statusCode="500" redirect="~/Error500.aspx" />
</customErrors>
</system.web>
</configuration>
在这个示例中,mode
被设置为 "On"
,这意味着当发生错误时,应用程序将重定向到 Error.aspx
页面。对于特定状态码(如 404 和 500),可以指定不同的错误页面。
确保在生产环境中始终启用自定义错误(即设置 mode="On"
),以保护应用程序免受信息泄露攻击。同时,确保自定义错误页面不包含任何可能泄露应用程序内部信息的内容。
案例演示:
当customErrors
元素的 mode
属性设置为On时候,这里我写了一个报错页面,让他报错默认跳转到Error500.html
因为我没有配置数据库,所以在登录页面测试,登录肯定涉及到查数据库的,所以肯定会报错
而 当customErrors
元素的 mode
属性设置为Off时候,就爆出了数据库错误,和.NET版本
.NET 源码反编译-DLL 反编译与未授权访问
DLL(动态链接库)文件在.NET环境中是包含已编译代码的库,它们通常由C#、VB.NET或其他.NET语言编写的源代码编译而成。这些文件包含元数据、中间语言(MSIL)代码和资源,它们在运行时被.NET公共语言运行时(CLR)解释或即时编译(JIT)成机器代码。
编译DLL文件
在.NET中,你可以使用Visual Studio或命令行工具(如csc.exe
对于C#)来编译源代码并生成DLL文件。以下是使用Visual Studio编译DLL的基本步骤:
- 创建类库项目:在Visual Studio中,选择“创建新项目”并选择“类库”模板。
- 编写代码:在项目中添加类和方法,编写你的逻辑。
- 构建项目:选择“生成”菜单中的“生成解决方案”来编译项目。如果编译成功,将在项目的输出目录(通常是
bin\Debug
或bin\Release
)中生成DLL文件。
反编译DLL文件
反编译DLL文件意味着将已编译的二进制代码转换回源代码或中间表示形式。在.NET中,由于元数据与代码一起存储,因此可以相对容易地反编译DLL以获取源代码的近似表示。但是,请注意,反编译得到的代码通常不会是原始的、未经修改的源代码,特别是如果原始源代码经过了混淆或加密处理。
以下是使用反编译器反编译DLL文件的步骤:
- 选择反编译器:选择一款.NET反编译器,如dotPeek、ILSpy、dnSpy或JustDecompile。
- 打开DLL文件:使用反编译器的图形界面打开DLL文件。
- 浏览代码:反编译器将显示DLL中的类、方法和其他成员。你可以浏览这些成员并查看它们的实现。
- 导出代码(可选):一些反编译器允许你将反编译的代码导出为项目文件或源代码文件。这通常不是原始源代码的完美复制,但可以作为起点进行进一步的开发或分析。
注意事项
- 混淆和加密:如果DLL经过了混淆或加密处理,反编译得到的代码可能很难理解或分析。
- 不完整性:即使使用了最先进的反编译器,也不能保证得到的代码与原始源代码完全相同。有些细节可能会在编译过程中丢失。
案例:
工具:ILSpy,burp
未授权访问一般分两种情况:
-
验证代码文件有没有可以绕过(Cookie&Session)
当我们访问http://192.168.10.134/purchase.pd.aspx#时,会跳转让我们登录
打开pd.aspx源文件,并没有看到验证代码,但可以看到有一个母版路径purchase.Master,CodeBehind指向的后端代码和继承了purchase.pd
打开purchase.Master也没有验证代码,但是继承了pur
使用ILSpy对bin目录下的purchas.dll反编译,查看Purchase.Purchase.pur的源码,可以看到代码中对GetUserId作了一个判断,满足条件就跳转登录页面
点一下UserHelper追踪到这个类,可以看到这个方法做了一个Cookie判断,如果"userinfo"这个Cookie存在,则从该Cookie中取出名为"userid"的值,并将其转换为整数返回。都不满足条件就返回-1,联合上面代码就是让其跳转登录页面
使用burp抓包尝试验证代码可不可以绕过(Cookie&Session),这种情况一般在白盒可以看源代码的情况下
正常情况会被重定向
当我们添加Cookie:userinfo=userif=1时,验证代码就被绕过了
回到拦截页面添加这个Cookie在放包,就成功访问到了
-
找那些文件没有包含验证代码文件
比如popuser.aspx 就没有包含验证码的母版
直接访问