架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1428|回复: 2

[资料] ASP.NET Core(二十)预防开放式重定向攻击

[复制链接]
发表于 2023-6-6 21:55:38 | 显示全部楼层 |阅读模式
需求:最近看微软 ASP.NET Core 的文档《预防 ASP.NET Core 中的开放式重定向攻击》,大体意思就是让开发者注意跳转到回调地址的时候要判断是否是本地站点的路径,防止某一些人恶意伪造回调地址进行钓鱼攻击。研究一下代码,准备移植到 ASP.NET MVC 项目里面。

记得某大厂之前就有这个漏洞,一些人利用该漏洞从QQ、微信引流,如下:

QQ截图20230606212557.jpg

利用该漏洞,由于一些聊天工具对大公司域名的信任,导致一些聊天工具无法阻止用户点击链接后访问到恶意网站内容。

什么是开放式重定向攻击?

当用户访问需要身份验证的资源时,Web 应用程序频繁将用户重定向到登录页面。 重定向通常包含一个 returnUrl querystring 参数,以便用户在成功登录后可以返回到最初请求的 URL。 在用户进行身份验证后,他们会被重定向到最初请求的 URL。

攻击示例

恶意用户可以开发一种攻击,旨在让恶意用户能够访问用户的凭据或敏感信息。 为了开始攻击,恶意用户会诱使用户单击指向你的站点登录页面的链接,并将 returnUrl querystring 值添加到该 URL。 以 contoso.com 上的应用为例,该应用在 http://contoso.com/Account/LogOn?returnUrl=/Home/About 包含一个登录页面。 攻击遵循以下步骤:

  • 用户单击恶意链接以 http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (第二个 URL 为“contoso1.com”,而不是“contoso.com”) 。
  • 用户成功登录。
  • 用户被站点重定向到 http://contoso1.com/Account/LogOn(一个看起来与真实站点完全相同的恶意站点)。
  • 用户再次登录(向恶意站点提供凭据)并被重定向回真实站点。
  • 用户可能认为他们的第一次登录尝试失败,第二次尝试成功。 用户很可能仍然不知道他们的凭据已泄露


open-redirection-attack-process.png

除了登录页面,一些站点还提供重定向页面或终结点。 假设你的应用有一个包含开放式重定向的页面 /Home/Redirect。 例如,攻击者可以在电子邮件中创建一个指向 [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login 的链接。 普通用户查看该 URL,会发现它以你的站点名称开头。 出于信任,他们会单击该链接。 然后,开放式重定向会将用户发送到看上去与你的站点相同的钓鱼站点,并且用户可能会登录到他们认为是你的站点的站点。

预防开放式重定向攻击

开发 Web 应用程序时,将所有用户提供的数据视为不可信。 如果应用程序具有基于 URL 内容重定向用户的功能,请确保此类重定向仅在应用本地完成(或重定向到已知 URL,而不是 querystring 中可能提供的任何 URL)。

LocalRedirect

使用 LocalRedirect 基类中的 Controller 帮助程序方法:

如果指定了一个非本地 URL,LocalRedirect 将引发异常。 否则,它的行为与 Redirect 方法相同。异常信息如下:

InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local.
源码如下:

QQ截图20230606213459.jpg QQ截图20230606213545.jpg QQ截图20230606213730.jpg QQ截图20230606214112.jpg

执行流程:LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl,最终,还是会调用 IsLocalUrl 进行判断(UrlHelperFactory 默认实现了 IUrlHelperFactory 接口。 )。

源码地址:https://source.dot.net/#Microsoft.AspNetCore.Mvc.Core/Routing/UrlHelper.cs

IsLocalUrl

IsLocalUrl在重定向之前,使用此方法测试 URL:

代码如下:

测试代码如下:

QQ截图20230606215009.jpg

如果允许跳转到其它域名站点,可以实现 IUrlHelperFactory 接口,在程序启动的时候修改 IServiceCollection 进行替换默认实现类。

参考:https://learn.microsoft.com/zh-cn/aspnet/core/security/preventing-open-redirects?view=aspnetcore-7.0

(完)





上一篇:Docker 基于 Windows 系统构建镜像
下一篇:【转】(MSSQL)SQL Server 数据库 int 和 guid 做主键比较
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-6-6 21:57:12 | 显示全部楼层
ASP.NET Core(十九)使用 BackgroundService 运行后台任务
https://www.itsvse.com/thread-10591-1-1.html

ASP.NET Core(十八)自定义简单的 OutputCache 输出缓存
https://www.itsvse.com/thread-10583-1-1.html

ASP.NET Core(十七)集成 MiniProfile 应用性能分析
https://www.itsvse.com/thread-10571-1-1.html

ASP.NET Core(十六)依赖注入之动态注册服务
https://www.itsvse.com/thread-10560-1-1.html

ASP.NET Core(十五)使用 HttpClient 发送 HTTP 请求
https://www.itsvse.com/thread-10311-1-1.html

ASP.NET Core(十四)基于 SkiaSharp 图片验证码
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core(十三)判断是否是 Ajax 请求
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core(十二)前端 JS、CSS 捆绑和压缩
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET Core(十一)端点路由添加中间件显示所有 DI 服务
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Core(十)Configuration 配置优先级详解
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Core(九) 之 Middleware 中间件详解
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Core(八) 之 Swagger UI 默认参数的坑
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Core(七)深入刨析框架源码
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core(六)DI 手动获取注入对象的方法
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core(五)基于 CAP 分布式事务
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(四)之过滤器统一 ModelState 模型验证
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core(三)使用 ActivatorUtilities 动态创建实例
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core(二)通过代码自重启应用
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core(一)使用 Redis 缓存
https://www.itsvse.com/thread-9393-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-6-6 22:01:21 | 显示全部楼层
IsLocalUrl 方法移植到 .NET framework 中代码如下:

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 14:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表