☰
WPScan 动态指纹识别解析:以 analytics-for-cloudflare 的 CHANGELOG 指纹为例
2026/9/25 3:21:57 网站建设 项目流程
  • 网络安全
  • 漏洞扫描
  • 渗透测试
  • 应用安全
  • CLI

【免费下载链接】wpscan

WPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contact@wpscan.com

项目地址:https://gitcode.com/gh_mirrors/wp/wpscan
点击查看免费下载

本文围绕 WPScan 仓库中 analytics-for-cloudflare 插件的 CHANGELOG.md 这份指纹样本,讲解 WPScan 如何借助插件自带的更新日志(ChangeLog)文件,通过BodyPattern动态指纹机制在扫描时远程识别 WordPress 插件及其版本。读完本文,你将理解dynamic_finders.yml指纹条目的完整字段含义、BodyPattern版本探测的底层匹配逻辑,以及该机制如何驱动 WPScan 插件枚举与版本漏洞判定。

一、WPScan 动态指纹体系概览

WPScan 是一款面向 WordPress 站点的安全扫描器,其插件与主题识别并不完全依赖字典式的路径探测,还大量使用"动态指纹(Dynamic Finders)"机制:通过扫描目标站点响应中的特征(注释、XPath 节点、响应头、JS 变量、配置解析结果、正文模式等)来判断某个插件/主题是否存在,并尽可能提取其版本号。

动态指纹的配置集中存放于 spec/fixtures/db/dynamic_finders.yml(数据库更新时对应的线上dynamic_finders.yml),由 lib/wpscan/db/dynamic_finders/base.rb 加载解析。该文件允许的指纹类型(class)定义在Base.allowed_classes中:

%i[Comment Xpath HeaderPattern BodyPattern JavascriptVar QueryParameter ConfigParser]

每种类型对应一个独立的 finder 实现类(分别位于 app/finders/plugins 与 lib/wpscan/finders/dynamic_finder),而ChangeLog并非一种独立类型,它只是对BodyPattern的一种语义化命名——表示指纹源是插件自带的CHANGELOG文件。

二、analytics-for-cloudflare 指纹条目解读

在 dynamic_finders.yml 中,analytics-for-cloudflare的指纹条目如下:

analytics-for-cloudflare: ChangeLog: class: BodyPattern path: CHANGELOG.md pattern: !ruby/regexp /\#\# (?<v>\d+\.[\.\d]+)/ version: true

各字段含义:

字段值作用
ChangeLog—指纹块名称,表示探测源是插件的更新日志文件
classBodyPattern指定使用正文模式匹配(BodyPattern)类来执行探测
pathCHANGELOG.md主动(aggressive)模式下要请求的插件内文件路径,即wp-content/plugins/analytics-for-cloudflare/CHANGELOG.md
pattern/\#\# (?<v>\d+\.[\.\d]+)/用于从响应正文中提取版本号的正则,其中命名捕获组(?<v>...)是版本号的出口
versiontrue表明该指纹用于探测版本(而非仅确认插件存在)

也就是说,只要目标站点返回的CHANGELOG.md正文中能匹配到## 1.1这样的 Markdown 二级标题行,WPScan 就能据此判定该插件存在,并取出标题后的版本号。这份 CHANGELOG.md 正是被用作该指纹的"夹具"(fixture)数据,其内容即真实插件的更新日志:

# Analytics For Cloudflare ## 1.1 - 2017-02-09 ### Fixed - Match Wordpress-Extra coding standards. - Fix text domain in i18n (make static instead of variable). - Fix domains not appearing properly if you have more than 20 ## 1.0.2 - 2015-11-26 ### Added - Developer hooks to filter api values ### Fixed - Update to WordPress coding standards ...

注意该文件的CHANGELOG.md路径位于change_log/子目录中,这是 WPScan 测试夹具目录(spec/fixtures/dynamic_finders/plugin_version)的组织方式——每个插件 slug 对应一个目录,其内部文件布局用于模拟线上插件的真实文件结构。

三、BodyPattern 版本探测的底层实现

3.1 指纹类的动态生成

WPScan 并不为每个指纹条目手写一个类,而是在运行时根据配置动态生成。核心逻辑在 lib/wpscan/finders/dynamic_finder/finder.rb 的create_child_class:

def self.create_child_class(mod, klass, config) class_constants = child_class_constants mod.const_set( klass, Class.new(self) do class_constants.each do |key, value| const_set(key, config[key.downcase.to_s] || value) end end ) end

它会从dynamic_finders.yml的配置中读取pattern、confidence、path等键(统一转成小写)覆盖到子类常量上。BodyPattern子类的默认常量定义于 lib/wpscan/finders/dynamic_finder/version/body_pattern.rb:

def self.child_class_constants @child_class_constants ||= super.merge(PATTERN: nil, CONFIDENCE: 60) end

即:PATTERN必须由配置提供,CONFIDENCE默认 60(未配置时使用该值)。create_child_class与默认常量的行为在 spec/lib/finders/dynamic_finder/version/body_pattern_spec.rb 中有完整测试覆盖,验证了未提供PATH/CONFIDENCE时默认值生效、显式提供时覆盖默认值的两种路径。

3.2 passive 与 aggressive 两种扫描路径

