WPScan 插件版本检测实战:以 bonaire 的 CHANGELOG.md 为例解读 ChangeLog 动态查找器
网络安全漏洞扫描渗透测试应用安全CLI【免费下载链接】wpscanWPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contactwpscan.com项目地址https://gitcode.com/gh_mirrors/wp/wpscan点击查看免费下载导读WordPress 插件常常会随安装包附带一份CHANGELOG.md或changelog.txt其中按版本号记录了变更历史。WPScan 充分利用了这一事实在枚举插件版本时扫描器会主动请求这类变更日志文件并从其中的版本号行快速识别出插件当前版本。本文以仓库中 bonaire 插件版本检测的测试夹具fixtureCHANGELOG.md 为切入点结合expected.yml预期结果与dynamic_finders.yml配置、以及BodyPattern与 Readme 解析器的源码实现完整讲解 WPScan 的 ChangeLog 动态查找器Dynamic Finder的工作原理、配置写法与检测置信度帮助你理解扫描输出的版本号究竟从何而来。bonaire 插件的 CHANGELOG.md一份典型的版本检测目标仓库中spec/fixtures/dynamic_finders/plugin_version/bonaire/change_log/CHANGELOG.md是用于验证 WPScan 动态查找器行为的测试夹具完整内容如下# Change Log All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## Version 0.1.1 ### Changed - Code cleanup - Ensured compatibility with PHPMailer ## Version 0.1.0 First commit.这份文件本身是虚构插件bonaire的变更日志它遵循Keep a Changelog与Semantic Versioning语义化版本两个社区规范每个版本用## Version x.y.z标题隔开标题行中明确包含版本号。正是这种标题行携带版本号的固定格式让 WPScan 可以在拿到该文件后用一行正则即可稳定提取最新版本。与这份夹具对应的预期检测结果记录在 spec/fixtures/dynamic_finders/expected.yml 中bonaire: ChangeLog: number: 0.1.1 found_by: Change Log (Aggressive Detection) interesting_entries: - http://wp.lab/wp-content/plugins/bonaire/CHANGELOG.md, Match: Version 0.1.1该条目传达了三层关键信息检测类型为ChangeLogWPScan 将从插件自带的变更日志文件提取版本视为一种独立的动态查找器类型命中版本号为0.1.1即文件中以## Version 0.1.1标题出现、且按语义化版本排序后的最高版本命中方式为found_by: Change Log (Aggressive Detection)说明该检测属于主动Aggressive探测——扫描器会主动请求wp-content/plugins/bonaire/CHANGELOG.md这个 URL并在响应正文中匹配到Version 0.1.1字样。动态查找器机制ChangeLog 是允许的查找器类型之一ChangeLog并不是一个硬编码在扫描流程里的独立类而是通过 WPScan 的**动态查找器Dynamic Finder**体系驱动的。其核心配置定义在 lib/wpscan/db/dynamic_finders/base.rb 中# return [ ArraySymbol ] def self.allowed_classes # The Readme is not put in there as its not a Real DF, but rather using the DF system # to get the list of potential filenames for a given slug allowed_classes || %i[Comment Xpath HeaderPattern BodyPattern JavascriptVar QueryParameter ConfigParser] end从源码注释可以明确看到Readme被刻意排除在动态查找器之外因为readme.txt的解析是独立机制见下文而BodyPattern等类才是真正的动态查找器。ChangeLog检测正是通过配置为class: BodyPattern的条目来实现的——这一点可以在真实配置 spec/fixtures/db/dynamic_finders.yml 中看到典型写法以2fas插件为例2fas: ChangeLog: class: BodyPattern path: changelog.txt pattern: !ruby/regexp /^ (?v\d\.[\.\d])/i version: true Readme: path: readme.txt TranslationFile: class: BodyPattern path: languages/2fas-pt_BR.po pattern: !ruby/regexp /ion: 2FAS [^\s] Two Factor Authentication (?v\d\.[\.\d])/i version: true这里展示了动态查找器配置的通用结构每一项字段含义如下字段含义示例值ChangeLog/TranslationFile等动态查找器名称用于定位配置ChangeLogclass实际使用的查找器实现类必须属于allowed_classesBodyPatternpath相对插件目录wp-content/plugins/slug/的检测文件路径changelog.txt、CHANGELOG.md、languages/2fas-pt_BR.popattern提取版本号的正则必须包含(?v...)命名捕获组/^ (?v\d\.[\.\d])/iversion标记该查找器用于提取版本号而非用于确认插件存在true可以看出ChangeLog 类查找器的本质是在插件目录下某个已知路径的变更日志文件中用正则匹配版本号。只要path指向changelog.txt、CHANGELOG.md等约定文件名并给出适配该文件格式的pattern即可完成一次版本探测。配置的分发由 lib/wpscan/db/dynamic_finders/base.rb 中的method_missing完成当代码调用aggressive_xxx_finder_configs之类的接口时会根据allowed_classes校验类名再返回对应查找器配置。而expected.yml中 bonaire 条目的found_by: Change Log (Aggressive Detection)正是这种Aggressive ChangeLog组合在输出层呈现出来的形式。BodyPattern 底层实现一次请求 一次正则匹配ChangeLog 检测最终由BodyPattern类执行。其实现位于 lib/wpscan/finders/dynamic_finder/version/body_pattern.rbclass BodyPattern Finders::DynamicFinder::Version::Finder # return [ Hash ] def self.child_class_constants child_class_constants || super.merge(PATTERN: nil, CONFIDENCE: 60) end # param [ Typhoeus::Response ] response # param [ Hash ] opts # return [ Version ] 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 end其工作流程可以拆解为四步发起请求aggressive模式会根据配置中的PATH拼出完整 URL 并发起请求调用链见 lib/wpscan/finders/dynamic_finder/finder.rbdef aggressive(opts {}) return unless self.class::PATH find(Browser.get(target.url(self.class::PATH)), opts) end排除 404只有响应状态码不是 404 时才继续匹配避免把文件不存在误判为版本信息。正则提取将响应正文与配置中的PATTERN进行匹配并通过命名捕获组(?v...)取出版本号。生成 Version 模型调用 lib/wpscan/finders/dynamic_finder/version/finder.rb 的create_version把正则匹配片段写入interesting_entries——这与expected.yml中Match: Version 0.1.1的格式完全吻合同时BodyPattern类默认置信度为60CONFIDENCE: 60。每个插件的查找器子类都由create_child_class见 lib/wpscan/finders/dynamic_finder/finder.rb在运行时按dynamic_finders.yml中的配置动态生成因此2fas的changelog.txt与 bonaire 的CHANGELOG.md虽然在文件路径与格式上不同却可以复用同一套BodyPattern逻辑。Readme 解析中的 ChangeLog Section另一种版本来源除了直接请求插件的CHANGELOG.mdWPScan 还会在解析插件标准的readme.txt时把其中的 **Changelog 章节ChangeLog Section**作为第二重版本来源。相关实现位于 app/finders/plugin_version/readme.rb# return [ String, nil ] The best version number detected from the changelog section def from_changelog_section(body) extracted_versions body.scan(/^\s(?:v(?:ersion)?\s*)?([0-9.-])[^]*$/i) return if extracted_versions.nil? || extracted_versions.empty? extracted_versions.flatten! # must contain at least one number extracted_versions extracted_versions.grep(/[0-9]/) sorted extracted_versions.sort do |x, y| Gem::Version.new(x) Gem::Version.new(y) rescue StandardError 0 end sorted.last end这段逻辑与 bonaire 的CHANGELOG.md场景高度呼应它扫描 版本号 形式的章节标题行兼容v/version前缀过滤掉不含数字的行再借助 Ruby 的Gem::Version对提取出的版本号做语义化排序取排序后的最后一个即最高版本作为检测结果。在 app/finders/plugin_version/readme.rb 的version_numbers方法中两个来源会被合并返回并携带不同的置信度来源found_by 消息置信度Stable TagReadme - Stable Tag (Aggressive Detection)80ChangeLog SectionReadme - ChangeLog Section (Aggressive Detection)50置信度差异体现了工程上的审慎Stable Tag是插件作者在 readme 头部声明的正式版本号可信度更高而从 Changelog 章节推断出的版本虽然实用但由于历史版本章节可能残留、格式不规范等原因可信度相对较低。对应的测试位于 spec/app/finders/plugin_version/readme_spec.rb其中用一个哈希表覆盖了大量真实插件的变化日志格式变体如1.3、2.64、2.0.66.33、1.2.3、2.1.5、3.1、1.5.9、1.0.4、2.27等逐一断言from_changelog_section的提取结果——这也为ChangeLog 检测对格式差异有较强容忍度提供了测试层面的佐证。如何在真实扫描中验证要在真实环境复现上述检测行为只需对目标站点运行插件枚举主动模式WPScan 会依次请求目标wp-content/plugins/slug/下的readme.txt、CHANGELOG.md、changelog.txt等已知路径ruby wpscan.rb --url https://example.com --enumerate p --plugins-detection aggressive当检测命中时CLI 输出中会以[!]行列出插件版本其found_by字段即本文所述来源之一如Change Log (Aggressive Detection)或Readme - ChangeLog Section (Aggressive Detection)。需要说明的是前提是目标站点允许通过 HTTP 直接访问这些文件——若服务器屏蔽了CHANGELOG.md这类路径或返回 404BodyPattern#find会因response.code ! 404判断失败而返回nil该来源自然失效这与源码中的守卫条件一致。小结通过 bonaire 的 CHANGELOG.md 这份测试夹具可以梳理出 WPScan 插件版本检测的一条完整链路约定路径变更日志文件CHANGELOG.md/changelog.txt作为可被主动探测的公开文件是版本信息的天然泄露点动态配置dynamic_finders.yml中以ChangeLogBodyPatternpathpattern描述检测方式运行时通过create_child_class动态生成查找器底层匹配BodyPattern#find通过一次 HTTP 请求与一次正则匹配提取(?v...)命名组并记录interesting_entries与默认置信度 60双保险readme 解析器的from_changelog_section另行从 版本 章节提取版本两者互为补充最终汇总到Version模型供扫描结果输出。理解这条链路有助于安全研究者判断扫描报告中插件版本号的可信度来源也能帮助插件开发者认识到一份格式规范的 CHANGELOG 文件本身就是站点安全信息暴露面的一部分。赞分享网络安全漏洞扫描渗透测试应用安全CLI【免费下载链接】wpscanWPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contactwpscan.com项目地址https://gitcode.com/gh_mirrors/wp/wpscan点击查看免费下载相关推荐WPScan 插件版本检测实战以 Clear Floats Button 的 CHANGELOG.md 动态查找器为例WPScan 插件版本检测实战以 Clear Floats Button 的 CHANGELOG.md 动态查找器为例 本文以 WPScan 仓库中 clea网络安全漏洞扫描渗透测试应用安全CLIWPScan 插件版本检测实战以 get-the-image 的 changelog.md 为例解析 ChangeLog 动态查找机制WPScan 插件版本检测实战以 get the image 的 changelog.md 为例解析 ChangeLog 动态查找机制 导读 WordPres网络安全漏洞扫描渗透测试应用安全CLIWPScan 动态识别插件版本以 BlockMeister 的 changelog.md 为例解读 ChangeLog 探测机制WPScan 动态识别插件版本以 BlockMeister 的 changelog.md 为例解读 ChangeLog 探测机制 导读 本文围绕 WPScan网络安全漏洞扫描渗透测试应用安全CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CSDN转载操作指南:从授权确认到发布管理的完整避坑教程

