目录
前段时间在面试时,问到了URL跳转漏洞,我没有回答好,下午把URL跳转漏洞学习了,发现也不难,看来还需要学习的东西很多呀,这里我再vulhub靶场中找到一个Django的URL跳转漏洞,刚好来练习一下
Django介绍
Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发。以下内容简要介绍了如何使用 Django 实现一个数据库驱动的网络应用。
URL跳转漏洞介绍
URL跳转漏洞,也叫开放重定向漏洞(open redirect) 。
WE-601对该漏洞的描述为:http 参数可能包含一个 URL 值,并可能导致 Web 应用程序将请求重定向到指定的 URL。
通过修改恶意站点的 URL 值,攻击者可能成功发起网络钓鱼诈骗并窃取用户凭据。
简单说来就是参数可控导致的漏洞产生。
可能产生的位置:
- **用户登录、统一身份认证、认证完进行跳转。**
- **用户分享、收藏内容跳转。**
- **跨站点认证、授权后。**
- **站内其它链接跳转。**
- **注册、注销、修改密码等。**
- **账户切换、保存设置。**
产生的原因:
1. 代码层忽视URL跳转漏洞,或不知道/不认为这是个漏洞;
2. 代码层过滤不严,用取子串、取后缀等方法简单判断,代码逻辑可被绕过;
3. 对传入参数操作(剪切/拼接/重组)和判断不当,导致绕过;
4. 原始语言自带的解析URL、判断域名的函数库出现逻辑漏洞或者意外特性;
5. [服务器]/[容器]特性、浏览器等对标准URL协议解析处理等差异性导致被绕过;
Django任意URL跳转漏洞介绍
Django默认配置下,如果匹配上的URL路由中最后一位是/,而用户访问的时候没加/,Django默认会跳转到带/的请求中。
(由配置项中的django.middleware.common.CommonMiddleware
、APPEND_SLASH
来决定)。
在path开头为//example.com
的情况下,Django没做处理,导致浏览器认为目的地址是绝对路径,最终造成任意URL跳转漏洞。
该漏洞利用条件是目标URLCONF
中存在能匹配上//example.com
的规则。
环境搭建
移动到如下目录中:
/opt/vulhub-master/django/CVE-2018-14574
使用docker-compose up -d来拉取环境
然后我们可以在浏览器中访问一下
可以看到页面打印了hello word,那么下面我们可以传入一个外部URL试试看
可以看到没有反应,但是当我们去除掉www.baidu.com后面的/后
成功的跳转到了百度页面,这里如果我们将跳转的页面设置为一个钓鱼的页面,发送给其他人,是不是就可以成功的获取到其他人的敏感信息了
漏洞产生的原因上面也言简意赅的说明了,在path开头为//example.com
的情况下,Django没做处理,导致浏览器认为目的地址是绝对路径,最终造成任意URL跳转漏洞。
防御方法
1、最有效的方法之一就是使用白名单严格控制将要跳转的域名,如:
function checkURL ( sURL) {
return(/^(https?:\/\/)?[\w-.]+.(yourDomainA|yourDomainB|yourDomainC).com($|\/|)/i).test(sUrl)||(/^\w+$/i).test(sUrl)||(/^[\/][^\/]/i).test(sUrl)? true : false;}
2、限制referer、添加token,这样可以避免恶意用户构造跳转链接进行散播;
参考文章:
https://github.com/vulhub/vulhub/blob/master/django/CVE-2018-14574/README.zh-cn.md