打开一个网站,纹识你看到的纹识可能是页面、图片、纹识按钮。纹识服务器看到的纹识,是纹识你浏览器发过去的一串HTTP请求头。这串东西里藏着大量信息——你用什么浏览器、纹识什么操作系统、纹识甚至什么设备。纹识Web指纹识别干的纹识事,就是纹识通过这堆蛛丝马迹,判断对面到底是纹识什么技术栈在跑。
最基础的纹识指纹来自HTTP响应头。比如
Server: nginx/1.18.0,纹识直接告诉你用了Nginx,纹识版本号都给了。有些服务器会把这个字段改掉或者删掉,但总有别的破绽。比如X-Powered-By: PHP/7.4.3,这就暴露了后端语言和版本。我之前扫过一个站,响应头里写着X-AspNet-Version: 4.0.30319,基本可以确定是.NET Framework 4.0的池子。但光看响应头太浅了。真正有意思的是页面内容里的特征。WordPress的站点,HTML里一定会有
wp-content和wp-includes这两个路径。Joomla会带/components/com_content/。Discuz的论坛,URL里经常出现forum.php?mod=viewthread。这些字符串就像胎记,改都改不干净。还有一种更隐蔽的方式:特定文件的哈希值。比如
/favicon.ico这个图标,每个CMS默认的图标都不一样。有人专门建了个库,把几万个favicon的MD5存进去,扫到匹配就知道是什么系统。我试过拿一个冷门OA的favicon去查,结果真命中了。那种感觉跟破案差不多。前端框架也有指纹。Vue的页面,源码里经常能看到
data-v-开头的属性。React的话,__REACT_DEVTOOLS_GLOBAL_HOOK__或者react-root这种ID会露出来。Angular更明显,ng-version直接写在标签上。这些特征不是故意的,是框架编译时留下的痕迹,开发者一般不会去清理。CDN和WAF也会留下指纹。Cloudflare的响应头里有
cf-ray和cf-cache-status。Akamai会带X-Akamai-Transformed。国内常见的安全狗,有时候会在Cookie里塞一个wzws_sessionid。识别出WAF之后,渗透测试的策略就得调整,不能硬打。指纹识别不是百分百准确的。有人会故意伪造响应头,把Nginx改成Apache,把PHP改成Java。但改得再像,细节也会出卖他。比如Nginx处理静态文件的方式、404页面的返回格式、对HTTP/2的支持程度,这些行为特征很难伪装。我见过一个站把Server头改成
Microsoft-IIS/10.0,但返回的404页面是标准的Nginx风格,一眼假。工具方面,Wappalyzer、WhatWeb、WafW00f都是常用的。Wappalyzer有浏览器插件,点一下就能看当前站用了什么。WhatWeb是命令行的,支持批量扫描。WafW00f专门识别WAF,规则库更新挺勤。不过工具只是辅助,真正遇到偏门系统,还是得靠手工看源码、抓包、对比特征。
指纹识别在渗透测试里的位置很靠前。信息收集阶段,先搞清楚目标跑的是什么,再去搜对应的漏洞。一个站用的是ThinkPHP 5.0.22,那就直接去找RCE的利用链。如果用的是Shiro,那就试试默认密钥。方向对了,后面省很多力气。
防守方也在反指纹。有些公司会把所有版本号抹掉,把默认路径改掉,把favicon换掉。但完全消除指纹几乎不可能,因为Web技术栈太复杂了,总有一个角落会漏出来。攻防就是在这种细节里来回拉锯。
顶: 5434踩: 2






评论专区