CSDN转载操作指南:从授权确认到发布管理的完整避坑教程

作为一个在 CSDN 上断断续续写了六七年东西的人,我非常清楚一件事:转载这个功能,是很多内容创作者的“第一个台阶”,也是最容易被拿出来讨论的功能之一。现在所谓的“创作者成长”,通常不是说每个人都要从零开始生产原…

2026/9/25 12:48:22 阅读更多 →
基于Atlas 300V部署YOLOv5全流程:从ATC转换到ACL推理实战

基于Atlas 300V部署YOLOv5全流程:从ATC转换到ACL推理实战

1. 项目概述与核心需求解析1.1 “atlas”到底是什么,为什么你需要关注它聊到“atlas”这个词,如果你关注过AI推理加速、边缘计算或者嵌入式视觉方向,大概率会第一时间想到昇腾的Atlas系列。这么多年我在实际项目里摸爬滚打,Atlas这…

2026/9/25 12:48:22 阅读更多 →
人机交互实验报告与GOMS、Fitts、可用性量表完整复现指南

人机交互实验报告与GOMS、Fitts、可用性量表完整复现指南

简介:面向高校计算机相关专业学生的“人机交互”课程配套资料,内容涵盖从基础实验到综合大作业的完整过程。资源包含实验报告、讲义演示文档、源码工程以及三维虚拟现实场景等,覆盖二维交互画板、语音交互程序、订单管理系统界面设计、虚拟现…