动态指纹 finder 基类定义了两种调用方式(lib/wpscan/finders/dynamic_finder/finder.rb):

  • passive(被动):仅当指纹配置没有path时才执行,直接对目标主页(target.homepage_res)与 404 页面(target.error_404_res)做匹配,不额外发起请求;
  • aggressive(主动):仅当指纹配置有path时才执行,主动请求target.url(self.class::PATH)拼接出的文件 URL。

analytics-for-cloudflare的ChangeLog指纹配置了path: CHANGELOG.md,因此它属于 aggressive 探测:扫描器会主动请求https://目标站点/wp-content/plugins/analytics-for-cloudflare/CHANGELOG.md。

3.3 版本提取的匹配执行

真正执行匹配的是 lib/wpscan/finders/dynamic_finder/version/body_pattern.rb 的find方法:

def find(response, _opts = {}) return unless response.code != 404 && response.body =~ self.class::PATTERN create_version( Regexp.last_match[:v], interesting_entries: ["#{response.effective_url}, Match: '#{Regexp.last_match}'"] ) end

关键点:

  1. 响应状态码为 404 时直接放弃(文件不存在即插件未安装);
  2. 用配置中的PATTERN对响应正文做正则匹配;
  3. 通过命名捕获组(?<v>...)取出Regexp.last_match[:v]作为版本号;
  4. 将匹配到的 URL 与原始匹配串记录为interesting_entries,供最终报告溯源。

针对本条目,/\#\# (?<v>\d+\.[\.\d]+)/会把## 1.1 - 2017-02-09中的1.1提取出来(捕获组会命中该行第一个版本号),从而实现版本识别。随后create_version(见 lib/wpscan/finders/dynamic_finder/version/finder.rb)用Model::Version封装版本对象,并补充found_by与置信度信息。

四、ChangeLog 指纹与插件存在性探测的分工

除了版本探测,WPScan 插件枚举中还有一类"插件存在性"动态指纹,例如 app/finders/plugins/body_pattern.rb(位于插件 finders 层,注意与版本层的lib/wpscan/finders/dynamic_finder/version/body_pattern.rb区分):

DEFAULT_CONFIDENCE = 30 def process_response(opts, response, slug, klass, config) return unless response.body&.match?(config['pattern']) Model::Plugin.new( slug, target, opts.merge(found_by: found_by(klass), confidence: config['confidence'] || DEFAULT_CONFIDENCE) ) end

两者的分工可以总结为:

层级类路径职责
插件存在性app/finders/plugins/body_pattern.rb命中模式即新建Model::Plugin,默认置信度 30
版本探测lib/wpscan/finders/dynamic_finder/version/body_pattern.rb命中模式并提取命名捕获组v,默认置信度 60

dynamic_finders.yml中version: true的条目(如本案例)走版本探测链路;而只关心插件是否存在的条目则通过插件层 finder 处理。两者共用同一份 YAML 指纹库,但消费路径不同,这是理解 WPScan 指纹机制的关键。

五、如何在实践中使用与验证

5.1 触发条件

要复现本指纹的探测行为,需要满足:

  • 目标 WordPress 站点确实安装了analytics-for-cloudflare插件;
  • 插件目录下的CHANGELOG.md可被公开访问(未做访问限制);
  • 扫描时启用了插件枚举,且该插件在指纹库中(dynamic_finders.yml中的analytics-for-cloudflare条目)。

5.2 关联测试与夹具

  • 指纹配置断言见 spec/fixtures/db/dynamic_finders.yml,可在 WPScan 数据库相关测试中验证条目加载正确性;
  • BodyPattern动态子类的生成与默认值行为见 spec/lib/finders/dynamic_finder/version/body_pattern_spec.rb;
  • 夹具数据即 spec/fixtures/dynamic_finders/plugin_version/analytics-for-cloudflare/change_log/CHANGELOG.md,其内容与线上插件更新日志保持一致,保证指纹匹配测试的真实性。

5.3 扩展思路

如果你要为其他插件编写类似指纹,可以遵循本案例的结构:

  1. 在dynamic_finders.yml中新增 slug 条目;
  2. 选择指纹类型(本案例为ChangeLog+class: BodyPattern);
  3. 给出正确的path(如CHANGELOG.md)与可提取版本的pattern(注意使用命名捕获组(?<v>...));
  4. 设置version: true并可选覆盖confidence;
  5. 在 spec/fixtures/dynamic_finders/plugin_version 下按 slug 建立夹具目录,放入与线上一致的CHANGELOG.md样本。

六、小结

analytics-for-cloudflare的ChangeLog指纹是理解 WPScan 动态指纹体系的最小完整样例:一份 CHANGELOG.md 夹具 + 一条 dynamic_finders.yml 配置,经由BodyPattern版本 finder 的运行时子类生成、被动/主动路径分派与正则命名捕获组提取,最终完成"文件可访问 → 插件存在 → 版本确定 → 关联漏洞库"的完整扫描链路。理解这条链路,就能触类旁通地读懂 WPScan 指纹库中数千条类似条目,也能自行扩展新的插件指纹。

  • 网络安全
  • 漏洞扫描
  • 渗透测试
  • 应用安全
  • CLI

【免费下载链接】wpscan

WPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contact@wpscan.com

项目地址:https://gitcode.com/gh_mirrors/wp/wpscan
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询