愿世间美好与你环环相扣 --2020.8.13晚
我与春风皆过客,你携秋水揽星河。
不问出处
昨晚谈及安全从业人员的编程能力,估计很多人立马就会想到 python 这款解释型语言了。丰富的库模块,快速的脚本开发优势使得其成为每一个信安从业者的编程语言首选。
业界的大佬们总说,代码能力的高低就是菜鸟和高手的分水岭,在一些CTF竞赛,红蓝对抗中这种区别就会愈加明显。
其实说白了,计算机语言就是一个辅助工具,没有孰强孰弱,看它运用在什么场合而已,人类使用计算机语言告诉机器代替人工,使手动变为自动,使麻烦变得便捷,使无序变得有序,让人类的 “懒惰” 变得有的放矢。。。
啥是CMS
CMS(Content Management System内容管理系统)又称整站系统或文章系统。常见的整站系统如下:
php类CMS系统:dedecms/帝国cms/php168/phpcms/discus
ASP类CMS 系统:zblog/KingCMS
.NET类CMS 系统:EoyooCMS
国外著名CMS系统:joomla/WordPress/magento/drupal
整站系统分析主要从一下四方面入手:
服务器类型(Windows,Linux )
网站容器(Apache,IIS,Nginx,Tomcat 等)
脚本类型(php, jsp, asp, aspx 等)
数据库类型(MySQL,MSSQL,Oracle,Access,SQLserver 等)
啥是CMS指纹识别
像人类的指纹一样,每个人的指纹都是独一无二的,好比世界上没有两片一样的叶子一样,CMS也有其各自的特征。
应用程序一般在 html , js , css 等文件中多多少少会包含一些特征码,比如 Worldpress 在 robots.txt 文件中会包含 wp-admin , 首页 index.php 会包含 generator=wordpress 3.xx
这些特征就是这个 CMS 的指纹,那么当碰到其他网站存在此特征时,就可以快速识别出该 CMS,所以叫做指纹识别。
特定文件的MD5值
一些网站的特定图片文件、js文件、CSS等静态文件,如favicon.ico、css、logo.ico、js等文件一般不会修改,通过爬虫对这些文件进行抓取并比对md5值,如果和规则库中的Md5一致则说明是同一CMS。这种方式速度比较快,误报率相对低一些,但也不排除有些二次开发的CMS会修改这些文件。
正常页面和错误页面中包含的关键字
先访问首页或特定页面如robots.txt等,通过正则的方式去匹配某些关键字,如Powered by Discuz、dedecms等。
或者可以构造错误页面,根据报错信息来判断使用的CMS或者中间件信息,比较常见的如tomcat的报错页面。
响应头信息的关键字匹配
响应头字段的解读可以翻看前面的文章《web安全之HTTP基础》
根据网站 response 返回头信息进行关键字匹配,whatweb和Wappalyzer就是通过banner 信息来快速识别指纹,之前 fofa 的 web 指纹库很多都是使用的这种方法,效率非常高,基本请求一次就可以,但搜集这些规则可能会耗时很长。而且这些 banner 信息有些很容易被改掉。
根据 response header 一般有以下几种识别方式:
查看 http 响应报头的 X-Powered-By 字段(返回服务器的类型和版本)来识别;
根据 COOKIEs 来进行判断,比如一些 waf 会在返回头中包含一些信息,如360wzws、Safedog、yunsuo 等;
根据 header 中的 Server 信息(返回服务器所使用的 Web 服务器的名称)来判断,如 DVRDVS-Webs、yunjiasu-nginx、Mod_Security、nginx-wallarm 等;
根据 WWW-Authenticate 进行判断,一些路由交换设备可能存在这个字段,如NETCORE、huawei、h3c 等设备。
部分 URL 中包含关键字
通过规则库去探测是否有相应目录,或者根据爬虫结果对链接 url 进行分析,或者对robots.txt 文件中目录进行检测等等方式,通过url地址来判别是否使用了某 CMS,比如wordpress 默认存在 wp-includes和wp-admin目录,织梦默认管理后台为 dede 目录,solr 平台可能使用 /solr 目录,weblogic 可能使用 wls-wsat 目录等。
开发语言的识别
web开发语言一般常见的有 PHP、jsp、aspx、asp 等,常见的识别方式有:
① 通过爬虫获取动态链接进行直接判断是比较简便的方法。
asp判别规则如下 ]*?href=('|")[^http][^>]*?\.asp(\?|\#|\1) ,其他语言可替换相应asp即可。
② 通过 X-Powered-By(返回服务器类型和版本) 进行识别
比较常见的有 X-Powered-By: ASP.NET 或者X-Powered-By: PHP/7.1.8
③ 通过 Set-COOKIE 进行识别
这种方法比较常见也很快捷,比如 Set-COOKIE 中包含 PHPSSIONID 说明是 php、包含 JSESSIONID 说明是 java、包含 ASP.NET_SessionId 说明是 aspx 等。
御剑 Web 指纹识别,WhatWeb,椰树,轻量 web 指纹识别,fofa
浏览器插件:Wappalyzer(Wappalyzer 是一款能够分析目标网站所采用的平台构架、网站环境、服务器配置环境、Javascript 框架、编程语言等参数的 chrome 网站技术分析插件。)
在线查询网站
BugScaner: http://whatweb.bugscaner.com/look
云悉指纹: https://www.yunsee.cn/
直接调用api
这里直接调用人家一个在线 CMS 指纹识别网站的 API。
http://whatweb.bugscaner.com/
import requestsimport hashlibimport sysimport jsonimport zlibimport urllib3urllib3.disable_warnings()# 调用 bugscanner 的api接口def whatweb(url): res = requests.get(url, verify=False) whatweb_dict = {"url": res.url, "text": res.text, "headers": dict(res.headers)} whatweb_dict = json.dumps(whatweb_dict) # 将 python 对象转换为 json 格式 whatweb_dict = zlib.compress(whatweb_dict.encode('utf-8')) data = {"info": whatweb_dict} return requests.post("http://whatweb.bugscaner.com/api.go", files=data)if __name__ == '__main__': url = input("请输入要识别的URL: ") if "http://" not in url: if "https://" not in url: url = 'http://' + url res = whatweb(url) print("今日识别剩余次数") print(res.json()["X-RateLimit-Remaining"])) print("识别结果") print(res.json()['CMS'])
C:\Users\Lin\Desktop>python3 demo1.py请输入要识别的URL: aliyun.bugscaner.com今日识别剩余次数1499识别结果['DedeCMS']
有时会因为网络问题导致网页的编码格式出现问题,导致无法读取 json 。
requests模块+字典一把梭
这里的识别方式就知识采用特殊页面的MD5值来判断 CMS 类型了。
字典的话可以去 GitHub 找,或者有零组资料库的也可以去直接下载下来。
import requestsimport hashlibimport urllib3urllib3.disable_warnings()'''该脚本指纹识别的原理只是基于对特定页面MD5值的识别判断而已'''data = [] # cms 指纹列表# 将文件中的指纹按字典格式读取保存在 data 列表中def cmslist(): with open('cms.txt', 'r') as f: for line in f: string = line.strip().split('|') ls_data = {} # 将一个指纹作为字典存储 if len(string) == 3: ls_data['url'] = string[0] ls_data['name'] = string[1] ls_data['md5'] = string[2] data.append(ls_data)# 识别CMSdef cms(detect_url): for item in data: url = detect_url + item['url'] header = { 'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0' } try: res = requests.get(url=url, headers=header, timeout=3, verify=False) except: pass # print(res.url) if res.status_code == 200: filemd5 = hashlib.md5(res.content).hexdigest() if filemd5 == item['md5']: print('该网站的CMS类型是:', item['name']) breakif __name__ == '__main__': url = input("请输入待检测的URL:") if 'http://' not in url: if 'https://' not in url: url = 'http://' + url if url[-1] == '/': # 取出URL末尾的'/' url = url[:-1] cmslist() cms(url)
C:\Users\Lin\Desktop>python3 demo2.py请输入待检测的URL:aliyun.bugscaner.com/该网站的CMS类型是:dedecms
我是匠心,一个在清流旁默默磨剑的匠人,期待那一天能利刃出鞘,仗剑走江湖。