2026/9/25 12:48:22 阅读更多 →

最新新闻

Atlas 300V 24G推理卡部署YOLOv5全流程实战指南

Atlas 300V 24G推理卡部署YOLOv5全流程实战指南

最近后台连续收到好几条差不多的提问:Atlas 300V 24G是不是运算加速卡啊,能不能拿来部署YOLO?问的人多了,我就知道这不是个例,而是大家在采购清单、项目验收文件、二手平台里看到“Atlas 300V 24G”这个型号之后的普遍…

2026/9/25 13:31:51 阅读更多 →
2025年AI工具出海:小众赛道爆品策略与实操指南

2025年AI工具出海:小众赛道爆品策略与实操指南

1. 为什么“小众赛道”反而更容易跑出AI工具爆品1.1 从“大而全”到“窄而深”的转向2025年做AI工具,如果还想着做一个“什么都能干”的通用助手,基本等于在红海里跟巨头正面硬刚。我观察了最近一年冒出来的几十款有真实营收的AI产品,发现一个…

2026/9/25 13:31:51 阅读更多 →
Atlas 300V 24G推理加速卡详解:从CANN环境到YOLO部署全流程

Atlas 300V 24G推理加速卡详解:从CANN环境到YOLO部署全流程

“atlas部署yolo”和“atlas 300v 24g是运算加速卡吗”这两个搜索词一起出现在热搜榜,我一点都不意外。前者是想在Atlas上跑目标检测的开发者,后者多半是正在纠结要不要下单买卡的选型用户。Atlas这个产品线在AI圈子里出现的频率越来越高,但同…

