如何判斷目標(biāo)站點(diǎn)是否為Django開發(fā)
老文一篇,幾個(gè)月以前發(fā)在【代碼審計(jì)】小密圈里的文章,當(dāng)時(shí)是寫一個(gè)系列(Django安全漫談),抽出其中的一部分,分享一下。
在黑盒測(cè)試的情況下,如何判斷一個(gè)站是否是Django開發(fā)的?以下這些方法,很多都能在我的博客(?https://www.leavesongs.com?)得到印證。
利用Debug模式異常頁(yè)面判斷
DEBUG模式開啟時(shí),訪問不存在的頁(yè)面或出錯(cuò)的頁(yè)面會(huì)有特殊的異常拋出。像這樣的頁(yè)面,就可以確定是Django

訪問一個(gè)包含表單的頁(yè)面,表單中會(huì)有一個(gè)隱藏的input,用來(lái)做CSRF檢測(cè)的Token,其名字比較獨(dú)特,csrfmiddlewaretoken:

遇到有這個(gè)名字的表單,基本可以確定是Django。
假如開發(fā)者將?csrfmiddlewaretoken
?這個(gè)名字換了,怎么辦?
隨便向目標(biāo)的某個(gè)頁(yè)面POST一個(gè)數(shù)據(jù)包,因?yàn)槿鄙貱SRF TOKEN,如果目標(biāo)網(wǎng)站是Django,它將給你一個(gè)頗具其特色的錯(cuò)誤頁(yè)面:

Django默認(rèn)安裝后會(huì)自帶一個(gè)后臺(tái),地址是/admin(不過大多數(shù)網(wǎng)站會(huì)替換后臺(tái)地址):

遇到這個(gè)樣式的后臺(tái)界面,可以確定是Django。
有的Django站點(diǎn)會(huì)返回Server頭:

雖然不能100%確定是Djnago,但范圍就縮的很小了。
有些細(xì)節(jié)雖然不能100%確定是django,但多個(gè)細(xì)節(jié)組成在一起就可以基本確定了。
比如,Django輸出的html中通常會(huì)有很多空白行,因?yàn)檫@些位置放的是邏輯語(yǔ)句,Django不像jinja2中會(huì)提供?{%-
?這樣清除空白行的方法:

再比如,Django默認(rèn)找回密碼的鏈接是?/password_reset/
?,郵件發(fā)送成功是?/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
?,注冊(cè)時(shí)密碼要求8位以上數(shù)字加字母,分頁(yè)通常是??page=2
?而不會(huì)是?/page/2/
?,表單輸入框的id通常是?id_xxxx
?,中文的情況下還會(huì)有一些特定的翻譯語(yǔ)句,如?請(qǐng)上傳一張有效的圖片。您所上傳的文件不是圖片或者是已損壞的圖片。
?、?CSRF驗(yàn)證失敗. 相應(yīng)中斷.
?等。
通過一些第三方模塊的特點(diǎn)判斷
Django之所以好用,因?yàn)槠浯a耦合性很低,所以有豐富的第三方模塊可以直接使用。通過這些模塊的特點(diǎn)也能判斷目標(biāo)網(wǎng)站是否是Django。
常用的第三方模塊有django-rest-framework、django-debug-toolbar、django-bootstrap3、django-filter、django-cron、django-allauth、django-simple-captcha等。
比如,django-rest-framework默認(rèn)包含一個(gè)登陸頁(yè)面,?/api-auth/login/
?:

再比如,django-simple-captcha生成的驗(yàn)證碼會(huì)包含一個(gè)名字是?captcha_0
?,值為40位hex的隱藏輸入框。
這些第三方庫(kù)的特點(diǎn)也可以輔助你判斷,就是需要收集與細(xì)心觀察了。
必殺技:用靜態(tài)文件分析
有的網(wǎng)站可能修改了Django的后臺(tái)地址,但Django后臺(tái)所使用的靜態(tài)文件地址通常沒有修改,也較難修改。訪問這些靜態(tài)文件地址,看看內(nèi)容是否是Django的這一套,就可以確定目標(biāo)是否為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

我就不羅列了。
但這個(gè)方法有個(gè)局限,如果目標(biāo)網(wǎng)站沒有使用Django自帶的django-admin(未將其包含在settings.py的INSTALLED_APPS中),就沒有這個(gè)靜態(tài)文件了。