WPScan 插件版本检测实战:以 bonaire 的 CHANGELOG.md 为例解读 ChangeLog 动态查找器

发布时间:2026/9/25 12:48:07

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),仅供参考
延伸阅读

更多相关文章

2026/9/25 12:48:07

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

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

2026/9/25 12:48:07

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

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

2026/9/25 12:48:06

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

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

2026/9/25 13:53:10

2026年冯校长老火锅靠谱吗,服务质量值得信赖吗

立足餐饮消费升级浪潮,锚定川味火锅文化传播新使命 顺应餐饮消费升级趋势,回应大众多元餐饮需求当前国内餐饮消费市场正从规模扩张向品质升级深度转型,消费者对餐饮的需求早已超越简单的果腹功能,转而追求地道的风味体验、多元的场…

2026/9/25 13:53:10

Agent技能模块化实战:解耦、注册表与稳定性设计

第一次尝试构建一个全能型Agent时,我很快发现了一个尴尬的事实:无论我把主循环写得多么巧妙,真正决定好不好用的,永远是那些挂在外面的小工具。我最早的那个Agent,里塞了几十种能力,从查天气到读PDF再到调用…

2026/9/25 13:53:10

Atlas 300V推理卡部署YOLO全攻略:从环境配置到性能调优

1. Atlas 300V到底是什么卡:先说清楚它的定位最近好几个做安防和工业视觉的朋友都在问同一个问题:Atlas 300V 24G 是不是运算加速卡?能不能用来跑YOLO?说实话,这个问题背后反映出一个普遍现象——很多人把昇腾的推理卡…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

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

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

2026/9/25 0:02:35

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

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

2026/9/25 0:02:35

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

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

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