返回顶部
首页 > 资讯 > 精选 >任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑
  • 474
分享到

任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑

2023-06-17 07:06:00 474人浏览 泡泡鱼
摘要

任意URL跳转漏洞怎样修复与jdk中getHost()方法之间的坑,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。任意URL跳转漏洞服务端未对传入的跳转url变量

任意URL跳转漏洞怎样修复与jdk中getHost()方法之间的坑,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

任意URL跳转漏洞

服务端未对传入的跳转url变量进行检查和控制,导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站。由于是从可信的站点跳转出去的,用户会比较信任,所以跳转漏洞一般用于钓鱼攻击,通过转到恶意网站欺骗用户输入用户名和密码盗取用户信息,或欺骗用户进行金钱交易。

修复该漏洞最有效的方法之一就是校验传入的跳转url参数值,判断是否为预期域名。在java中可使用下列方法:

String url = request.getParameter("returnUrl"); String host = ""; try {     host = new URL(url).getHost(); } catch (MalfORMedURLException e) {     e.printStackTrace(); } if host.endsWith(".bbb.com"){     //跳转 }else{     //不跳转,报错 }

上述代码中主要校验了客户端传来的returnUrl参数值,使用java.net.URL包中的getHost()方法获取了将要跳转url的host,判断host是否为目标域,上述代码中限制了必须跳转到xxx.bbb.com的域名,从而排除了跳转到不可信域名的可能。

但是,getHost()方法真的靠谱吗??

getHost()方法的坑之一

可以被反斜线绕过,即returnUrl=Http://www.aaa.com\www.bbb.com会被代码认为是将要跳转到bbb.com,而实际在浏览器中反斜线被纠正为正斜线,跳转到www.aaa.com/www.bbb.com,最终还是跳到www.aaa.com的服务器

使用下列代码进行测试

public class Main {      public static void main(String[] args) {         String url = "https://www.aaa.com\\www.bbb.com?x=123";         String host = "";         try {             host = new URL(url).getHost();         } catch (MalformedURLException e) {             e.printStackTrace();         }         System.out.println("host---"+host);         System.out.println("url---"+url);     } }

url参数的域名getHost()之后是www.aaa.com还是www.bbb.com呢?打印结果如下:

任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑

该结果会被endsWith(“.bbb.com”)方法判断为真,从而成功执行跳转,但实际在浏览器中跳转到了www.aaa.com网站。

getHost()方法的坑之二

getHost()方法的结果在不同JDK版本中对井号#的处理结果不同,通常井号被用作页面锚点,对于https://www.aaa.com#www.bbb.com?x=123这个url,较高版本的JDK中,取出结果为www.aaa.com,低版本中为www.aaa.com#www.bbb.com,从而低版本又可绕过endsWith(“.bbb.com”)方法,成功跳转。

这里所说的高版本指的是java version 1.8.0_181或者java version  1.7.0_161中的181和161,与JDK7还是8无关。可能java在某个时间集中修复了JDK6/7/8中的URL库。

测试过程中发现1.6.0_45,1.7.0_71,1.8.0_25均可被#绕过,即不同的JDK中低版本均存在问题。

通过对比rt.jar---java---net--URLStreamHandler.java代码(低版本为左边,高版本为右边)找到问题所在如下图所示,代码中的start为url中冒号位置,limit为url中井号位置:

任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑

从代码中可以发现,低版本中未考虑到一个完整url中斜线/或者问号?之前会出现井号#的情况,如果url中有斜线/或者问号?,取host就以斜线或者问号为终止,即使中间包含井号也不处理;而高版本中进行了井号位置的判断,排除了使用井号绕过的可能。但是线上生成环境的JDK版本又不是敢随便乱升级的,只能从代码里提前预防。

下图为使用不同版本JDK测试的结果:

同一段代码在不同JDK版本中打印出的host值不同,在低版本中包含了井号及其后边的部分。

任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑

任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑

综合上述两个坑,若想使用getHost()来修复任意URL跳转漏洞,需要考虑到反斜线和井号绕过,可使用如下代码:

String url = request.getParameter("returnUrl"); String host = ""; try {     urlurl = url.replaceAll("[\\\\#],"/"); //替换掉反斜线和井号     host = new URL(url).getHost();   } catch (MalformedURLException e) {     e.printStackTrace(); } if host.endsWith(".bbb.com"){     //跳转 }else{     //不跳转,报错 }

附送一个真实例子

该站可使用井号配合斜线或者问号来绕过域名检测,即将target设置为URL编码后的https://www.baidu.com#www.bbb.com?x=123,该站即可302跳转到百度。

任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑

本文链接: https://lsjlt.com/news/287609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑
    任意URL跳转漏洞怎样修复与JDK中getHost()方法之间的坑,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。任意URL跳转漏洞服务端未对传入的跳转url变量...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作