目前网络上开源的web指纹识别程序不少,如Wapplyzer,BlindElephant,plecost,w3af,whatweb, wpscan, joomscan等等,基本都是国外的,使用的时候因各方面因素会有一些限制,在某些特定环境下须要本身定制指纹识别工具,本文会浅析这些指纹识别程序的 原理以及如何编写一个web应用指纹识别程序,彻底没有技术含量,有不妥的地方还望各类SM。javascript
0×01:识别的几种方式php
目前常见的web应用指纹识别主要有如下几种方式,泽总已经总结的很明确了。css
1:网页中发现关键字html
2:特定文件的MD5(主要是静态文件、不必定要是MD5)java
3:指定URL的关键字python
4:指定URL的TAG模式web
以上4种模式结合起来识别的话正确率通常在95%以上,除非个别BT的站点修改的体无完肤,如meta、文件路径、css等都删除了或故意修改为其余的webapp等,那我只能说你屌爆了。正则表达式
0×02:识别方式详解数据库
一 般应用程序在html、js、css等文件中多多少少会包含一些特征码,这跟ips、waf等产品的特性有点相似,有特征码匹配模式。好比 wordpress若是没有特细隐藏的话,在robots.txt中会包含wp-admin之类,首页index.php中会包含 generator=wordpress 3.xx,后面为版本号,页面中会包含wp-content路径等等。
这几条都是存在网页中的关键字。 其余的应用也有相似的例子,如discuz、dedecms、phpwind等在页面中都会发现一些固定的特征码。特征码如何查找这里不详细说明了,下期 会有文章详细说明如何批量查找特征码,接下来先介绍一下几款常见的web应用指纹识别程序。ruby
1:Wapplyzer
Wapplyzer是基于正则表达式来识别web应用的,以下图:
仔细看看Wapplyzer的规则其实很简单,挑一条看看,以下:
2:plecost
plecost是基于python架构,利用了Beautiful Soup 来解析html、xml文件识别网站使用的插件及版本。要了解plecost的原理,必须先知道Beautiful Soup是干啥用的,简单科普下Beautiful Soup:
Beautiful Soup 是一个 Python HTML/XML 处理器,设计用来快速地转换网页抓取。如下的特性支撑着 Beautiful Soup:
Beautiful Soup 不会选择 即便你给他一个损坏的标签。 他产生一个转换DOM树,尽量和你原文档内容含义一致 。这种措施一般可以你搜集数据的需求。
Beautiful Soup 提供一些简单的方法以及类Python语法 来查找、查找、修改一颗转换树:一个工具集帮助你解析一棵树并释出你须要的内容。你不须要为每个应用建立本身的解析工具。
Beautiful Soup 自动将送进来的文档转换为 Unicode 编码 并且在输出的时候转换为 UTF-8,。 除非这个文档没有指定编码方式或者Beautiful Soup 没能自动检测编码,你须要手动指定编码方式,不然你不须要考虑编码的问题。
再看看plecost代码,以下图:
加载并读取wp_plugin_list.txt,利用urlopen探测目标url是否存在该插件。Plecos编写插件也很是方便,在wp_plugin_list.txt里面写上插件名称、最新版本号和cve便可。
3:whatweb
whatweb 是一个web应用程序指纹识别工具,能够鉴别出内容管理系统(CMS)、博客平台、统计分析软件、javascript库、服务器和其余更多Web程序。 whatweb拥有超过900个插件,插件是用来鉴别Web应用系统的。所以,开发者呼吁更多的人帮助开发插件,不用担忧做者声称插件是十分容易编写的。
能够说whatweb是目前网络上比较强大的一款应用识别程序了。它支持正则表达式、md5 hash匹配、url识别、HTML标记模式、蜘蛛爬行等等。
Whatweb插件编写须要理解一些变量的定义,经过下面的例子就能够看出个大概,以下:
{:name=>"plone css",
:regexp=>/(@import url|text/css)[^>]*portal_css/.*plone.*css()|”)/}, #”
{:name=>”plone javascript”,
:regexp=>/src=”[^"]*ploneScripts[0-9]+.js”/}, #”
{:text=>’‘}, {:name=>”div tag, visual-portal-wrapper”, :certainty=>75, :text=>’
‘}, ] def passive m=[] #X-Caching-Rule-Id: plone-content-types #X-Cache-Rule: plone-content-types m << {:name=>”X-Caching-Rule-Id: plone-content-types” } if @meta["x-caching-rule-id"] =~ /plone-content-types/i m << {:name=>”X-Cache-Rule: plone-content-types” } if @meta["x-cache-rule"] =~ /plone-content-types/i m end end
:name=>”meta generator tag”, : 包含匹配的文件名称,这个文件必须是网站中惟一存在的文件。
:regexp=>是包含的要匹配的模式,它是一个正则表达式,能够有如下选项:
:regexp 标准的ruby正则表达式
:text 字符
:ghdb google hack数据库,包含如下几个模式
inurl: 包含的字符串在url
intitle: 包含的字符串在title
filetype: 包含的文件名,如PDF, JPG, RB等
:md5 请求页面的md5 hash值
:tagpattern html标签
:version 能够设置正则表达式或直接字符串匹配
:string 能够设置正则表达式或直接字符串匹配
:filepath能够设置正则表达式或直接字符串匹配,一般显示系统错误或配置文件等
:account 常常用在登录页面或用户列表等
:module 能够设置正则表达式或直接字符串匹配,如网络设备可能使用了一个ruby模块等
:model 能够设置正则表达式或直接字符串匹配
:firmware 能够设置正则表达式或直接字符串匹配,设备的固件版本
了解了以上选项咱们能够写出一个简单的识别discuz的插件,以下:
# Version detection # Powered by text
{ :version=>// },
{ :version=>/
Powered by <strong>.*Discuz!.*<em>([Xxd.]+)s*/ }, # HTML Comment { :text=>’discuz_uid’ }, ] end </em></strong>
运行以下图:
更多whatweb插件开发参考: whatweb
0×03:如何编写web指纹识别程序
如今网络上作指纹识别用的最多的是BeautifulSoup,这个插件上面已经介绍过了,而且不少web应用指纹识别程序使用了该插件,这里就很少介绍了,今天主要介绍下另一个框架:scrapy
Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结 Scrapy Pthyon爬虫框架 logo[1]构化的数据。Scrapy用途普遍,能够用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人均可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
Scrapy 使用 Twisted 这个异步网络库来处理网络通信,架构清晰,而且包含了各类中间件接口,能够灵活的完成各类需求。总体架构以下图所示:
绿 线是数据流向,首先从初始 URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载以后会交给 Spider 进行分析,Spider 分析出来的结果有两种:一种是须要进一步抓取的连接,例如以前分析的“下一页”的连接,这些东西会被传回 Scheduler ;另外一种是须要保存的数据,它们则被送到 Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还能够安装各类中间件,进行必要的处理。
若是想作一个好的准确的,很是牛逼的web指纹识别,天然少不了爬虫机制,而作一个爬虫主要分两部分:
一:下载 Web 页面,有许多问题须要考虑,如何最大程度地利用本地带宽,如何调度针对不一样站点的 Web 请求以减轻对方服务器的负担等。一个高性能的 Web Crawler 系统里,DNS 查询也会成为急需优化的瓶颈。
二: 一些“行规”须要遵循(例如 robots.txt)。而获取了网页以后的分析过程也是很是复杂的,Internet 上的东西千奇百怪,各类错误百出的 HTML 页面都有,要想所有分析清楚几乎是不可能的事;另外,随着 AJAX 的流行,如何获取由 Javascript 动态生成的内容成了一大难题;除此以外,Internet 上还有有各类有意或无心出现的Spider Trap ,若是盲目的跟踪超连接的话,就会陷入 Trap 中万劫不复了
不过,其实并无多少人须要作像 Google 那样通用的 Crawler ,咱们作一个 Crawler 就是为了去爬特定的某个网站来进行指纹识别,所谓知己知彼,百战不殆,咱们能够事先对须要爬的网站结构作一些分析,事情就变得容易多了。经过分析,选出有 价值的连接进行跟踪,而后再进行指纹识别。这样就能够避免不少没必要要的连接或者 Spider Trap。
举个例子,咱们添加一个discuz的识别程序,
Discuz我简单例了2个特征码以下:
页面中meta标签的generator属性为Discuz
robots.txt 里面也会有版本信息
OK, 以上2个特征码已经能简单识别该应用了,咱们利用scrapy来提取数据并识别应用。scrapy提取数据主要用到了XPath,它有提供两个XPath 选择器,HtmlXPathSelector和XmlXPathSelector,一个用于HTML,一个用于XML,XPath选择器有三个方法:
select(xpath): 返回一个相对于当前选中节点的选择器列表(一个XPath可能选到多个节点)
extract(): 返回选择器(列表)对应的节点的字符串(列表)
re(regex): 返回正则表达式匹配的字符串(分组匹配)列表
了解了以上方法,写起来就比较简单了,下面举个很是简单的例子:
到主项目目录运行:scrapy crawl freebuf
以上只是个简单的例子,固然你也能够多种条件结合到一块儿写成插件的方式调用,以下:
0×04:后续的一些思考
简 单的web应用识别不会涉及到爬虫机制,可是若是需其余更详尽的信息以及更准确的识别web应用,以及后期扩展其余功能,不可缺乏的是爬虫机制,而爬虫也 直接影响到程序的执行效率、速度是否够快,识别是否准确等。这里就涉及到大规模递归抓取了,若是使用scrapy来作爬虫的话,可能要修改scrapy来 处理如下几个问题:
1:快速的link extractor
python的SGMLParser实在是太慢了,使用 SgmlLinkExtractor会让爬虫把大部分的时间都浪费在解析网页上,最好本身写一个link extractor,也能够用正则表达式来写link extractor,速度快,问题是不理解html语义,会把注释里的连接也包含进来。另外基于javascript重定向url也要在这里提取出来。
2:Spider Trap
由于spider trap通常是由动态网页实现的,最简单的方案就是先经过url是否包含”?”来判断一个网页是不是动态网页,而后取得不包含参数的url地址,对这个地址进行计数,设置一个阈值,超过阈值以后再也不抓取。
3:增量抓取
一个针对多个网站的爬虫很难一次性把全部网页爬取下来,而且网页也处于不断更新的状态中,爬取是一个动态的过程,爬虫支持增量的抓取是很必要的。
4:快速识别 爬虫抓取数据的时候咱们能够定位抓取的数据为js、css、html等,也可指定特定的文件夹文件名称,如gif、jpg、 png之类。