WEB攻防-.NET特性常见漏洞

时间:2024-05-02 07:08:23

目录

前置知识:

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 属性可以设置为以下几个值:

  1. Off:禁用自定义错误页面。当发生错误时,会显示详细的错误信息给最终用户,包括堆栈跟踪。这通常只在开发环境中使用,因为它可能会泄露敏感信息。

  2. On:启用自定义错误页面。当发生错误时,会重定向到指定的错误页面(通常是一个友好的错误消息),而不是显示详细的错误信息。这是生产环境中常用的设置,因为它可以防止敏感信息泄露给最终用户。

  3. RemoteOnly:这是一个介于 OffOn 之间的选项。当请求来自本地服务器(即开发机器)时,会显示详细的错误信息;而当请求来自远程客户端时,会重定向到自定义错误页面。这允许开发人员在本地开发时看到完整的错误信息,而在部署到生产环境时仍然保护用户免受敏感信息的侵害。

要配置 customErrors 元素和 mode 属性,你需要在 web.config 文件的 <system.web> 部分中添加或修改 customErrors 元素。下面是一个配置 customErrors 的示例:

<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="&#126;/Error.aspx">
<error statusCode="404" redirect="&#126;/Error404.aspx" />
<error statusCode="500" redirect="&#126;/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的基本步骤:

  1. 创建类库项目:在Visual Studio中,选择“创建新项目”并选择“类库”模板。
  2. 编写代码:在项目中添加类和方法,编写你的逻辑。
  3. 构建项目:选择“生成”菜单中的“生成解决方案”来编译项目。如果编译成功,将在项目的输出目录(通常是bin\Debugbin\Release)中生成DLL文件。

反编译DLL文件

反编译DLL文件意味着将已编译的二进制代码转换回源代码或中间表示形式。在.NET中,由于元数据与代码一起存储,因此可以相对容易地反编译DLL以获取源代码的近似表示。但是,请注意,反编译得到的代码通常不会是原始的、未经修改的源代码,特别是如果原始源代码经过了混淆或加密处理。

以下是使用反编译器反编译DLL文件的步骤:

  1. 选择反编译器:选择一款.NET反编译器,如dotPeek、ILSpy、dnSpy或JustDecompile。
  2. 打开DLL文件:使用反编译器的图形界面打开DLL文件。
  3. 浏览代码:反编译器将显示DLL中的类、方法和其他成员。你可以浏览这些成员并查看它们的实现。
  4. 导出代码(可选):一些反编译器允许你将反编译的代码导出为项目文件或源代码文件。这通常不是原始源代码的完美复制,但可以作为起点进行进一步的开发或分析。

注意事项

  • 混淆和加密:如果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 就没有包含验证码的母版

直接访问