【安全系列】XXX域名存在URL任意跳转漏洞

前言

刚收到公司一条漏洞工单标题是:www.xxx.com存在URL任意跳转漏洞

你有一个漏洞工单【XXXX】需要确认,请点击下方链接确认漏洞。若不认为漏洞归属自己可驳回或转派。

规定修复时间为: 2021-04-01 16:27:16

漏洞标题: www.xxx.com存在URL任意跳转漏洞
风险描述: 应用程序未限制可跳转的URL格式和范围,导致存在未验证的任意URL跳转漏洞。利用此漏洞,攻击者可以随意定义将跳转的URL,这可能导致挂马攻击、钓鱼攻击等等,危害很大。

漏洞级别: 低危

定睛一看问题出现在我负责的项目的用户登录授权接口上。 链接参数中含有returnUrl(登入成功后返回的页面)。其中未做域名限定处理导致。

emmm~因为代码在后端,立马对接给相应后端开发去处理啦~

内心OS(WTF? URL任意跳转漏洞是什么?!!怎么预防处理?赶紧学习普及一下!)

URL跳转漏洞原理与加固方案

什么是URL跳转漏洞?

URL跳转攻击(URL Redirection),Web业务系统接收到用户提交的URL参数后,未对URL参数进行“可信URL”校验,就向用户浏览器返回跳转到该URL。

URL跳转漏洞危害

如果 hecate.vip域名下某个Web业务系统存在URL跳转漏洞,攻击者向用户发送一个存在URL跳转的链接,该链接跳转到钓鱼网站页面,可能回导致用户被钓鱼攻击。

URL跳转原理

后台通过GET或是POST的方式接收url中的参数,并作为302,301等重定向跳转的地址填入响应头的location字段中,或使用js代码进行跳转,meta标签内跳转等。

输入点:

  • url中的参数
  • post请求提交的数据

输出点:

  • header中的location字段中。(可能有CRLF注入的危险,注入头部信息或内容部分)
  • meta标签的url参数中
  • 后台逻辑跳转中
  • 网页js代码中(可能导致js代码注入问题)
URL重定向(301/302)

301重定向:当域名或者网址永久弃用后,为了方便可以将此域名重定向到新的域名或URL。

302重定向:当域名或网址临时弃用时,为了方便可以将此域名重定向到新的域名或URL。

302URL劫持与302任意URL跳转的不同点:

  • 302URL劫持:是由于搜索引擎的算法导致的问题。例如:A网站暂时弃用,要302重定向到B网站,但是由于B网站URL太过复杂,而搜索引擎的算法判定A网站更加适合,所以爬取的还是A网址,这个时候访问网站显示的URL是A网站的,而显示的内容是B网站,造成了302重定向 — URL劫持。
  • 302任意URL跳转:是用户可以直接控制URL跳转的参数或者通过一些绕过方式控制URL跳转的位置造成的问题。

通常发生URL跳转漏洞的地方以及参数

发生原因

web站点或者第三方的服务端没有对用户输入的参数进行合法性校验,或者校验不严格,在URL跳转时用户可控,导致恶意参数的传入以及执行,将应用程序引导到恶意的第三方区域产生的安全问题(短链接更加难以防范)。

常见节点:
  • 用户登录、统一身份认证处,认证完成后会跳转
  • 用户分享、收藏内容后,会跳转
  • 跨站点认证、授权后,会跳转
  • 站内点击其他网站地址时,会跳转
常见参数:
  • redirect
  • redirect_to
  • redirect_url
  • url
  • jump
  • jump_to
  • target
  • to
  • link
  • linkto
  • domain

几种和框架版本常见的URL跳转代码

//Java
response.sendRedirect(request.getParameter("url"));
//PHP:
$redirect_url = $_GET['url'];
header("Location: " . $redirect_url);
.NET:
string redirect_url = request.QueryString["url"];
Response.Redirect(redirect_url);
Django:
redirect_url = request.GET.get("url")
HttpResponseRedirect(redirect_url)
Flask:
redirect_url = request.form['url']
redirect(redirect_url)
Rails:
redirect_to params[:url]

URL跳转漏洞防御处理

  • 1、判断用户传染的URL参数是否为【mydomain】(网站域)的URL
String url = request.getParameter("url");

if(!url.startsWith("http://") && !url.startsWith("https://")){

url = "http://" + url;

}

String host = "";

String tempUrl=url;//临时变量做替换后判断,跳转任然用url

try {

    tempUrl = tempUrl.replaceAll("[\\\\#]","/"); //替换掉反斜线和井号
    
    host = new URL(tempUrl).getHost();

} catch (MalformedURLException e) {

    e.printStackTrace();

}

if host.endsWith(".mydomain.com"){

//跳转到 url

}else{

//不跳转,报错

}
  • 2、代码固定跳转地址,不让用户控制变量
  • 3、跳转目标地址采用白名单映射机制
  • 4、合理充分的校验跳转的目标地址,非己方地址时告知用户跳转风险。

延展阅读

感兴趣的同学可以继续阅读以下几篇带有实操案例的文章~
URL跳转漏洞

URL跳转漏洞远离及绕过

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值