2026/9/25 13:31:51 阅读更多 →
Atlas 300V 24G加速卡详解:从模型转换到YOLO推理全流程实战

Atlas 300V 24G加速卡详解:从模型转换到YOLO推理全流程实战

最近后台被问得最多的一句话是:“atlas 300v 24g 是运算加速卡吗?”紧接着往往会跟一条:“我打算在atlas上部署yolo,流程到底怎么走?”这两个问题其实是一件事的两面。很多人第一次接触华为昇腾Atlas平台,都…

2026/9/25 13:31:51 阅读更多 →
open-code-review:从流程到工具的代码评审最佳实践

open-code-review:从流程到工具的代码评审最佳实践

我在两年前把团队内部的代码评审机制重新整理了一遍,仓库名就叫open-code-review。这个名字起得很直白,目标是想让代码评审从“两个人关起门来看一眼”变成“所有人都能看见、都能评论、事后还能复盘”的开放过程。当时团队正处在从八个人扩张到三十个人…

2026/9/25 13:31:51 阅读更多 →
miniSQL实战指南:手写数据库内核的四大模块与避坑方法

miniSQL实战指南:手写数据库内核的四大模块与避坑方法

简介:本资源是浙江大学数据库设计课程期末大作业成果——miniSQL轻量级数据库管理系统,面向数据库原理学习者、C/C系统编程初学者及课程实践者,旨在通过完整可运行的DBMS实例,深入理解SQL解析、事务处理、B树索引、缓冲区管理等核…

2026/9/25 13:30:51 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →