
网络安全漏洞扫描渗透测试应用安全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 仓库中保存的真实插件变更日志 CHANGELOG.md 为分析样本讲解 WPScan 如何借助 Dynamic Finder 机制通过正则匹配插件服务器上的 CHANGELOG.md 文件标题来精确反推 WordPress 插件版本号。读完本文你将掌握 WPScan 版本指纹的配置格式、正则捕获逻辑与底层执行链路并理解变更日志本身也是版本泄露面这一安全事实。一、CHANGELOG.md 在 WPScan 版本指纹体系中的角色WPScan 在被动/主动探测插件版本时并不依赖单一信息源。除了经典的readme.txt之外插件作者留在站点根目录中的CHANGELOG.md也会被纳入指纹候选。仓库中以 themeisle-companion 插件命名的目录 change_log 中保存的正是该插件真实发布过的完整变更日志——这份文件在仓库里的身份是一个fixture测试固件用于驱动 Dynamic Finder 的版本解析与相关测试。这份 CHANGELOG.md 记录了 themeisle-companion曾用名 Orbit Fox Companion从 v2.0.0 到 2.10.4 的历次发布跨度从 2017 年 8 月到 2021 年 3 月共 469 行。它的价值体现在两个层面对插件作者是面向用户的版本变更说明遵循了规范的语义化版本号SemVer标题格式对安全扫描器标题中规律出现的版本号恰好构成可被正则稳定提取的指纹数据源。二、版本标题的两种典型格式通读这份 CHANGELOG.md 可以发现版本标题存在两种书写风格这正是动态指纹配置中正则需要兼容两类写法的原因。格式一Markdown 链接式标题2.9.x 之后的写法##### [Version 2.10.4](https://github.com/Codeinwp/themeisle-companion/compare/v2.10.3...v2.10.4) (2021-03-09) - [Fix] Translations and text-domain issues - [Fix] Translation and text-domain issues.#### [Version 2.10.0](https://github.com/Codeinwp/themeisle-companion/compare/v2.9.19...v2.10.0) (2020-10-09) - New Custom Fonts module格式二纯文本式标题2.8.x 及更早的写法### v2.8.14 - 2019-12-02 **Changes:** * Fix fatal error with Membership Pro * Various bug fixes to forms and Elementor widgets### v2.0.0 - 2017-08-11 **Changes:** * Major code refactor ( TEST before update! ) * Added sharing feature. * Added simple reporting functionality. * Branded to Orbit Fox companion两种格式的共同点是版本号都出现在#标题行内且都遵循数字.数字[.数字]形态。区别在于格式一将版本号嵌在[Version ...]链接文本中格式二则用v前缀加日期后缀。WPScan 的指纹正则需要同时吞下这两种写法。三、dynamic_finders.yml 中的 ChangeLog 指纹配置WPScan 的动态查找器数据库位于 dynamic_finders.yml每个插件可注册多条指纹。themeisle-companion 注册了四条见 dynamic_finders.yml 第 112529-112550 行themeisle-companion: QueryParameter: files: - obfx_modules/menu-icons/css/public.css - obfx_modules/gutenberg-blocks/assets/fontawesome/css/all.min.css - obfx_modules/gutenberg-blocks/assets/fontawesome/css/v4-shims.min.css version: true ChangeLog: class: BodyPattern path: CHANGELOG.md pattern: !ruby/regexp /\# (?:\[Version (?v\d\.[\.\d])\]|v?(?v\d\.[\.\d]) \- [\d\-\/]{8,})/i version: true Readme: path: - readme.txt - readme.md TranslationFile: class: BodyPattern path: languages/themeisle-companion.pot pattern: !ruby/regexp /Project\-Id\-Version: Orbit Fox Companion (?v\d\.[\.\d])/i version: true逐字段解读这条ChangeLog指纹配置项取值含义ChangeLog指纹名键名即 Finder 类名标识这是一条变更日志型指纹classBodyPattern指定使用 BodyPattern 查找器直接对响应正文做正则匹配pathCHANGELOG.md探测时请求的相对路径即站点根目录/wp-content/plugins/themeisle-companion/CHANGELOG.mdpattern见上用于匹配版本标题并捕获版本号的 Ruby 正则!ruby/regexp表示 YAML 中的 Ruby 正则字面量versiontrue声明该指纹可用于提取版本号注意pattern中的/i结尾标志整个匹配不区分大小写因此插件作者把标题写成Version、version、VERSION都能命中。四、正则 pattern 的逐段拆解与实测匹配把上文的 pattern 展开并分行\# (?:\[Version (?v\d\.[\.\d])\]|v?(?v\d\.[\.\d]) \- [\d\-\/]{8,})/i各组成部分的作用如下\#匹配一个或多个#前缀Markdown 标题符加一个空格对应 CHANGELOG 中的###、####、#####各级标题(?: ... | ... )非捕获分组二选一匹配两种格式分支一\[Version (?v\d\.[\.\d])\]匹配[Version 2.10.4]这类链接文本。(?v...)是命名捕获组捕获的\d\.[\.\d]匹配2.10.4、2.9.19这类主版本号 任意层小数段链接的 URL 部分compare 链接不被匹配因为正则未要求]后接 URL分支二v?(?v\d\.[\.\d]) \- [\d\-\/]{8,}匹配v2.8.14 - 2019-12-02这类写法——v?表示可选的v前缀随后捕获版本号再匹配-与至少 8 个日期字符\d\-\/覆盖2019-12-02、2019/12/02等日期分隔写法。用真实文件逐条验证两份样本均能命中并提取出版本号CHANGELOG.md 原始行命中分支捕获的:v##### Version 2.10.4 (2021-03-09)分支一2.10.4#### Version 2.10.0 (2020-10-09)分支一2.10.0### v2.8.14 - 2019-12-02分支二2.8.14### v2.0.0 - 2017-08-11分支二2.0.0这也解释了为何该插件在 2.9.x 前后改换标题写法后指纹依然有效正则从一开始就为两种风格都预留了捕获路径。五、BodyPattern 版本查找器的源码执行链路配置中的class: BodyPattern决定了探测请求返回后由哪段代码负责解析。整个链路分三层均在仓库源码中可查证。第一层通用版本查找器基类lib/wpscan/finders/dynamic_finder/version/finder.rb基类Finder提供create_version(number, finding_opts)将捕获到的字符串包装为Model::Version并注入found_by与confidence两个元数据字段用于在扫描报告中标注该版本由什么指纹、以多大置信度发现。第二层BodyPattern 版本查找器lib/wpscan/finders/dynamic_finder/version/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 响应用self.class::PATTERN对响应正文执行正则匹配该常量由 YAML 配置注入匹配成功后通过命名捕获组[:v]取出版本号并把匹配到的原文记录进interesting_entries方便安全分析人员回看取证该层默认置信度为CONFIDENCE: 60见同文件child_class_constants。第三层插件级 BodyPattern 包装app/finders/plugins/body_pattern.rbWPScan::Finders::Plugins::BodyPattern继承DynamicFinder::WpItems::Finder负责插件存在性判定当响应正文命中配置的pattern时构造一个Model::Plugin对象并标记found_by与置信度未显式配置时回落至DEFAULT_CONFIDENCE 30。由此可以推断完整的执行流程WPScan 探测CHANGELOG.md路径 → 拿到非 404 响应 → 正则命中标题行 → 提取:v捕获组 → 创建带置信度与取证条目的Model::Version→ 汇总进扫描结果的插件版本字段。从源码结构看Readmereadme.txt/readme.md、TranslationFile.pot 头部的Project-Id-Version等其他指纹走的是同一条 BodyPattern 通道只是path与pattern不同。六、CHANGELOG 背后themeisle-companion 的功能演进既然这份变更日志是真实的插件发布史它也顺带勾勒出插件本身的能力版图。将全部版本条目按主题归纳如下均以原文档记录为准页面构建器生态2.3.0 引入 Elementor 的表单Contact / Newsletter / Registrationwidget2.2.6 / 2.4.7 加入 Beaver Builder 的 Pricing Table、Services、Posts Grid widget2.2.0 上线 Elementor Widgets 模块与 Template Directory 模板目录模块Gutenberg 集成2.6.0 加入 Font Awesome、Google Maps、Notice、Sharing Icons、Pie Charts、Plugin Card、Pricing、Testimonial、Click to Tweet、Post Grid 等区块2.7.x 起持续更新 Gutenberg blocks 库媒体与图像2.1.0 集成 mystock.photos 免费图库导入2.5.8 / 2.6.2 / 2.7.5 分阶段灰度上线 Image CDN 与图片优化模块后迁移至 Optimole 插件站点运营类模块2.4.2 加入 Google Analytics 集成2.4.0 加入 Uptime Monitor2.5.0 加入隐私政策 Cookie 通知模块2.9.9 加入 Header/Footer Scripts 模块2.10.0 加入 Custom Fonts 模块品牌与架构2.0.0 完成Major code refactor并品牌化为 Orbit Fox Companion2.9.0 移除遗留模块2.9.13 移除 Starter Sites 库2.10.1 加入 Post Type Grid 的升降序选项、移除 Google Plus 分享。对安全研究视角而言这份演进史还透露了一个重要细节插件曾在 v2.0.0 发生大规模重构、v2.8.x 频繁发布修复——此类重构/热修复窗口期正是漏洞研究的高价值时间点而 CHANGELOG 恰好把这些窗口期如实标注了出来。七、实践启示变更日志既是文档也是版本泄露面对插件开发者保持版本标题格式统一WPScan 的 pattern 要求版本号出现在#标题行内[Version x.y.z]或v x.y.z - 日期均可。若版本号只出现在正文列表里而不在标题中指纹将无法稳定捕获版本号必须与 readme.txt 的 Stable Tag 保持一致仓库中该插件的Readme指纹与ChangeLog指纹并存二者若不一致扫描器会得到互相矛盾的版本结论注意 .pot 翻译文件同样泄露版本该插件的TranslationFile指纹通过Project-Id-Version: Orbit Fox Companion x.y.z提取版本说明版本信息会通过多种文件形式外泄仅隐藏 readme.txt 并不能隐身。对安全分析人员通过 BodyPattern 查找器 的interesting_entries可以直接复现哪一行标题命中了正则作为渗透报告中的取证片段批量审计 WordPress 站点时CHANGELOG.md是 readme.txt 之外的可靠第二指纹源——正如本文样本所示一份长期维护、格式规范的变更日志几乎等价于一份版本号公开清单。八、延伸阅读指纹配置全文dynamic_finders.ymlthemeisle-companion 条目见第 112529-112550 行版本提取实现version/body_pattern.rb、version/finder.rb插件级 BodyPattern 判定app/finders/plugins/body_pattern.rb传统 readme.txt 版本解析含 ChangeLog Section 分支app/finders/plugin_version/readme.rb分析样本原文themeisle-companion 的 CHANGELOG.md赞分享网络安全漏洞扫描渗透测试应用安全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 动态指纹实战从 Post Type Switcher 的 CHANGELOG.md 识别 WordPress 插件版本WPScan 动态指纹实战从 Post Type Switcher 的 CHANGELOG.md 识别 WordPress 插件版本 导读 本文以 WPSca网络安全漏洞扫描渗透测试应用安全CLIWPScan 动态指纹识别实战基于 CHANGELOG.md 的 WordPress 插件版本探测机制解析WPScan 动态指纹识别实战基于 CHANGELOG.md 的 WordPress 插件版本探测机制解析 WPScan 是面向安全研究人员与 WordPre网络安全漏洞扫描渗透测试应用安全CLIWPScan 动态指纹实战如何利用插件的 CHANGELOG.md 精准识别 WordPress 插件版本WPScan 动态指纹实战如何利用插件的 CHANGELOG.md 精准识别 WordPress 插件版本 导读 本文以 WPScan 仓库中 dispens网络安全漏洞扫描渗透测试应用安全CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考