做信息收集的时候,大多数人第一步都是抬出Nmap对着目标一阵扫,看到80、443开放就开心地往下测。说实话,Nmap在网络层确实很强,端口、服务、操作系统都能给你估个八九不离十,但你要是想搞清楚目标网站具体用了哪套CMS、什么框架、多少版本的jQuery、有没有暴露后台特征,Nmap就有点使不上劲了。这时候就该轮到Kali自带的老牌工具WhatWeb出场了。WhatWeb是一个专门做Web指纹识别的命令行工具,干的事很简单:访问目标页面,把响应头、HTML源码、Cookie、JS特征、特定文件路径这些东西过一遍,和内置的上千个插件比对,然后告诉你目标大概用了什么技术栈。它解决的痛点是“我知道目标开着网页,但我不知道这网页是什么做的”,适合做信息收集、资产梳理、漏洞预判、以及红蓝对抗前期的侦察阶段。这篇教程会从最基础的安装验证讲起,逐步到参数原理、批量扫描脚本、报告整理和坑点排查,争取一篇下来你就能直接拿去用。1. 为什么Web指纹识别值得单独立项做1.1 Nmap别全背锅:它真不是做这个的先把话说清楚,Nmap不是不能识别Web服务,它也能通过banner抓取告诉你“这有个Apache或者Nginx”,但它的重心在网络层和端口层。你会发现Nmap给出的服务版本常常是“Apache httpd 2.4.41”,但你要的是“这个站点是WordPress 6.2,用的主题是某某,还挂了某某插件”,这两者之间隔着十万八千里。Web指纹识别本质上是在做应用层的信息收集。你可以把端口扫描想象成侦察一个小区,Nmap告诉你哪几栋楼有门开着,哪几栋楼门锁着;而Web指纹识别是让你走近开着门的那几栋,透过窗户看看里面装修是什么风格、用的什么家电牌子。二者不是替代关系,是互补关系。只做端口扫描不做Web指纹,你拿到的是一个入口清单;结合指纹结果,你才知道入口背后是什么地形。1.2 指纹识别的实战价值:知道自己面对的是什么指纹识别的结果不会直接给你漏洞,但会给你线索。举个例子,如果识别出目标用的是某个老版本的内容管理系统,那么接下来查已知漏洞库就有的放矢了;如果识别出目标是一个Java框架写的,你可能就会调整测试思路,不再浪费时间找PHP相关的问题;如果发现目标是个纯前端的单页应用,那后端接口的测试重点又会不一样。在资产梳理场景里,指纹识别也很有用。很多公司的安全团队定期做资产盘点,跑一遍WhatWeb把内部所有系统的指纹归个类,很容易发现哪些“野生系统”没有备案、哪些系统还在跑没人维护的老框架。这比你一个一个打开浏览器用开发者工具看要高效得多。还有一块是供应链风险排查。网站里引用的第三方组件,比如图表库、富文本编辑器、前端框架,它们的版本如果过旧,本身可能带已知问题。WhatWeb的插件体系里专门有一类就是检测这些组件版本的,批量扫完导出的报告能直接按组件版本做筛选。1.3 WhatWeb在工具链里的位置和浏览器插件或者在线指纹识别服务相比,WhatWeb最大的优势是离线可用、可脚本化、输出结构化。在线工具你要一个站点一个站点手动打开,浏览器插件虽然方便但不适合批量,而且结果难以沉淀成报告。WhatWeb是纯命令行,Kali里自带了,SSH到服务器上就能跑,输出支持JSON和XML,后续想怎么处理都方便。打个比方,它就像是工具箱里那个不起眼却实用的螺丝刀套装——不是每把刀都用得上,但总有一把会在关键时候解决你的问题。2. 环境准备与第一行命令2.1 Kali里的WhatWeb:装上就开跑如果你用的Kali是完整安装,WhatWeb一般已经预装了。确认方法很简单,在终端输入:whatweb --version能看到版本号就直接用。如果提示找不到命令,安装也很方便:sudo apt update && sudo apt install -y whatweb安装完再确认一次即可。整个过程没有任何复杂依赖,Ruby环境Kali里也是现成的,所以这一步通常用不了一分钟。我这里要特别提醒一句:WhatWeb是网络扫描工具,只能对你有权限测试的目标使用。你自己搭的靶机、公司授权的系统、或者在合法众测项目中给出的目标范围,都没有问题。千万别拿它去扫不相关的线上业务,这既不负责任也容易给自己惹麻烦。2.2 第一次扫描:看懂输出在说什么先用一个最简单的命令来试:whatweb https://example.com输出会是一行压缩过的信息,很多人第一次看到就懵了,一堆字段挤在一起。我拆给你看,这些字段分别对应什么:Title:页面的标题栏内容,也就是HTML里的<title>标签。HTTPServer:响应头里的Server字段,比如nginx或者Apache。X-Powered-By:响应头里暴露出来的后端框架,常见的有PHP/7.4、ASP.NET。Meta Generator:很多CMS会在meta标签里写入生成器信息,比如WordPress、各类建站系统。Cookie Name:服务端种下的Cookie名称,比如PHPSESSID、laravel_session,这个能侧面反映后端技术栈。jQuery版本:WhatWeb会检测常见的JS库版本,如果页面引用了jQuery,它会告诉你具体版本号。这么说吧,这一行信息虽然看起来密密麻麻,其实每一段都是对目标的一次“画像”。你第一次扫描的时候,不需要全部看懂,先认识几个关键字段,后面用多了自然就熟了。2.3 加个-v看看它的工作过程加了-v参数之后,WhatWeb会把每个插件的匹配过程打印出来:whatweb -v https://example.com这时候不会只输出一行结果,而是会滚动显示它正在检测哪些插件、命中了哪些内容。我建议新手至少运行一次带-v的扫描,不是为了看热闹,而是为了理解工具的工作方式。你会看到它检测了一批又一批插件,每个插件对应一类指纹规则。比如有一个插件叫HTTPServer,专门看Server头;有一个插件叫MetaGenerator,专门解析meta标签;还有一个插件叫IP,会把目标的IP地址解析出来。看一遍这个过程,你对“指纹识别到底认的是什么”会有非常直观的认识,比单纯记命令参数有用得多。3. 核心原理与参数选择逻辑3.1 WhatWeb到底是怎么认出来的WhatWeb的识别原理,说穿了就是把目标页面拆开,拿它内置的上千个插件逐一比对。每个插件都有自己的匹配规则,常见的有这么几类:第一类是响应头匹配。服务端返回的HTTP头里经常藏着技术信息,比如Server头、X-Powered-By头、X-Generator头。这些字段有时候是显式的,有时候是默认配置忘了关的,WhatWeb只要匹配到特征字符串,就能给出对应指纹。第二类是HTML源码特征匹配。很多CMS和框架会在HTML里留下独特的标记,比如meta name="generator"、特定的class名、特定的id、甚至注释里会写框架名。WhatWeb会抓取页面内容,然后在里面搜索这些特征。第三类是静态资源路径探测。比如WordPress的固定路径是/wp-content/,Drupal有/sites/default/files/,ThinkPHP有时候会暴露/vendor/目录。WhatWeb会向这些路径发起请求,看返回的状态码和内容,以此判断目标是否使用了对应的系统。第四类是Cookie特征匹配。不同后端框架默认的Cookie名不一样,PHP的是PHPSESSID,Java常见的是JSESSIONID,Laravel的是laravel_session。WhatWeb看到Cookie名基本就能猜出个大概。第五类是JavaScript全局变量检测。这个稍微复杂一点,像jQuery、AngularJS这类前端框架会在页面里定义全局变量,WhatWeb通过解析JS相关内容来识别。还有一类是行为探测,比如它访问某个特定路径,发现返回了301跳转到某个固定路径,或者返回了一个特定格式的错误页,这些行为也是指纹的一部分。你可以把WhatWeb想象成一位经验丰富的老师傅,他看一个人,不只看他的工牌,还会看他的口音、走路姿势、用的手机型号、习惯性的小动作,综合这些信息来判断这个人是什么来头。单个特征可能有误差,但多个特征叠加在一起,结论就会逐渐清晰。3.2 攻击性级别-a:别一上来就拉满WhatWeb里有一个很重要的参数叫-a,也就是--aggression,后面跟1到4四个级别。很多新手不管三七二十一直接拉到4,结果扫描慢得怀疑人生,这个参数其实需要按场景选。1:默认级别,只做基础的请求,查看响应头和页面内容,速度快,适合大范围快速扫描。2:会多请求一些常见路径,比如/robots.txt、/favicon.ico这些,速度依然比较快。3:开始比较激进地探测更多路径和特征,速度变慢,但指纹结果更完整。4:全面攻击性探测,会尝试非常多的路径、遍历更多插件规则、做更深入的匹配。这个级别很慢,通常只建议在单目标深度评估时用。我的建议是:批量扫描第一轮用-a 1或-a 2,目的是快速圈出疑似目标;第二轮针对重点系统再上-a 3甚至-a 4。一上来就全量拉满,虽然扫得细,但时间和流量成本都很高,而且对于普通的评估项目,-a 2的结果通常已经够用了。这个道理跟钓鱼很像,先撒网看哪片水域有鱼,再精准下竿,而不是对着整片湖用最重的饵。3.3 常用参数速查与组合套路除了-a,还有几个参数是高频使用的,我整理成一张表:参数作用典型使用场景--no-errors屏蔽错误信息输出批量扫描时避免屏幕被大量超时报错刷屏--log-json=文件路径把结果保存成JSON批量扫描后做脚本化分析--log-xml=文件路径把结果保存成XML需要对接其他平台或导入报表工具-H "User-Agent: 自定义"自定义请求头绕过简单的UA拦截-c "xxx=yyy"带Cookie访问扫描需要登录才能看到完整指纹的页面--plugins=插件名只启用指定插件明确要检测某个技术栈时缩小范围--list-plugins列出所有可用插件查看工具支持哪些指纹检测--max-redirects=N限制最大重定向次数防止跳转过深导致扫描卡住--follow-redirect跟随重定向目标从http跳到https时需要组合使用的示例,最典型的场景是深挖单个目标:whatweb -a 3 --no-errors --log-json=/tmp/result.json -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" https://target.example这条命令做了三件事:把攻击性级别调到3,过滤掉错误噪音,把结果保存为JSON,同时自定义了一个常规浏览器UA。这样既不影响速度太多,又方便后续分析,还能避开最简单的UA拦截。4. 批量实战:从单点到成片资产4.1 批量输入文件怎么准备真实场景里几乎不会只扫一个目标,往往是几十上百个站点一起做资产梳理。这时你需要一个目标清单文件,一行一个URL。准备文件时有几个细节要注意。第一,URL要写完整,带上协议头,http://或者https://都行,不要只写域名,否则WhatWeb在某些情况下会猜错协议。第二,扫描前先去重,重复目标会白白浪费扫描时间。第三,如果目标是IP加端口的形式,也照常写,比如http://192.0.2.10:8080。一条简单的去重命令:sort -u targets.txt -o targets.txt处理好之后,targets.txt就是你的批量输入。4.2 一个能直接用的批量扫描脚本我不太建议直接对着上百个目标一条一条敲命令,写一个简单的循环脚本会靠谱很多。下面这个脚本是我自己会用的简化版,串行执行,稳定第一:#!/bin/bash # 串行批量扫描,适合几十个目标的场景 TARGET_FILE="targets.txt" OUT_DIR="./whatweb_results" mkdir -p "$OUT_DIR" sort -u "$TARGET_FILE" -o "$TARGET_FILE" while IFS= read -r url; do # 跳过空行 [ -z "$url" ] && continue # 生成防止冲突的文件名 fname=$(echo "$url" | md5sum | cut -c1-10) echo "[*] Scanning: $url" whatweb -a 2 --no-errors --log-json="$OUT_DIR/$fname.json" "$url" # 控制节奏,避免请求频率过高 sleep 1 done < "$TARGET_FILE" echo "[*] Done. Results saved to $OUT_DIR"这里有两个设计意图值得说明。第一,用md5sum生成文件名,可以把URL变成一段短哈希,避免目标URL里的特殊符号影响文件路径。第二,每次扫描之间加了sleep 1,一是防止请求频率过高触发目标的防护机制,二是让扫描过程更可控,不至于把目标打“慌”。如果你目标量很大,也可以自己在循环里加并发控制,但并发意味着更难排查问题和控制流量,新手建议先从串行脚本开始,跑通了再考虑优化速度。4.3 与Nmap联动:先摸端口再上指纹前面我说Nmap和WhatWeb是互补关系,它们在实际流程里的联动可以这样理解。先用Nmap扫一批IP的Web端口:nmap -sS -p 80,443 --open -oG - 192.0.2.0/24 | awk '/80\/open|443\/open/ {print $2}' | sort -u > web_hosts.txt这一步给你的是“哪些IP上开着Web服务”。接下来的问题是怎么把这些IP转成WhatWeb能用的URL。你可以根据自己的情况拼一下:while read -r ip; do echo "http://$ip" echo "https://$ip" done < web_hosts.txt | sort -u > targets.txt然后再去跑WhatWeb批量脚本。整个过程就是:Nmap负责找出“哪里开着门”,WhatWeb负责去看“门后面的房间是什么样的”。两层信息组合起来,你手里就有一份比较完整的资产画像了。有域名的情况下,更建议用域名清单而不是纯IP,因为域名能直接反映站点身份,指纹识别的结果也更有指向性。IP加域名混着用也没问题,只要你的目标清单授权范围覆盖到就行。4.4 报告与结果整理批量扫描的产物是一堆JSON文件,看着头疼也难查。我习惯把JSON汇总之后再提取关键信息。WhatWeb导出的JSON结构是数组形式,每个目标是一个对象,里面包含HTTP状态、目标地址、插件匹配结果等字段。你可以先用jq看一下结构:jq '.' 文件.json熟悉结构之后,可以用下面的命令把所有结果里的目标地址列出来:jq -r '.[].target' 某条结果.json更常用的操作是按插件名统计,快速看出这批目标里哪种技术栈占比最高:cat whatweb_results/*.json | jq -r '.[].plugins | keys[]' | sort | uniq -c | sort -rn这条命令会把所有扫描结果中出现的插件名汇总、去重、按出现次数排序。跑完你就能看到类似“xx个目标都识别出了jQuery”“xx个目标疑似用了某种CMS”这样的分布情况,这对资产盘点来说非常有价值。如果你需要导出成CSV给别人看,也可以用jq把目标地址、HTTP状态、关键插件这几个字段拼成一行,然后重定向到CSV文件。具体字段名建议以自己的JSON结构为准,先jq keys看一遍再动手写提取逻辑,省得字段对不上白折腾。5. 常见问题与避坑实录5.1 常见错误与排查汇总我把使用过程中容易遇到的问题整理成了表格,方便你对照排查:问题现象可能原因处理方法提示whatweb: command not foundKali里没有装sudo apt install -y whatweb扫描一个目标卡了很久攻击性级别太高或网络不通降低-a级别,先手动访问目标确认连通屏幕刷满超时和错误信息目标响应慢或不可达加--no-errors,先Ping或curl测试识别不出任何技术栈目标是定制页面或纯前端SPA手动查看响应头和JS文件,结合浏览器控制台补全批量中断不知道跑了多少没有进度记录在脚本里加echo日志,或给输出文件加上序号接连访问后目标拒绝响应请求频率太高触发了防护拉大sleep间隔,降低并发,改用较慢的识别级别指纹结果与实际情况不符插件匹配到通用特征导致误报用curl手动核对响应头,二次确认5.2 误报与漏报:指纹工具没有绝对准确什么情况下容易出现误报?最常见的是目标套了CDN或者反向代理。你扫到的Server头可能是CDN厂商的,而不是源站真实的Web服务器,这就导致指纹结果偏离实际情况。处理办法是对比多个请求角度,比如直接看关键响应头是否统一,有时候还需要在合法授权下尝试访问源站。还有一种情况是目标站点高度定制,自己写的页面,完全没有常见CMS的特征,WhatWeb能识别的内容就很少。这时候不要硬等工具给出答案,打开浏览器开发者工具的“网络”标签,看看加载了哪些JS文件,响应头里有什么字段,手动补上工具没给出来的信息。工具是起点,不是终点。反过来,漏报也很常见。特别是现在很多站点用Vue、React这类前端框架,页面内容主要在JS里渲染,HTML源码里干净得很,WhatWeb对这类SPA的识别能力天然偏弱,因为它的很多规则是针对传统服务端渲染的站点的。遇到这类目标,我会多看JS文件名、接口路径、Cookie特征几个维度,而不是只盯着它有没有识别出框架名。5.3 扫描规范与合规提醒这条我想单独拿出来说,因为太重要了。WhatWeb这个工具本身没有攻击性,它做的是“访问并识别”,但任何扫描行为在未授权的情况下都可能构成越权访问。使用之前先确认三件事:第一,目标是不是你负责的、或者明确授权测试的;第二,扫描范围有没有边界,不要在目标清单之外顺手扫别的IP;第三,测试时间和请求频率是否合理,不要给目标业务造成可用性影响。批量扫描的时候,控制请求频率不仅是为了不触发防护,也是做测试的基本素养。你无恶意不代表目标系统能承受高频请求,很多防御设备对扫描行为非常敏感,如果因为扫描把目标打挂了,那就不是信息收集,而是事故了。我自己做批量扫描,串行加间隔是最低配置,宁可多花点时间,也不给目标添堵。最后再分享一点个人经验工具用到现在,我最大的体会是:指纹识别的结果用来“缩小范围”远比“直接下结论”有价值。WhatWeb扫完一批资产,我会先看哪些目标的技术栈版本偏旧,挑出来优先做深入检查;哪些目标识别结果太干净,说明可能是定制系统或前端渲染,这类就需要人工再看一遍。指纹信息是线索,不是结论,你要做的不是在结果列表里打勾,而是在一堆线索里找到最值得调查的那几个点。还有一个小技巧算是白捡的:把JSON日志汇总以后,用jq按插件名统计一遍,经常能发现一些不在预期内的技术栈。比如你以为这批资产都是同一套框架,结果扫出来有十几个跑着别的系统,这种意外发现往往比常规梳理更能反映真实情况。资产盘点也好,风险评估也好,能先发现“漏掉的东西”,就已经赢了一半。
做信息收集的时候,大多数人第一步都是抬出Nmap对着目标一阵扫,看到80、443开放就开心地往下测。说实话,Nmap在网络层确实很强,端口、服务、操作系统都能给你估个八九不离十,但你要是想搞清楚目标网站具体用了哪套CMS、什么框架、多少版本的jQuery、有没有暴露后台特征,Nmap就有点使不上劲了。这时候就该轮到Kali自带的老牌工具WhatWeb出场了。WhatWeb是一个专门做Web指纹识别的命令行工具,干的事很简单:访问目标页面,把响应头、HTML源码、Cookie、JS特征、特定文件路径这些东西过一遍,和内置的上千个插件比对,然后告诉你目标大概用了什么技术栈。它解决的痛点是“我知道目标开着网页,但我不知道这网页是什么做的”,适合做信息收集、资产梳理、漏洞预判、以及红蓝对抗前期的侦察阶段。这篇教程会从最基础的安装验证讲起,逐步到参数原理、批量扫描脚本、报告整理和坑点排查,争取一篇下来你就能直接拿去用。1. 为什么Web指纹识别值得单独立项做1.1 Nmap别全背锅:它真不是做这个的先把话说清楚,Nmap不是不能识别Web服务,它也能通过banner抓取告诉你“这有个Apache或者Nginx”,但它的重心在网络层和端口层。你会发现Nmap给出的服务版本常常是“Apache httpd 2.4.41”,但你要的是“这个站点是WordPress 6.2,用的主题是某某,还挂了某某插件”,这两者之间隔着十万八千里。Web指纹识别本质上是在做应用层的信息收集。你可以把端口扫描想象成侦察一个小区,Nmap告诉你哪几栋楼有门开着,哪几栋楼门锁着;而Web指纹识别是让你走近开着门的那几栋,透过窗户看看里面装修是什么风格、用的什么家电牌子。二者不是替代关系,是互补关系。只做端口扫描不做Web指纹,你拿到的是一个入口清单;结合指纹结果,你才知道入口背后是什么地形。1.2 指纹识别的实战价值:知道自己面对的是什么指纹识别的结果不会直接给你漏洞,但会给你线索。举个例子,如果识别出目标用的是某个老版本的内容管理系统,那么接下来查已知漏洞库就有的放矢了;如果识别出目标是一个Java框架写的,你可能就会调整测试思路,不再浪费时间找PHP相关的问题;如果发现目标是个纯前端的单页应用,那后端接口的测试重点又会不一样。在资产梳理场景里,指纹识别也很有用。很多公司的安全团队定期做资产盘点,跑一遍WhatWeb把内部所有系统的指纹归个类,很容易发现哪些“野生系统”没有备案、哪些系统还在跑没人维护的老框架。这比你一个一个打开浏览器用开发者工具看要高效得多。还有一块是供应链风险排查。网站里引用的第三方组件,比如图表库、富文本编辑器、前端框架,它们的版本如果过旧,本身可能带已知问题。WhatWeb的插件体系里专门有一类就是检测这些组件版本的,批量扫完导出的报告能直接按组件版本做筛选。1.3 WhatWeb在工具链里的位置和浏览器插件或者在线指纹识别服务相比,WhatWeb最大的优势是离线可用、可脚本化、输出结构化。在线工具你要一个站点一个站点手动打开,浏览器插件虽然方便但不适合批量,而且结果难以沉淀成报告。WhatWeb是纯命令行,Kali里自带了,SSH到服务器上就能跑,输出支持JSON和XML,后续想怎么处理都方便。打个比方,它就像是工具箱里那个不起眼却实用的螺丝刀套装——不是每把刀都用得上,但总有一把会在关键时候解决你的问题。2. 环境准备与第一行命令2.1 Kali里的WhatWeb:装上就开跑如果你用的Kali是完整安装,WhatWeb一般已经预装了。确认方法很简单,在终端输入:whatweb --version能看到版本号就直接用。如果提示找不到命令,安装也很方便:sudo apt update && sudo apt install -y whatweb安装完再确认一次即可。整个过程没有任何复杂依赖,Ruby环境Kali里也是现成的,所以这一步通常用不了一分钟。我这里要特别提醒一句:WhatWeb是网络扫描工具,只能对你有权限测试的目标使用。你自己搭的靶机、公司授权的系统、或者在合法众测项目中给出的目标范围,都没有问题。千万别拿它去扫不相关的线上业务,这既不负责任也容易给自己惹麻烦。2.2 第一次扫描:看懂输出在说什么先用一个最简单的命令来试:whatweb https://example.com输出会是一行压缩过的信息,很多人第一次看到就懵了,一堆字段挤在一起。我拆给你看,这些字段分别对应什么:Title:页面的标题栏内容,也就是HTML里的<title>标签。HTTPServer:响应头里的Server字段,比如nginx或者Apache。X-Powered-By:响应头里暴露出来的后端框架,常见的有PHP/7.4、ASP.NET。Meta Generator:很多CMS会在meta标签里写入生成器信息,比如WordPress、各类建站系统。Cookie Name:服务端种下的Cookie名称,比如PHPSESSID、laravel_session,这个能侧面反映后端技术栈。jQuery版本:WhatWeb会检测常见的JS库版本,如果页面引用了jQuery,它会告诉你具体版本号。这么说吧,这一行信息虽然看起来密密麻麻,其实每一段都是对目标的一次“画像”。你第一次扫描的时候,不需要全部看懂,先认识几个关键字段,后面用多了自然就熟了。2.3 加个-v看看它的工作过程加了-v参数之后,WhatWeb会把每个插件的匹配过程打印出来:whatweb -v https://example.com这时候不会只输出一行结果,而是会滚动显示它正在检测哪些插件、命中了哪些内容。我建议新手至少运行一次带-v的扫描,不是为了看热闹,而是为了理解工具的工作方式。你会看到它检测了一批又一批插件,每个插件对应一类指纹规则。比如有一个插件叫HTTPServer,专门看Server头;有一个插件叫MetaGenerator,专门解析meta标签;还有一个插件叫IP,会把目标的IP地址解析出来。看一遍这个过程,你对“指纹识别到底认的是什么”会有非常直观的认识,比单纯记命令参数有用得多。3. 核心原理与参数选择逻辑3.1 WhatWeb到底是怎么认出来的WhatWeb的识别原理,说穿了就是把目标页面拆开,拿它内置的上千个插件逐一比对。每个插件都有自己的匹配规则,常见的有这么几类:第一类是响应头匹配。服务端返回的HTTP头里经常藏着技术信息,比如Server头、X-Powered-By头、X-Generator头。这些字段有时候是显式的,有时候是默认配置忘了关的,WhatWeb只要匹配到特征字符串,就能给出对应指纹。第二类是HTML源码特征匹配。很多CMS和框架会在HTML里留下独特的标记,比如meta name="generator"、特定的class名、特定的id、甚至注释里会写框架名。WhatWeb会抓取页面内容,然后在里面搜索这些特征。第三类是静态资源路径探测。比如WordPress的固定路径是/wp-content/,Drupal有/sites/default/files/,ThinkPHP有时候会暴露/vendor/目录。WhatWeb会向这些路径发起请求,看返回的状态码和内容,以此判断目标是否使用了对应的系统。第四类是Cookie特征匹配。不同后端框架默认的Cookie名不一样,PHP的是PHPSESSID,Java常见的是JSESSIONID,Laravel的是laravel_session。WhatWeb看到Cookie名基本就能猜出个大概。第五类是JavaScript全局变量检测。这个稍微复杂一点,像jQuery、AngularJS这类前端框架会在页面里定义全局变量,WhatWeb通过解析JS相关内容来识别。还有一类是行为探测,比如它访问某个特定路径,发现返回了301跳转到某个固定路径,或者返回了一个特定格式的错误页,这些行为也是指纹的一部分。你可以把WhatWeb想象成一位经验丰富的老师傅,他看一个人,不只看他的工牌,还会看他的口音、走路姿势、用的手机型号、习惯性的小动作,综合这些信息来判断这个人是什么来头。单个特征可能有误差,但多个特征叠加在一起,结论就会逐渐清晰。3.2 攻击性级别-a:别一上来就拉满WhatWeb里有一个很重要的参数叫-a,也就是--aggression,后面跟1到4四个级别。很多新手不管三七二十一直接拉到4,结果扫描慢得怀疑人生,这个参数其实需要按场景选。1:默认级别,只做基础的请求,查看响应头和页面内容,速度快,适合大范围快速扫描。2:会多请求一些常见路径,比如/robots.txt、/favicon.ico这些,速度依然比较快。3:开始比较激进地探测更多路径和特征,速度变慢,但指纹结果更完整。4:全面攻击性探测,会尝试非常多的路径、遍历更多插件规则、做更深入的匹配。这个级别很慢,通常只建议在单目标深度评估时用。我的建议是:批量扫描第一轮用-a 1或-a 2,目的是快速圈出疑似目标;第二轮针对重点系统再上-a 3甚至-a 4。一上来就全量拉满,虽然扫得细,但时间和流量成本都很高,而且对于普通的评估项目,-a 2的结果通常已经够用了。这个道理跟钓鱼很像,先撒网看哪片水域有鱼,再精准下竿,而不是对着整片湖用最重的饵。3.3 常用参数速查与组合套路除了-a,还有几个参数是高频使用的,我整理成一张表:参数作用典型使用场景--no-errors屏蔽错误信息输出批量扫描时避免屏幕被大量超时报错刷屏--log-json=文件路径把结果保存成JSON批量扫描后做脚本化分析--log-xml=文件路径把结果保存成XML需要对接其他平台或导入报表工具-H "User-Agent: 自定义"自定义请求头绕过简单的UA拦截-c "xxx=yyy"带Cookie访问扫描需要登录才能看到完整指纹的页面--plugins=插件名只启用指定插件明确要检测某个技术栈时缩小范围--list-plugins列出所有可用插件查看工具支持哪些指纹检测--max-redirects=N限制最大重定向次数防止跳转过深导致扫描卡住--follow-redirect跟随重定向目标从http跳到https时需要组合使用的示例,最典型的场景是深挖单个目标:whatweb -a 3 --no-errors --log-json=/tmp/result.json -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" https://target.example这条命令做了三件事:把攻击性级别调到3,过滤掉错误噪音,把结果保存为JSON,同时自定义了一个常规浏览器UA。这样既不影响速度太多,又方便后续分析,还能避开最简单的UA拦截。4. 批量实战:从单点到成片资产4.1 批量输入文件怎么准备真实场景里几乎不会只扫一个目标,往往是几十上百个站点一起做资产梳理。这时你需要一个目标清单文件,一行一个URL。准备文件时有几个细节要注意。第一,URL要写完整,带上协议头,http://或者https://都行,不要只写域名,否则WhatWeb在某些情况下会猜错协议。第二,扫描前先去重,重复目标会白白浪费扫描时间。第三,如果目标是IP加端口的形式,也照常写,比如http://192.0.2.10:8080。一条简单的去重命令:sort -u targets.txt -o targets.txt处理好之后,targets.txt就是你的批量输入。4.2 一个能直接用的批量扫描脚本我不太建议直接对着上百个目标一条一条敲命令,写一个简单的循环脚本会靠谱很多。下面这个脚本是我自己会用的简化版,串行执行,稳定第一:#!/bin/bash # 串行批量扫描,适合几十个目标的场景 TARGET_FILE="targets.txt" OUT_DIR="./whatweb_results" mkdir -p "$OUT_DIR" sort -u "$TARGET_FILE" -o "$TARGET_FILE" while IFS= read -r url; do # 跳过空行 [ -z "$url" ] && continue # 生成防止冲突的文件名 fname=$(echo "$url" | md5sum | cut -c1-10) echo "[*] Scanning: $url" whatweb -a 2 --no-errors --log-json="$OUT_DIR/$fname.json" "$url" # 控制节奏,避免请求频率过高 sleep 1 done < "$TARGET_FILE" echo "[*] Done. Results saved to $OUT_DIR"这里有两个设计意图值得说明。第一,用md5sum生成文件名,可以把URL变成一段短哈希,避免目标URL里的特殊符号影响文件路径。第二,每次扫描之间加了sleep 1,一是防止请求频率过高触发目标的防护机制,二是让扫描过程更可控,不至于把目标打“慌”。如果你目标量很大,也可以自己在循环里加并发控制,但并发意味着更难排查问题和控制流量,新手建议先从串行脚本开始,跑通了再考虑优化速度。4.3 与Nmap联动:先摸端口再上指纹前面我说Nmap和WhatWeb是互补关系,它们在实际流程里的联动可以这样理解。先用Nmap扫一批IP的Web端口:nmap -sS -p 80,443 --open -oG - 192.0.2.0/24 | awk '/80\/open|443\/open/ {print $2}' | sort -u > web_hosts.txt这一步给你的是“哪些IP上开着Web服务”。接下来的问题是怎么把这些IP转成WhatWeb能用的URL。你可以根据自己的情况拼一下:while read -r ip; do echo "http://$ip" echo "https://$ip" done < web_hosts.txt | sort -u > targets.txt然后再去跑WhatWeb批量脚本。整个过程就是:Nmap负责找出“哪里开着门”,WhatWeb负责去看“门后面的房间是什么样的”。两层信息组合起来,你手里就有一份比较完整的资产画像了。有域名的情况下,更建议用域名清单而不是纯IP,因为域名能直接反映站点身份,指纹识别的结果也更有指向性。IP加域名混着用也没问题,只要你的目标清单授权范围覆盖到就行。4.4 报告与结果整理批量扫描的产物是一堆JSON文件,看着头疼也难查。我习惯把JSON汇总之后再提取关键信息。WhatWeb导出的JSON结构是数组形式,每个目标是一个对象,里面包含HTTP状态、目标地址、插件匹配结果等字段。你可以先用jq看一下结构:jq '.' 文件.json熟悉结构之后,可以用下面的命令把所有结果里的目标地址列出来:jq -r '.[].target' 某条结果.json更常用的操作是按插件名统计,快速看出这批目标里哪种技术栈占比最高:cat whatweb_results/*.json | jq -r '.[].plugins | keys[]' | sort | uniq -c | sort -rn这条命令会把所有扫描结果中出现的插件名汇总、去重、按出现次数排序。跑完你就能看到类似“xx个目标都识别出了jQuery”“xx个目标疑似用了某种CMS”这样的分布情况,这对资产盘点来说非常有价值。如果你需要导出成CSV给别人看,也可以用jq把目标地址、HTTP状态、关键插件这几个字段拼成一行,然后重定向到CSV文件。具体字段名建议以自己的JSON结构为准,先jq keys看一遍再动手写提取逻辑,省得字段对不上白折腾。5. 常见问题与避坑实录5.1 常见错误与排查汇总我把使用过程中容易遇到的问题整理成了表格,方便你对照排查:问题现象可能原因处理方法提示whatweb: command not foundKali里没有装sudo apt install -y whatweb扫描一个目标卡了很久攻击性级别太高或网络不通降低-a级别,先手动访问目标确认连通屏幕刷满超时和错误信息目标响应慢或不可达加--no-errors,先Ping或curl测试识别不出任何技术栈目标是定制页面或纯前端SPA手动查看响应头和JS文件,结合浏览器控制台补全批量中断不知道跑了多少没有进度记录在脚本里加echo日志,或给输出文件加上序号接连访问后目标拒绝响应请求频率太高触发了防护拉大sleep间隔,降低并发,改用较慢的识别级别指纹结果与实际情况不符插件匹配到通用特征导致误报用curl手动核对响应头,二次确认5.2 误报与漏报:指纹工具没有绝对准确什么情况下容易出现误报?最常见的是目标套了CDN或者反向代理。你扫到的Server头可能是CDN厂商的,而不是源站真实的Web服务器,这就导致指纹结果偏离实际情况。处理办法是对比多个请求角度,比如直接看关键响应头是否统一,有时候还需要在合法授权下尝试访问源站。还有一种情况是目标站点高度定制,自己写的页面,完全没有常见CMS的特征,WhatWeb能识别的内容就很少。这时候不要硬等工具给出答案,打开浏览器开发者工具的“网络”标签,看看加载了哪些JS文件,响应头里有什么字段,手动补上工具没给出来的信息。工具是起点,不是终点。反过来,漏报也很常见。特别是现在很多站点用Vue、React这类前端框架,页面内容主要在JS里渲染,HTML源码里干净得很,WhatWeb对这类SPA的识别能力天然偏弱,因为它的很多规则是针对传统服务端渲染的站点的。遇到这类目标,我会多看JS文件名、接口路径、Cookie特征几个维度,而不是只盯着它有没有识别出框架名。5.3 扫描规范与合规提醒这条我想单独拿出来说,因为太重要了。WhatWeb这个工具本身没有攻击性,它做的是“访问并识别”,但任何扫描行为在未授权的情况下都可能构成越权访问。使用之前先确认三件事:第一,目标是不是你负责的、或者明确授权测试的;第二,扫描范围有没有边界,不要在目标清单之外顺手扫别的IP;第三,测试时间和请求频率是否合理,不要给目标业务造成可用性影响。批量扫描的时候,控制请求频率不仅是为了不触发防护,也是做测试的基本素养。你无恶意不代表目标系统能承受高频请求,很多防御设备对扫描行为非常敏感,如果因为扫描把目标打挂了,那就不是信息收集,而是事故了。我自己做批量扫描,串行加间隔是最低配置,宁可多花点时间,也不给目标添堵。最后再分享一点个人经验工具用到现在,我最大的体会是:指纹识别的结果用来“缩小范围”远比“直接下结论”有价值。WhatWeb扫完一批资产,我会先看哪些目标的技术栈版本偏旧,挑出来优先做深入检查;哪些目标识别结果太干净,说明可能是定制系统或前端渲染,这类就需要人工再看一遍。指纹信息是线索,不是结论,你要做的不是在结果列表里打勾,而是在一堆线索里找到最值得调查的那几个点。还有一个小技巧算是白捡的:把JSON日志汇总以后,用jq按插件名统计一遍,经常能发现一些不在预期内的技术栈。比如你以为这批资产都是同一套框架,结果扫出来有十几个跑着别的系统,这种意外发现往往比常规梳理更能反映真实情况。资产盘点也好,风险评估也好,能先发现“漏掉的东西”,就已经赢了一半。