WPScan 动态版本识别实战:从 Crosswinds Blocks 插件 changelog.md 看 BodyPattern 查找器的工作原理
网络安全漏洞扫描渗透测试应用安全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 仓库中 Crosswinds Blocks 插件的changelog.md测试夹具为切入点系统讲解 WPScan 如何利用动态查找器Dynamic Finder从插件自带的变更日志文件中自动提取版本号。读完本文你将掌握dynamic_finders.yml中 ChangeLog 类配置的完整语义、BodyPattern 匹配正则的编写规则、被动/主动两种检测模式的差异以及如何通过仓库内的测试用例验证这一识别链路。一、场景背景为什么一份 changelog 会成为版本指纹WordPress 插件在发布时通常会在根目录附带readme.txt、changelog.md或changelog.txt等元数据文件。其中changelog文件会按版本号分段记录每次更新的内容例如本文主角 crosswinds-blocks/change_log/changelog.md 中记录的三个版本版本号发布日期变更要点1.0.22023-11-20修复部分文件未进入 SVN 仓库的问题1.0.12023-11-18修复版权块问题更新 Crosswinds Framework 与 Crosswinds Blocks 的品牌信息1.02023-10-28首次发布到仓库从结构上看该 changelog 的版本条目遵循统一模式——以##开头的 Markdown 二级标题承载版本号如## 1.0.2 - November 20, 2023。这种机器可读、规律稳定的格式恰好为 WPScan 提供了理想的版本指纹只要插件目录下存在该文件扫描器就能通过正则匹配定位版本号。注意该 changelog 存放在插件change_log/子目录下文件路径为change_log/changelog.md而 WPScan 的配置中使用的路径为changelog.md二者之间的对应关系由实际目标站点上插件目录结构决定详见下文第三节。二、核心机制Dynamic Finder 与版本提取的完整链路WPScan 并不为每个插件手写版本探测逻辑而是维护一张集中式的查找器配置表 spec/fixtures/db/dynamic_finders.yml运行时按需为每个插件动态生成查找器类。Crosswinds Blocks 的配置位于该文件的第 31618-31627 行crosswinds-blocks: ChangeLog: class: BodyPattern path: changelog.md pattern: !ruby/regexp /\#\# (?v\d\.[\.\d])/ version: true Readme: path: - readme.txt - readme.md这段配置揭示了版本提取链路的关键要素查找器名称ChangeLog声明这是一个基于变更日志文件的查找器。class: BodyPattern指定实现类。BodyPattern 是 WPScan 的动态版本查找器之一对应源码 lib/wpscan/finders/dynamic_finder/version/body_pattern.rb其类注释明确指出它典型用于响应体并非 HTML 文档、无法使用 XPath 的场景——changelog 是纯文本/Markdown 文件正好落入此类。path: changelog.md主动aggressive模式下请求的相对路径拼接在插件 URL 之后。pattern核心版本提取正则。/\#\# (?v\d\.[\.\d])/的含义是匹配以##开头、后跟形如1.0.2或1.0.2.1的版本串并通过命名捕获组(?v...)捕获版本号。这正是为了匹配前文 changelog 中## 1.0.2 - November 20, 2023这类标题行。version: true标记该查找器产出的是版本而非其他类型的发现项。版本如何被消费匹配到的版本号会进入 Finder 基类 的create_version方法被包装为WPScan::Model::Version对象并携带found_by来源标识与confidence置信度两个元数据字段。BodyPattern 类在 child_class_constants 中为CONFIDENCE设定的默认值是60可在配置中用confidence键覆盖。源码级匹配逻辑BodyPattern 的find方法body_pattern.rb逻辑非常简洁但严谨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文件不存在404时直接返回nil不产生误报正则匹配响应体使用配置注入的PATTERN常量即上文的/\#\# (?v\d\.[\.\d])/扫描文件内容记录来源证据将effective_url与完整匹配结果一并写入interesting_entries方便审计版本号到底是从哪个 URL、哪段文本提取出来的。三、被动与主动两种检测模式的差异依据 spec/lib/finders/dynamic_finder/plugin_version_spec.rb 中的测试约定带path配置的查找器如 Crosswinds Blocks 的 ChangeLog行为如下模式行为测试断言被动passive仅分析首页与 404 页的响应体不会请求changelog.md当配置了path时被动模式直接返回nil见 L68-L73主动aggressive显式请求plugin.url(config[path])即目标站点的changelog.md路径再对其响应体做正则匹配命中则返回WPScan::Model::Version未命中返回nil这一设计的原因是changelog 等内部文件不会出现在首页 HTML 中被动扫描只读首页/404 页无法获取其内容只有主动扫描才值得发出额外请求去抓取该文件。测试代码通过stub_request(:get, plugin.url(config[path])).to_return(stubbed_response)模拟响应L151-L153夹具文件正是spec/fixtures/dynamic_finders/plugin_version/crosswinds-blocks/change_log/changelog.md。四、用仓库测试验证changelog 夹具如何被断言在 plugin_version_spec.rb 的版本被检测到分支L156-L177中针对 Crosswinds Blocks 的期望结果定义在spec/fixtures/dynamic_finders/expected.yml。验证逻辑包含四条断言version必须是WPScan::Model::Version实例version.number必须等于期望版本号对本文夹具而言正则会命中## 1.0.2 - November 20, 2023这一行提取出1.0.2即该 changelog 中的最新版本version.found_by与期望的发现途径一致version.interesting_entries与期望条目完全匹配包含effective_url与正则匹配片段且若配置了confidence还需校验置信度值。测试注释还给出了一条排错建议失败时可用rspec -e 完整描述定向运行单个用例例如rspec -e WPScan::Finders::PluginVersion::CrosswindsBlocks::BodyPattern#aggressive另外plugin_version_spec.rb头部注释L19-L24说明了一个测试工程细节这类按配置自动生成的 spec 数以万计绝大多数被标记为slow仅在 master 全量套件中运行而每个父类/路径/版本键组合的第一个查找器不标记slow从而保证 PR 的覆盖率报告--tag ~slow中每一条底层代码路径至少被执行一次。五、从单个夹具到通用方法论Crosswinds Blocks 的 changelog 夹具只是dynamic_finders.yml中大量 ChangeLog 类配置的缩影。在 同一配置表 中可看到多种变体例如crowdcue插件使用/\#\# \[(?v\d\.[\.\d])\]/匹配## [1.0]这种带方括号的标题还有大量插件使用changelog.txt作为路径。这说明撰写新的动态查找器配置时只需把握三条原则正则必须与真实 changelog 格式对齐先观察目标插件 changelog 的版本标题写法## x.y.z、## [x.y.z]、### Version x.y.z等再设计对应的(?v...)命名捕获组路径必须精确path要指向插件根目录下真实的相对路径changelog.md、changelog.txt或如本案例的change_log/changelog.md的实际站点路径对应物保留version: true与可选的confidence确保结果被当作版本项消费并可按需调整置信度。六、总结通过本文的拆解可以看到一份看似平淡无奇的changelog.md在 WPScan 中承担着版本指纹库的角色它由 dynamic_finders.yml 声明识别规则由 BodyPattern 查找器 在主动模式下抓取并匹配最终经 Finder 基类 包装为带置信度与来源证据的版本对象并由 plugin_version_spec.rb 以自动化测试锁定正确行为。理解这条链路既能帮助你读懂 WPScan 的插件版本识别结果也能为你在实际工作中设计类似的从可公开访问文件中提取软件版本的指纹方案提供参考。赞分享网络安全漏洞扫描渗透测试应用安全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点击查看免费下载相关推荐从 CHANGELOG.md 到插件版本指纹WPScan 动态查找器如何用 BodyPattern 识别 array-partition 插件版本从 CHANGELOG.md 到插件版本指纹WPScan 动态查找器如何用 BodyPattern 识别 array partition 插件版本 导读 本文网络安全漏洞扫描渗透测试应用安全CLI从 CHANGELOG.md 到版本指纹WPScan 动态查找器识别插件版本的实战与原理从 CHANGELOG.md 到版本指纹WPScan 动态查找器识别插件版本的实战与原理 导读 本篇文章以 WPScan 仓库中 aw woocommerce网络安全漏洞扫描渗透测试应用安全CLIWPScan 动态查找器实战从插件 CHANGELOG.md 精确识别 WordPress 插件版本WPScan 动态查找器实战从插件 CHANGELOG.md 精确识别 WordPress 插件版本 导读 本篇文章以 WPScan 仓库内一份真实的 Wor网络安全漏洞扫描渗透测试应用安全CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

