前言
下午收到公司一条漏洞工单标题是:www.xxx.com存在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跳转漏洞远离及绕过
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!