用户
搜索

该用户从未签到

i春秋作家

Rank: 7Rank: 7Rank: 7

1

主题

1

帖子

10

魔法币
收听
0
粉丝
0
注册时间
2018-2-27

春秋文阁i春秋签约作者

发表于 2018-2-28 10:00:09 315338

来支持一下蛋总。我看了一下,自己的写的文章,大部分坛子这边已经转过来了。就放一个自己开发的工具吧~ 怎么使用,有几个视频大家可以看一下,可能需要翻墙。对python感兴趣的朋友们可以看看代码,有几个 utils 能帮助大家不少忙。 请大家多多指教!

博客地址: http://blog.neargle.com/2018/01/29/ver-observer-a-tool-about-version-detection/

项目地址: https://github.com/neargle/ver-observer

用最著名的文学情感类博客测试一下, 看看效果。请大家测试的时候请参照这个 视频,自己搭建 django 环境,不要浪费博主的流量,谢谢。

<!-- more -->

简介

这个工具可以用来检测网站上所使用到的框架,依赖或者CMS的版本。以 Django 为例,如果我们知道一个网站是由 Django 开发的,那么知道所用的 Django 版本可以定位一些可能存在的问题, 例如,使用版本小于 Django v1.10.7 的网站很有可能存在任意URL跳转漏洞(详情见: 文章)。

原则上,这个工具实现了一个较为通用的检测方法和较为方便的指纹生成。但是在有些框架和依赖里并不适用。

使用方法

几个探测 Django 版本的例子

for django v2.0.1:

python vobserver.py -u https://www.xxx.com/ -d django

for django v1.9:

python vobserver.py -u https://www.xxx.com/ -d django -v

一个更加浅显易懂的视频(可能需要翻墙),从头新建一个 Django 网站,并使用 ver-server 探测 Django 版本。

asciicast

视频中所用到的命令:

python vobserver.py -a
pip freeze | grep Django
django-admin startproject vobserver_test
python vobserver_test/manage.py runserver > /dev/null 2>&1 &
python vobserver.py -u http://127.0.0.1:8000/ -d django -v

如何支持一个新的框架\CMS\依赖的版本检测

假如需要创建一个新的插件,支持一个新的框架\CMS\依赖的版本检测,需要系统里支持 git 命令行和该框架的 git 项目。

还是以 Django 为例,另一个浅显易懂的视频,生成的命令其实没有视频里面那么复杂,视频里只是为了演示各个参数的作用,实际只需要两个参数即可:

python vobserver.py new -d /tmp/django -s /tmp/django/django/contrib/admin/static -w /static/

asciicast

USAGE

英文版的 Usage 可以执行 python vobserver.py -h 查看。这里贴中文的 Usage。

usage: vobserver.py [-h] [-u URL] [-d DEPEND] [--depth DEPTH] [-a] [-v]
                    [--logfile LOGFILE] [--level LEVEL]
                    {new} ...

A tool to detect that which version of web framework using on the target
website.

positional arguments:
{new}                 sub-command help
    new                 新增一个Web框架和依赖的版本探测支持插件

optional arguments:
-h, --help            显示帮助信息
-u URL, --url URL     目标地址. 如 http://blog.neargle.com
-d DEPEND, --depend DEPEND
                        依赖名,可使用(-a/--all)参数查看,如"django"
--depth DEPTH         这个数值越大扫描的url就越多,默认值0会扫描最多的url。
-a, --all             显示当前支持的所有框架信息。
-v, --verbose         设置日志等级为 "VERBOSE", 会打印更多的日志信息。
--logfile LOGFILE     设置日志文件路径。默认为 observer.log.
--level LEVEL         日志等级, 有 "CRITICAL, ERROR, WARNING,INFO, VERBOSE, DEBUG, TRACE, NOISE, LOWEST" 这些等级可随便设置。越往后,日志越多。

子命令 new 的 Usage:

usage: vobserver.py new [-h] [-n FRAMEWORK_NAME] -d DIR -s STATIC_PATH
                        [-w WEB_STATIC_ROOT] [--alias ALIAS [ALIAS ...]]
                        [--dis-suffix DIS_SUFFIX [DIS_SUFFIX ...]]

optional arguments:
-n FRAMEWORK_NAME, --framework-name FRAMEWORK_NAME
                        设置框架或者依赖的名字, 如 django,可不设置,会自动生成
-d DIR, --dir DIR       设置框架的GIT项目本地路径
-s STATIC_PATH, --static-path STATIC_PATH
                        设置项目下的静态文件路径
-w WEB_STATIC_ROOT, --web-static-root WEB_STATIC_ROOT
                        设置框架的静态文件在 WEB 站点上的根目录
--alias ALIAS [ALIAS ...]
                        设置别名,如: `--alias laravel-php laravel`,可用于探测的 -d 参数
--dis-suffix DIS_SUFFIX [DIS_SUFFIX ...]
                        设置不计入静态文件的后缀名,带有该后缀的文件会被忽略。 如:
                        `--dis-suffix php asp

实现逻辑

逻辑上 git 作为最优秀的版本控制工具帮我们做了很多事情。简要的介绍一下逻辑:

生成各个版本指纹的逻辑:

  1. 使用 git taggit log 获取项目所有的版本。(如果一个工程没有严格的按照 git 工作流的话,这里可能会出现问题。)
  2. git diff --name-only 获取静态目录下各个版本的文件变化并记录。
  3. git show 和 少量的 git checkout 获取各个版本的变化的文件内容。

根据这个逻辑最终生成最初的版本和最新的版本中,所有的静态文件hash,和各个版本中静态文件的变化。最终可以得到每个版本下,该框架静态文件的hash值。根据这些进行版本探测和大小比较。

ver-observer 的第三方依赖

除了 requirements.txt 中的依赖外, ext/ 目录下也有一些第三方依赖。

Third-party from great developer and friends in etx/.

  • err_hunter & version_utils by @aploium
  • terminaltables by @robpol86

总结

总之是一个以前自己写的扫描器里面分离出来的功能,重构了一下,目前现存的轮子比较少。烦请各位给予意见,多谢各位指教。

得到的得到的得到的得到的得到的得到的得到的得到
使用道具 举报 回复
66666666666666666
使用道具 举报 回复
虽然没有全懂,但是很6666
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册