ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

WPScan 插件版本探测实战:基于 CHANGELOG.md 的 ChangeLog 动态查找器原理

WPScan 插件版本探测实战:基于 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点击查看免费下载WPScan 是面向安全专业人员与站点维护者的 WordPress 安全扫描器其插件/主题版本识别高度依赖一个称为Dynamic Finders动态查找器的机制从插件目录中各类可公开访问的文件readme.txt、CHANGELOG.md、CSS/JS 资源等里挖掘版本指纹。本篇将以仓库测试夹具中的一份真实插件变更日志 CHANGELOG.mdbeer-blocks 插件为切入点完整还原 WPScan 如何把CHANGELOG.md中的版本号解析为插件版本指纹从dynamic_finders.yml的配置字段到BodyPattern查找器的正则提取逻辑再到置信度与测试夹具在整个流水线中的角色。读完你不仅能读懂 WPScan 的 ChangeLog 探测原理还能在自己的插件指纹库中复刻这一模式。一、一份 CHANGELOG 就是一份版本指纹先看被分析的这份文件本体它位于仓库测试夹具目录spec/fixtures/dynamic_finders/plugin_version/beer-blocks/change_log/CHANGELOG.md## [1.0.1] - 2021-09-29 - Fix fa-icon block type ## [1.0.0] - 2021-09-29 - First release这是 WordPress 插件beer-blocks的变更日志2021-09-29 发布 1.0.0 首发版本同日补丁 1.0.1 修复 fa-icon 区块类型。从 WPScan 的视角看这份文件的价值不在文字而在结构Markdown 二级标题## [版本号]是高度规整、易于正则提取的版本标记。只要站点上存在可访问的wp-content/plugins/beer-blocks/CHANGELOG.md扫描器就能据此反推出插件版本进而关联漏洞数据库判断该版本是否存在已知漏洞。需要澄清的是这份文件本身只是 WPScan 测试体系中的输入样例fixture它的技术实质由其配套的查找器配置与实现代码共同定义。下面我们沿着配置 → 实现 → 测试的链路逐一展开。二、Dynamic FindersWPScan 的版本指纹机制2.1 为什么需要动态查找器WordPress 插件版本识别的传统做法是抓取readme.txt中的Stable tag字段但许多插件作者不会同步维护该字段或插件根本不含 readme.txt。Dynamic Finders 的诞生就是为了解决这种不确定性WPScan 把大量插件的可探测文件 版本提取正则预编译进一份数据库文件扫描时按插件 slug 动态实例化对应查找器逐个探测这些候选文件。这份数据库即 spec/fixtures/db/dynamic_finders.yml生产环境对应lib/db/dynamic_finders.yml由 lib/wpscan/db/dynamic_finders/base.rb 通过YAML.safe_load_file加载并允许Regexp类以支持正则字面量。2.2 允许的查找器类别lib/wpscan/db/dynamic_finders/base.rb 定义了受支持的查找器类别白名单allowed_classes || %i[Comment Xpath HeaderPattern BodyPattern JavascriptVar QueryParameter ConfigParser]Comment/Xpath解析 HTML 响应中的注释或 DOM 节点HeaderPattern/BodyPattern对响应头/响应体做正则匹配BodyPattern 专门用于响应体不是 HTML 文档的场景例如纯文本的 CHANGELOG.mdJavascriptVar/QueryParameter/ConfigParser分别面向 JS 变量、URL 查询参数与配置文件。base.rb 还通过method_missing暴露passive_*_finder_configs/aggressive_*_finder_configs两类查询入口供上层按攻击模式被动/主动取用配置——这解释了为何同一个插件可以同时配置被动与主动两种指纹。三、配置解读beer-blocks 的 ChangeLog 条目在 spec/fixtures/db/dynamic_finders.yml 中beer-blocks 的配置如下beer-blocks: ChangeLog: class: BodyPattern path: CHANGELOG.md pattern: !ruby/regexp /\#\# \[(?v\d\.[\.\d])\]/ version: true Readme: path: readme.txt逐字段拆解字段值含义ChangeLog节点名该指纹的语义标签class指明实际查找器类型classBodyPattern复用BodyPattern版本查找器白名单内pathCHANGELOG.md在插件目录下要探测的相对文件路径即wp-content/plugins/beer-blocks/CHANGELOG.mdpattern/\#\# \[(?v\d\.[\.\d])\]/提取版本的 Ruby 正则含命名捕获组(?v...)versiontrue该查找器的目标是提取版本号而非仅确认插件存在Readmepath: readme.txt同一插件还可叠加 readme.txt 通道见第五节3.1 正则的匹配逻辑以 fixture 文件首行为例## [1.0.1] - 2021-09-29\#\# \[匹配字面量## [\#转义#命名捕获组(?v\d\.[\.\d])\d匹配1\.匹配点号[\.\d]再吞入.0.1最终v 1.0.1行尾]完成闭合。由于扫描器默认对响应体取第一个正则匹配见下节实现fixture 中按时间倒序排列的1.0.1会被优先命中——这也是为什么作者总是把最新版本写在 changelog 最前面。四、源码级原理BodyPattern 版本查找器4.1 核心实现lib/wpscan/finders/dynamic_finder/version/body_pattern.rb 定义了实际执行逻辑class BodyPattern Finders::DynamicFinder::Version::Finder def self.child_class_constants child_class_constants || super.merge(PATTERN: nil, CONFIDENCE: 60) end 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关键行为前置条件响应码非 404且响应体与PATTERN正则匹配。PATTERN由 YAML 配置中的pattern注入子类常量合并机制版本提取通过命名捕获组Regexp.last_match[:v]取出版本字符串——这正是配置里(?v...)命名的原因证据留痕interesting_entries记录有效URL 完整匹配串便于输出报告与复核默认置信度CONFIDENCE: 60未在配置中显式覆盖时的取值。4.2 版本对象的组装lib/wpscan/finders/dynamic_finder/version/finder.rb 中的create_version将字符串包装为Model::Versiondef create_version(number, finding_opts) Model::Version.new(number, version_finding_opts(finding_opts)) end def version_finding_opts(opts) opts[:found_by] || found_by opts[:confidence] || self.class::CONFIDENCE opts end即每个探测结果会携带found_by定位方式与confidence置信度两个元数据供后续漏洞匹配与报告分级使用。4.3 类别与插件模型的桥接BodyPattern被同时桥接进两条动态查找器链路lib/wpscan/finders/dynamic_finder/wp_item_version.rb插件/主题的版本探测本案例所属链路lib/wpscan/finders/dynamic_finder/wp_version.rbWordPress 核心版本探测。五、双通道互补readme.txt 与 CHANGELOG.mdbeer-blocks 的配置同时声明了ChangeLog与Readme两条探测通道这种组合非常典型。Readme通道对应 app/finders/plugin_version/readme.rb 中的PluginVersion::Readme查找器其version_numbers方法按优先级收集两处版本信号if (number from_stable_tag(body)) numbers [number, Stable Tag, 80] end if (number from_changelog_section(body)) numbers [number, ChangeLog Section, 50] endfrom_stable_tag匹配stable tag: xxx或version: xxx置信度80from_changelog_section用/^\s(?:v(?:ersion)?\s*)?([0-9.-])[^]*$/i扫描 readme.txt 内嵌的 Changelog 区块等号标题风格取排序后的最大版本置信度50。对比可见readme.txt 中的 Stable Tag 权威性最高而独立的CHANGELOG.md文件BodyPattern置信度 60与其互为补充——一处缺失或失实时另一处仍可兜底完成版本判定。三种来源的置信度排序Stable Tag 80 CHANGELOG.md 60 readme 内嵌 Changelog 50也反映了 WPScan 对信号可靠性的内部评估。六、测试夹具的角色如何验证指纹有效性回到开篇的 fixture 文件它在仓库中的位置暴露了用途spec/fixtures/dynamic_finders/plugin_version/beer-blocks/change_log/CHANGELOG.md从目录结构看spec/fixtures/dynamic_finders/plugin_version/下按插件 slug 组织、每个插件目录内按查找器类别存放样例这份文件是动态查找器测试体系的标准输入样例与 spec/lib/db/dynamic_finders 下的动态查找器测试用例配套使用。其价值在于确定性验证用固定内容## [1.0.1]与## [1.0.0]两行验证pattern正则确实能从真实格式的 CHANGELOG 中提取出版本号防止正则退化格式覆盖- Fix fa-icon block type这类非版本行被刻意保留用于确认正则不会被正文内容误匹配回归保护任何对BodyPattern实现或 YAML 配置的改动都必须保证该样例仍能正确产出1.0.1。七、小结一条完整的版本识别链路把全文串起来WPScan 对 beer-blocks 这类插件的版本识别可归纳为一条流水线配置加载从 dynamic_finders.yml 读取beer-blocks.ChangeLog条目class: BodyPattern、path: CHANGELOG.md、pattern正则请求探测对站点发起wp-content/plugins/beer-blocks/CHANGELOG.md请求由动态查找器上层驱动区分被动/主动模式正则提取BodyPattern#find 匹配响应体通过命名捕获组(?v...)取出1.0.1置信度评估默认置信度 60与 readme.txt 的 Stable Tag80等信号并列版本建模create_version 生成带found_by/confidence/interesting_entries的Model::Version进入漏洞比对环节。这份 fixture 文档虽只有两行变更记录却精准刻画了 WordPress 生态中一种极其普遍的版本信息载体也展示了 WPScan 如何以配置 正则 通用查找器的组合用最小成本把任意插件的 CHANGELOG 转化为可用的安全情报。如果你在扩展自己的插件指纹完全可以照搬这套模式定义文件路径、编写带命名捕获组的正则、为不同来源分配置信度并用真实样例做回归测试——这正是本项目 Dynamic Finders 体系留给开发者的最佳实践模板。赞分享网络安全漏洞扫描渗透测试应用安全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 插件版本检测实战以 bonaire 的 CHANGELOG.md 为例解读 ChangeLog 动态查找器WPScan 插件版本检测实战以 bonaire 的 CHANGELOG.md 为例解读 ChangeLog 动态查找器 导读 WordPress 插件常常会网络安全漏洞扫描渗透测试应用安全CLIWPScan 插件版本检测实战以 gf-heidelpay 的 changelog 解析 ChangeLog 动态查找器原理WPScan 插件版本检测实战以 gf heidelpay 的 changelog 解析 ChangeLog 动态查找器原理 WPScan 作为 WordPr网络安全漏洞扫描渗透测试应用安全CLIWPScan 插件版本识别实战从 CHANGELOG.md 到 ChangeLog 动态查找器的完整链路WPScan 插件版本识别实战从 CHANGELOG.md 到 ChangeLog 动态查找器的完整链路 本文以 WPScan 仓库中 admin dashb网络安全漏洞扫描渗透测试应用安全CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表