15 - vulhub - Django < 2.0.8 任意URL跳转漏洞(CVE-2018-14574)

漏洞名称:Django < 2.0.8 任意URL跳转漏洞

简介:

Django默认配置下,如果匹配上的URL路由中最后一位是/,而用户访问的时候没加/,Django默认会跳转到带/的请求中。(由配置项中的django.middleware.common.CommonMiddleware、APPEND_SLASH来决定)。

在path开头为//example.com的情况下,Django没做处理,导致浏览器认为目的地址是绝对路径,最终造成任意URL跳转漏洞。

该漏洞利用条件是目标URLCONF中存在能匹配上//example.com的规则。

什么是任意 URL 跳转?

服务端未对传入的跳转url变量进行检查和控制,可能导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站。
由于是从可信的站点跳转出去的,用户会比较信任
假如http://www.aaa.com/acb?Url=http://www.zhapian.com
(只要将该链接发给用户诱导其点击,即可实现漏洞目的)

影响版本

1.11.0 <= version < 1.11.15

2.0.0 <= version < 2.0.8

漏洞原理

Django的配置下,如果匹配上的URL路由中最后一个是/,而用户访问的时候没加/,则Django的配置会转移到带/的请求中。(由配置项中的django.middleware.common.CommonMiddleware,APPEND_SLASH来决定)。

也就是说当setting中配置了django.middleware.common.CommonMiddleware且

APPEND_SLASH为True时漏洞就会触发,而这两个配置时默认存在的

漏洞复现

环境准备

靶机环境   139.196.87.102  (vulhub)
攻击机环境  192.168.8.137  (虚拟机 Ubuntu 、Java1.8、Burp)

启动 Django < 2.0.8 任意URL跳转漏洞 环境

1.进入 vulhub 的 Django < 2.0.8 任意URL跳转漏洞 路径
cd /usr/local/tools/vulhub/django/CVE-2018-14574

2.编译并启动环境
docker-compose up -d

3.查看环境运行状态
docker ps | grep vulhub

在这里插入图片描述


访问 8000 端口


在这里插入图片描述


漏洞利用

只要在url后加上 // 想跳转的网页,即可实现跳转


在这里插入图片描述


在这里插入图片描述



漏洞分析

setting 中配置了 django.middleware.common.CommonMiddlewareAPPEND_SLASHTrue 时漏洞就会触发,而这两个配置时默认存在的,而且 APPEND_SLASH 不用显示写在 setting 文件中的。 CommonMiddlewareDjango 中一个通用中间件,实质上是一个类,位于 site-packages/django/middleware/common.py ,会执行一些HTTP请求的基础操作.

- Forbid access to User-Agents in settings.DISALLOWED_USER_AGENTS

- URL rewriting: Based on the APPEND_SLASH and PREPEND_WWW settings,
append missing slashes and/or prepends missing "www."s.

  - If APPEND_SLASH is set and the initial URL doesn't end with a
    slash, and it is not found in urlpatterns, form a new URL by
    appending a slash at the end. If this new URL is found in
    urlpatterns, return an HTTP redirect to this new URL; otherwise
    process the initial URL as usual.

This behavior can be customized by subclassing CommonMiddleware and
overriding the response_redirect_class attribute.

- ETags: If the USE_ETAGS setting is set, ETags will be calculated from
the entire page content and Not Modified responses will be returned
appropriately. USE_ETAGS is deprecated in favor of
ConditionalGetMiddleware.

而漏洞就与 URL rewriting 有关:如果设置了 APPEND_SLASH=True 并且初始URL 没有以斜杠结尾,并且在 urlpatterns 中找不到它,则通过在末尾附加斜杠来形成新的 URL 。如果在 urlpatterns 中找到此新 URL ,则将 HTTP 重定向返回到此新 URL。换句话说就是对那些末尾没加 /url 自动填补 / 然后重新发起请求。

但是当发起当发起类似这样的请求 http://127.0.0.1:8000//baidu.com 程序就会进行设定的跳转,首先会执行 process_request() 函数,在61行进入
get_full_path_with_slash() 函数.


在这里插入图片描述


这个函数的作用就是get_full_path()函数给path末尾加上斜杠


在这里插入图片描述


返回的 new_path就是 //baidu.com/ ,然后在68行进入 HttpResponseRedirectBase这个类,它是HTTP跳转的一个基类.


在这里插入图片描述


虽然类的初始化函数里 (409行) 有对协议的检查,但是 scheme 根本就不存在,所以会跳过这个判断。


在这里插入图片描述


在往后就是正常的301跳转.


在这里插入图片描述



修复建议

升级补丁

猜你喜欢

转载自blog.csdn.net/weixin_42250835/article/details/121008299