眼动模块完全指南:如何用一块圆屏让你的机器人拥有8种生动眼神

眼动模块完全指南:如何用一块圆屏让你的机器人拥有8种生动眼神

眼动模块完全指南:如何用一块圆屏让你的机器人拥有8种生动眼神 【免费下载链接】eye-tracking-module 源师兄扩展项目: 眼动模块 | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/eye-tracking-module eye-tracking-module(源师兄…

2026/9/25 12:45:20 阅读更多 →
破局80TB海量数据:金仓数据库源码级优化重塑智慧水利“最强大脑”实战配置

破局80TB海量数据:金仓数据库源码级优化重塑智慧水利“最强大脑”实战配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 12:45:20 阅读更多 →
Agent技能体系设计:从Prompt膨胀到可维护的Skill层

Agent技能体系设计:从Prompt膨胀到可维护的Skill层

过去三个月,我一直在跟"agent-skills"这四个字较劲。起因是自己维护的Agent项目越来越难维护:Prompt里堆了十几个技能说明,模型的调用准确率不升反降,每次改一个技能都像拆地雷。后来我把所有零散能力抽成了一套独立的技…

2026/9/26 13:25:27 阅读更多 →

最新新闻

代码阅读工作流实战:用 TaoToken 统一 Key 打通文件搜索、符号跳转与提问策略

代码阅读工作流实战:用 TaoToken 统一 Key 打通文件搜索、符号跳转与提问策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 16:40:44 阅读更多 →
5分钟读懂OpenManus配置:TaoToken统一Key接入Multi Agent实战

5分钟读懂OpenManus配置:TaoToken统一Key接入Multi Agent实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 16:40:44 阅读更多 →
多酒店预订系统实战:数据隔离、房态同步与三端接入

多酒店预订系统实战:数据隔离、房态同步与三端接入

简介:这是一套面向酒店行业开发者与中小连锁酒店经营者的多酒店预订管理系统源码,覆盖APP、H5与小程序三端,可解决分店扩张、房态同步、会员营销与内部协同等实际业务问题。资源包共2582个文件,约80.13MB,以1428个PHP业…

2026/9/26 16:40:44 阅读更多 →
手势识别打地鼠实战:MediaPipe+OpenCV从摄像头到锤子的完整链路

手势识别打地鼠实战:MediaPipe+OpenCV从摄像头到锤子的完整链路

简介:这是一份面向人机交互课程学习者与OpenCV入门开发者的完整项目资料,围绕手势识别控制的打地鼠游戏展开,可用于课程设计、实验复现与交互方式对比研究。资源包共27个文件,约60.1MB,包含6个Python源码文件、4个XML配…

2026/9/26 16:40:44 阅读更多 →
AiPy 为 openclaw 穿上安全铠甲:skill 随便用也不翻车的 TrustTools 配置骨架

AiPy 为 openclaw 穿上安全铠甲:skill 随便用也不翻车的 TrustTools 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 16:40:44 阅读更多 →
20家公司AI面试官吐血总结:3个月速成AI Agent开发,TaoToken统一Key接入Cline与CC Switch配置实战

20家公司AI面试官吐血总结:3个月速成AI Agent开发,TaoToken统一Key接入Cline与CC Switch配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 16:39:44 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

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

周新闻

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

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

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

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

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

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

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

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

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

2026/9/25 20:29:09 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/25 19:27:26 阅读更多 →