按 Enter 到主內容區
:::

TWCERT-電子報

:::

網站開發應用框架Django,恐被用以發動Open Redirect攻擊

發布日期:
字型大小:
  • 發布單位:TWCERT/CC
  • 更新日期:2019-04-03
  • 點閱次數:852
網站開發應用框架Django,恐被用以發動Open Redirect攻擊

CVE編號

CVE-2018-14574

內文

●概述:
由Python寫成的Django,是開放原始碼的Web應用框架,採用了MVT(Model、View、Template)軟體設計模式,其核心框架包括Web伺服器、內建分發系統、表單序列化及驗證系統,並支援中介軟體,因為每個網站總有同質性基本需求:用戶註冊、後台、表單等,憑藉Django,開發者毋須重複製造相同模組,僅需專注設計專屬程式,經測試得知,Django在APPEND_SLASH參數與django.middleware.common.CommonMiddleware元件同步運行時,預設作用可將request內URL字串自動轉向末尾附加斜線號 / 之網址,攻擊者利用該普遍特性,以社交工程伎倆誘騙受害者誤點惡意鏈結,而惡意URL未被攔截,將導向駭客控制網站,遂行釣魚或詐騙,Django軟體基金會已公告各版本修補檔及升級軟體。
●編註:
(1)弱點條件
在Django軟體內,參數APPEND_SLASH為boolean資料型態,SLASH意即除號、斜線,當參數APPEND_SLASH = True時,其作用是自動於網址末附加 / 符號,也就是所輸入的URL請求字串,若不匹配URLconf中任一已知URL樣式,且結束字元非斜線 / ,則直接重新導向至相同字串末尾加上 / 的URL,以下列python程式為例:

urls.py:
--------
from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',('^hello/$', hello),)

因patterns()函數定義,發現吻合hello樣式字串,則轉換成 hello/ 結尾,故輸入網址 http://example.com/hello,將自動導向 http://example.com/hello/ ,然而當APPEND_SLASH = False時,連線 http://example.com/hello 將會返回 404錯誤訊息。
原本Django之專案主設定檔settings.py預設並無APPEND_SLASH參數,但安裝CommonMiddleware中介軟體元件後,APPEND_SLASH設定項目才生效,且預設值為True,而APPEND_SLASH與django.middleware.common.CommonMiddleware兩者同步運作時,重導向效果始得存在,也讓攻擊者伺機利用Open Redirect特性。

(2)探勘方式
前段介紹Django在django.middleware.common.CommonMiddleware元件及APPEND_SLASH參數皆啟用時,Open Redirect方可生效,但重新導向本來就是正常功能,開發者建立新blog專案,幾乎都設定URL樣式能接受網址以斜線結尾,畢竟多數CMS皆如此,而遠端駭客能成功探勘的實際癥結,在於輸入URL字串未受檢驗,只要採取社交工程手段,誘騙受害者在毫無戒心狀態,誤點惡意link,則逕轉向至某個 / 結尾之惡意URL,衍生後續釣魚或詐騙事件。

影響產品

Django 1.11.15之前版本 /Django 2.0.8之前版本/ Django 2.1版

解決辦法

1)針對既有版本修補:
Django master系列,參考https://github.com/django/django/commit/a656a681272f8f3734b6eb38e9a88aa0d91806f1
Django 2.1系列,參考https://github.com/django/django/commit/c4e5ff7fdb5fce447675e90291fd33fddd052b3c
Django 2.0系列,參考https://github.com/django/django/commit/6fffc3c6d420e44f4029d5643f38d00a39b08525
Django 1.11系列,參考https://github.com/django/django/commit/d6eaee092709aad477a9894598496c6deec532ff
(2)取得升級版
下載Django 1.11.15版壓縮檔,連結https://www.djangoproject.com/m/releases/1.11/Django-1.11.15.tar.gz
下載Django 2.0.8版壓縮檔,連結https://www.djangoproject.com/m/releases/2.0/Django-2.0.8.tar.gz
Django 2.1.x仍需等待。
回頁首