如何判斷目標站點是否為Django開發
老文一篇,幾個月以前發在【代碼審計】小密圈里的文章,當時是寫一個系列(Django安全漫談),抽出其中的一部分,分享一下。
在黑盒測試的情況下,如何判斷一個站是否是Django開發的?以下這些方法,很多都能在我的博客(?https://www.leavesongs.com?)得到印證。
利用Debug模式異常頁面判斷
DEBUG模式開啟時,訪問不存在的頁面或出錯的頁面會有特殊的異常拋出。像這樣的頁面,就可以確定是Django
訪問一個包含表單的頁面,表單中會有一個隱藏的input,用來做CSRF檢測的Token,其名字比較獨特,csrfmiddlewaretoken:
遇到有這個名字的表單,基本可以確定是Django。
假如開發者將?csrfmiddlewaretoken
?這個名字換了,怎么辦?
隨便向目標的某個頁面POST一個數據包,因為缺少CSRF TOKEN,如果目標網站是Django,它將給你一個頗具其特色的錯誤頁面:
Django默認安裝后會自帶一個后臺,地址是/admin(不過大多數網站會替換后臺地址):
遇到這個樣式的后臺界面,可以確定是Django。
有的Django站點會返回Server頭:
雖然不能100%確定是Djnago,但范圍就縮的很小了。
有些細節雖然不能100%確定是django,但多個細節組成在一起就可以基本確定了。
比如,Django輸出的html中通常會有很多空白行,因為這些位置放的是邏輯語句,Django不像jinja2中會提供?{%-
?這樣清除空白行的方法:
再比如,Django默認找回密碼的鏈接是?/password_reset/
?,郵件發送成功是?/password_reset/done/
?,找回密碼鏈接是?reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/
?,找回密碼成功是?/reset/done/
?,正常修改密碼是?/password_change/
?,修改成功是?/password_change/done/
?。
不過這些鏈接都可以改,只能用作參考。
再比如,django文件上傳的目錄通常叫?media
?,注冊時密碼要求8位以上數字加字母,分頁通常是??page=2
?而不會是?/page/2/
?,表單輸入框的id通常是?id_xxxx
?,中文的情況下還會有一些特定的翻譯語句,如?請上傳一張有效的圖片。您所上傳的文件不是圖片或者是已損壞的圖片。
?、?CSRF驗證失敗. 相應中斷.
?等。
通過一些第三方模塊的特點判斷
Django之所以好用,因為其代碼耦合性很低,所以有豐富的第三方模塊可以直接使用。通過這些模塊的特點也能判斷目標網站是否是Django。
常用的第三方模塊有django-rest-framework、django-debug-toolbar、django-bootstrap3、django-filter、django-cron、django-allauth、django-simple-captcha等。
比如,django-rest-framework默認包含一個登陸頁面,?/api-auth/login/
?:
再比如,django-simple-captcha生成的驗證碼會包含一個名字是?captcha_0
?,值為40位hex的隱藏輸入框。
這些第三方庫的特點也可以輔助你判斷,就是需要收集與細心觀察了。
必殺技:用靜態文件分析
有的網站可能修改了Django的后臺地址,但Django后臺所使用的靜態文件地址通常沒有修改,也較難修改。訪問這些靜態文件地址,看看內容是否是Django的這一套,就可以確定目標是否為Django:
如?https://www.leavesongs.com/static/admin/css/dashboard.css?、?http://www.wuzheng.org/static/admin/css/dashboard.css?、?http://static.fuwo.com/static/admin/css/dashboard.css?、?http://www.lintcode.com/static/admin/css/dashboard.css
我就不羅列了。
但這個方法有個局限,如果目標網站沒有使用Django自帶的django-admin(未將其包含在settings.py的INSTALLED_APPS中),就沒有這個靜態文件了。