Django 任意url跳转漏洞(CVE-2018-14574)
什么是任意url跳转漏洞:
服务端未对传入的跳转url变量进行检查和控制,可能导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站。
由于是从可信的站点跳转出去的,用户会比较信任
假如http://www.aaa.com/acb?Url=http://www.zhapian.com
(只要将该链接发给用户诱导其点击,即可实现漏洞目的)
漏洞危害:
通过转到恶意网站欺骗用户输入用户名和密码盗取用户信息
或欺骗用户进行金钱交易
漏洞原因:
Django的配置下,如果匹配上的URL路由中最后一个是/,而用户访问的时候没加/,则Django的配置会转移到带/的请求中。(由配置项中的django.middleware.common.CommonMiddleware,APPEND_SLASH来决定)。
也就是说当setting中配置了django.middleware.common.CommonMiddleware且
APPEND_SLASH为True时漏洞就会触发,而这两个配置时默认存在的
漏洞复现:
vulhub目录在
cd vulhub/django/CVE-2018-14574
对靶场进行编译:docker-compose build
运行靶场:docker-compose up -d
环境开启后,进攻复现
只要在url后加上//想跳转的网页,即可实现跳转,比如中国黑客联盟网页
192.168.0.99:8000//www.chinahacker.com
连接点击后即可实现跳转
抓包分析:因为漏洞环境开启端的是8000端口,所以burp要设置监听8000端口
原本页面的包
加上text请求后发送
如果漏洞存在的话,说明APPEND_SLASH=True并且初始URL没有以斜杠结尾,并且在urlpatterns中找不到它,则通过在末尾附加斜杠来形成新的URL。如果在urlpatterns中找到此新URL,则将HTTP重定向返回到此新URL。
换句话说就是对那些末尾没加/的url自动填补/然后重新发起请求 所以如果在末尾加上了/是不会跳转成功的
访问http://我靶机IP:8000// www.chinahacker.com,即可返回是301跳转码
修复建议:
进行官方升级