安全矩阵

 找回密码
 立即注册
搜索
查看: 650|回复: 0

渗透测试中的 URL 重定向

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2023-2-13 21:21:40 | 显示全部楼层 |阅读模式
本帖最后由 luozhenni 于 2023-2-13 21:21 编辑


渗透测试中的 URL 重定向
原文链接:渗透测试中的 URL 重定向
原创 xazlwiki 信安之路  2023-02-13 08:53 发表于山西
本文为信安之路内部 wiki 第 144 篇文章,注册解锁全部文章
开放重定向(Open Redirect),也叫URL跳转漏洞,是指服务端未对传入的跳转url变量进行检查和控制,导致诱导用户跳转到恶意网站,由于是从可信的站点跳转出去的,用户会比较信任。
渗透测试中的 URL 重定向
常见的 URL 重定向漏洞都比较明显,但是也有少数例外,这里总结了三种常见的 URL重定向类型。
类型一:基于参数的 URL 重定向
这是最常见的,通过修改参数中的跳转地址,查看是否重定向到我们指定的页面,比如:
编辑
类型二:恢复原访问页导致的重定向
通常为了提高用户的体验,在用户登录之后,往往会跳转至原来的访问页面,比如:
https://example.com/login?returnUrl=/dashboard
登录之后会跳转至 /dashboard,并且是以登录后的身份,这时我们可以测试是否会跳转目标以外的网站,比如:
https://example.com/login?returnUrl=https://www.xazlsec.com
如果登录成功之后,跳转至信安之路的网站,那么该漏洞就存在。
类型三:基于 html 标签的 URL 跳转
实现 URL 重定向,除了在 header 中设置 Location 字段外,还有两种实现方式:
1、Meta 标签,代码如下:
<head>  <meta http-equiv="Refresh" content="0; URL=https://example.com/" /></head>
2、javaScript 代码:
window.location = "https://example.com/";
如果是这两种方式实现 URL 跳转,而 URL 参数可控,则可能存在 XSS 漏洞。
类型四:基于 DOM 的 URL 重定向
JavaScript 可以直接从浏览器获取数据。Web 浏览器中的 URL,例如:
https://example.com/#dashboard
dashboard 不会被发送至后端,如果页面中使用如下 JavaScript 代码:
// use substr() to remove the '#
'window.location = window.location.hash.substr(1)
攻击者可以创建如下链接:
https://example.com/#https://www.xazlsec.com
访问之后将跳转至信安之路的网站。

URL 重定向漏洞修复
方案一:URL 白名单
可以将需要跳转的页面,保存至数据库,然后用对应的 id 进行跳转,比如:
  1. https://example.com/redirect?externalPage=1
  2. https://example.com/redirect?externalPage=2
  3. https://example.com/redirect?externalPage=3
复制代码

如果只是重定向到本网站的页面,可以使用页面命名方案,比如:
  1. https://example.com/redirect?page=dashboard
  2. https://example.com/redirect?page=account
  3. https://example.com/redirect?page=settings
复制代码
方案二:正则表达式
正则表达式的方案,无需操作数据库,但是设置不好容易被绕过,比如下面的案例:
  1. redirect_url = urlparse.urlparse(url)
  2. # 漏洞参数原因,仅匹配 url前缀
  3. if bool(re.search("^https://example.com", url)):
复制代码
只是搜索 url 中是否包含 https://example.com 且以它为开头,可以用下面的 poc 绕过:
  1. https://example.com/redirect?page=https://example.com.evil-hackers.corp.com
复制代码
要使用正则表达式,使用尾部斜杠以防止恶意使用子域:
  1. redirect_url = urlparse.urlparse(url)
  2. #修复后,限定完整域名
  3. if bool(re.search("^https://example.com/", url)):
复制代码
这样就确保不会重定向到设置之外的域。
方案三:任意 URL 跳转功能
有些功能设计之初就是为了能够跳转至任意网站,比如一些推广功能,这种情况下,最基本的也要对跳转的协议做限制,比如只允许跳转以 https?:// 开头的网站。
在跳转至外部网站时,设置提示,提醒用户,比如:
编辑
总结
URL 重定向本身并不是坏事,但您必须采取措施确保用户都知道发生的外部重定向,并在必要时尽量减少重定向到的目标。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 00:54 , Processed in 0.017207 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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