简介:
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.CommonMiddleware
且 APPEND_SLASH
为 True
时漏洞就会触发,而这两个配置时默认存在的,而且 APPEND_SLASH
不用显示写在 setting
文件中的。 CommonMiddleware
是 Django
中一个通用中间件,实质上是一个类,位于 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跳转.
升级补丁