Cookieless security
Source Code Disclosure in ASP.NET apps – PT SWARM (ptsecurity.com)
无 Cookie DuoDrop:ASP.NET 框架中的 IIS 身份验证绕过和应用池特权 (CVE-2023-36899 和 CVE-2023-36560) |Soroush Dalili (@irsdl) 博客
[NET 无状态会话配置漏洞.pdf--dotNet安全矩阵-zsxq](./NET 无状态会话配置漏洞.pdf)
Cookieless ASP.NET | Microsoft Learn
一切都是 .NET 的 XSS (isec.pl)
缺少无 cookie 会话管理 ·问题 #37978 ·dotnet/aspnetcore ·GitHub上
由来与建议
为什么要禁用第三方cookie?
search: 浏览器全面禁用三方 Cookie
既然禁用了第三cookie,大家怎么做的?
现在主流的浏览器都在逐渐禁用第三方cookies的使用。
在多主机环境(如使用API或iframe)中要使web程序正常工作,就需要提供一种也能在无cookies的情况下管理会话容器的方法是至关重要的。
10年前提供的传统ASP.Net框架就提供了管理此类会话的方法(在配置中设置cookieless=true)。现在,许多标准的.net应用程序都在迁移到这个特性以保持与新浏览器政策的一致性。
什么是Cookieless ASP.NET | Microsoft Learn?
为什么不用了?
既然有人用了,那就有挖掘漏洞的必要。虽然官方已经弃用,不推荐使用了。
Missing of cookieless session management · Issue #37978 · dotnet/aspnetcore · GitHub
既然是一个无法修复的不安全技术,那么有哪些问题?
-
1. URL泄露敏感信息:在cookieless 会话中,会话标识符是通过URL传递的。这意味着它可能被存储在浏览器历史、服务器日志、或者通过HTTP Referrer头泄露给第三方网站。与之相比,cookies通常只存储在客户端,并且不会自动通过URL传播。
-
2. 会话固定攻击:如果会话标识符显示在URL中,攻击者可以更容易地将固定的会话URL传递给其他用户(例如,通过社交工程学手段),这可能导致会话劫持。
-
3. XSS攻击面增加:由于会话标识符包含在URL中,因此通过XSS攻击劫持会话变得更加容易。一旦页面脚本被注入恶意代码,攻击者可以获取URL中的会话ID。
-
4. 用户隐私问题:用户可能在不知情的情况下通过社交媒体或电子邮件分享含有会话ID的URL,无意中泄露了他们的会话信息。
等等 。。。
推荐的安全方式
推荐HttpOnly的cookies,同时使用SameSite属性指定cookies。更精细地控制cookies的发送。
第三方API调用和iframe的场景
通常这些场合下要求使用第三方cookies来管理会话,但由于浏览器政策限制了第三方cookies的使用,Dev需要寻找其他得替代解决方案,比如:
OAuth:对于API调用,OAuth和其他令牌基的认证机制可以用来安全地授权和验证请求,而不依赖于cookies。
PostMessage API:对于在iframes间通讯,可以使用PostMessage API来安全地在不同的域之间传递信息。
Web Storage:利用localStorage或sessionStorage来存储在同一域下的会话数据,虽然这些不适用于跨域。
对于迁移到.net core,需要新的会话管理方法,例如使用基于令牌的认证(如JWT)来替代传统的cookie-based会话。
这些方法比基于URL的会话标识符更安全。
(以上)
针对这个不安全的技术,说一下到底哪儿不安全了。
XSS的问题
All is XSS that comes to the .NET (isec.pl)
场景:
<%@PageLanguage="C#" %>
<!DOCTYPE html>
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="<%=ResolveUrl("~/Script.js") %>"></script>
</head>
<body>
.NET version: <%=Environment.Version%>
</body>
</html>
这段代码将 ~/Script.js
路径转换为特定于服务器的路径。
如果开发者把 Script.js
放在应用程序根目录,并在 A/B/C/default.aspx
文件中使用上述代码片段,那么访问 http://localhost/A/B/C/default.aspx
会渲染为:
<scriptsrc="/Script.js"></script>
这种前提下,引入SessionStateSection.Cookieless Property | Microsoft Learn
ASP.NET通过自动将唯一的会话ID插入页面的URL来维护无Cookie会话状态。
http://www.example.com/(S(X))/index.aspx
这种方法允许即使在用户浏览器不支持或禁用了Cookie的情况下,也能够保持会话状态。
会话ID在每个请求的URL中传递,在服务器端被识别和处理,以便关联到正确的会话数据。
其他的标识符
(A(X))-Anonymous ID
(S(X))-Session ID
(F(X))-FormAuthenticationTicket
Understand How the ASP.NET Cookieless Feature Works | Microsoft Learn
.NET Version | URI |
V1.0, V1.1 | /(XXXXXXXX)/ |
V2.0+ | /(S(XXXXXXXX))/ |
V2.0+ | /(A(XXXXXXXX)F(YYYYYYYY))/ |
V2.0+ | … |
当浏览器处理cookieless 的会话ID时,ASP.NET自动将会话ID插入到每个应用程序路径中,确保会话能够在无Cookie环境中保持一致。
当访问
http://localhost/(A(ABCD))/A/B/C/default.aspx 或者
http://localhost/A/B/C/(A(ABCD))/default.aspx
时,<script src="/(A(ABCD))/Script.js"></script>
中的会话ID-(A(ABCD))
被自动地添加到了Script.js的路径中。
直接修改
http://localhost/A/B/C/(A(%22onerror=%22alert`1`%22))/default.aspx
%22onerror=%22alert`1`%22
"onerror="alert`1`"
IIS Auth Bypass
Cookieless DuoDrop: IIS Auth Bypass & App Pool Privesc in ASP.NET Framework (CVE-2023-36899 & CVE-2023-36560) | Soroush Dalili (@irsdl) Blog
虽然 Cookie 是传输会话 ID 的主要方式,但 .NET Framework 还提供了一种替代方法:直接在 URL 中对会话 ID 进行编码。这种方法对不支持 Cookie 的客户端很有用。
https://[targetdomain]/(S(X))/default.aspx
在 .NET Framework 中称为“Cookieless”功能
search
http_path:"/(S" AND app:"ASP.NET"
搜索
之后利用iis短文件的脚本跑一波
怎么用?
Source Code Disclosure in ASP.NET apps
Source Code Disclosure in ASP.NET apps – PT SWARM (ptsecurity.com)
之前的认证问题
CVE | PoC |
CVE-2023-36899 | /WebForm/(S(X))/prot/(S(X))ected/target1.aspx OR /WebForm/(S(X))/b/(S(X))in/target2.aspx |
CVE-2023-36560 | /WebForm/pro/(S(X))tected/target1.aspx/(S(X))/ OR /WebForm/b/(S(X))in/target2.aspx/(S(X))/ |
当web.config中有
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<modulesrunAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
在开启cookieless之后,加上上面的配置,才会造成这些前提。
http://Y.Y.Y.Y/bin/Navigator.dll - 404
http://Y.Y.Y.Y/(S(x))/b/(S(x))in/Navigator.dll - 200
除了“/bin”之外,其他特殊的.NET文件夹:
/App_Code
/App_WebReferences
/App_GlobalResources
/App_LocalResources
/App_Data
/App_Themes
/App_Browsers
/Themes
/Views
/Models
/Controllers
修复:Microsoft IIS 和 .NET Framework 更新到最新版本。
对于 Windows Server 2019 和 .NET Framework 4.7,KB5034619 补丁目前修复了源代码泄露。
原文始发于微信公众号(wulala520):Cookieless security
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论