- 网络安全
- 漏洞扫描
- 渗透测试
- 应用安全
- 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
本文围绕 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 | — | 指纹块名称,表示探测源是插件的更新日志文件 |
class | BodyPattern | 指定使用正文模式匹配(BodyPattern)类来执行探测 |
path | CHANGELOG.md | 主动(aggressive)模式下要请求的插件内文件路径,即wp-content/plugins/analytics-for-cloudflare/CHANGELOG.md |
pattern | /\#\# (?<v>\d+\.[\.\d]+)/ | 用于从响应正文中提取版本号的正则,其中命名捕获组(?<v>...)是版本号的出口 |
version | true | 表明该指纹用于探测版本(而非仅确认插件存在) |
也就是说,只要目标站点返回的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关键点:
- 响应状态码为 404 时直接放弃(文件不存在即插件未安装);
- 用配置中的
PATTERN对响应正文做正则匹配; - 通过命名捕获组
(?<v>...)取出Regexp.last_match[:v]作为版本号; - 将匹配到的 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 扩展思路
如果你要为其他插件编写类似指纹,可以遵循本案例的结构:
- 在
dynamic_finders.yml中新增 slug 条目; - 选择指纹类型(本案例为
ChangeLog+class: BodyPattern); - 给出正确的
path(如CHANGELOG.md)与可提取版本的pattern(注意使用命名捕获组(?<v>...)); - 设置
version: true并可选覆盖confidence; - 在 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
相关推荐
WPScan 插件版本指纹实战:以 OptinMonster CHANGELOG 指纹为例
WPScan 插件版本指纹实战:以 OptinMonster CHANGELOG 指纹为例 本文以 WPScan 仓库中一份真实测试样例——OptinMonst
网络安全漏洞扫描渗透测试应用安全CLI深度解析 WPScan 动态版本识别:以 404-solution 插件 CHANGELOG.md 指纹为例
深度解析 WPScan 动态版本识别:以 404 solution 插件 CHANGELOG.md 指纹为例 WPScan 作为 WordPress 安全扫描器
网络安全漏洞扫描渗透测试应用安全CLIWPScan 插件版本检测实例:以 MultiSafepay CHANGELOG.md 为例解析 ChangeLog 动态指纹机制
WPScan 插件版本检测实例:以 MultiSafepay CHANGELOG.md 为例解析 ChangeLog 动态指纹机制 本文以 WPScan 测试夹
网络安全漏洞扫描渗透测试应用安全CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考