作者:phith0n@长亭科技
在黑盒测试的情况下,如何判断一个站是否是 Django 开发的?以下这些方法,很多都能在我的博客得到印证。
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 中),就没有这个静态文件了。