ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

WPScan 插件版本动态检测实战:以 plug-payments-gateway 插件的 Changelog 测试夹具为例

WPScan 插件版本动态检测实战:以 plug-payments-gateway 插件的 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 支付插件plug-payments-gateway的 CHANGELOG.md——为主线完整解析这份 Changelog 的结构规范、它在 WPScan 动态指纹库Dynamic Finder中扮演的角色以及 WPScan 是如何通过一条正则表达式从这种 Changelog 文件中挖出插件版本号并在 RSpec 测试中被逐行验证的。读完本文你将掌握Changelog 式版本披露文件的典型格式、WPScanBodyPattern检测器的实现原理以及如何为 WPScan 的动态检测贡献一个新的插件指纹。1. 这份文档是什么WPScan 测试夹具中的插件 Changelog该文件位于 WPScan 仓库的测试夹具目录spec/fixtures/dynamic_finders/plugin_version/plug-payments-gateway/change_log/CHANGELOG.md它模拟了一个真实 WordPress 插件plug-payments-gateway发布在服务器上、可被匿名访问的CHANGELOG.md文件。在 WPScan 的检测逻辑里攻击者或安全审计者无需读取插件源码只需请求http://target/wp-content/plugins/slug/CHANGELOG.md就能从文件中披露的版本号推断出插件的具体版本进而比对已知漏洞。这份夹具正是用来验证这条检测链路的靶子数据。文件全文如下即本文的主角文档## Changelog ## ### 0.1.0 - 2021-10-10 ### * Beta version release ### 0.1.1 - 2021-12-13 ### #### Fixes * Show only selected payment types at checkout ### 0.1.2 - 2021-12-14 ### #### Fixes * Fix the merchant id parameter that was not being passed in the request to the production api ### 0.1.3 - 2021-12-15 ### #### News * Adds functionality to copy pix code * Adds mobile version of pix screen #### Fixes * Fixes the way documents are retrieved from the form ### 0.1.4 - 2022-01-04 ### #### News * Add the Accept-Language parameter in the request header for the plugs api ### 0.1.5 - 2022-01-10 ### #### News * Improvement in unit tests * CI Implementation for Deployment * Add Lint and CodeSniffer ### 1.0.0 - 2022-01-11 ### * Optimize for publish on wordpress * Release :)从内容本身看这是一份符合 WordPress.orgreadme.txt惯用风格的变更记录顶级标题## Changelog ##每个版本一个三级标题格式固定为### 版本号 - 发布日期 ###按时间倒序排列最新的1.0.0在文件最底部不——该文件中1.0.0位于文件末尾0.1.0位于顶部每个版本条目下用#### Fixes/#### News分组列出变更说明。需要特别指出的是这个夹具的版本排列顺序版本号从文件顶部的0.1.0一路递增到底部的1.0.0时间正序。这与许多插件采用新版本在上的倒序写法不同而 WPScan 的正则设计恰好能兼容这两种顺序——这一点是理解第 3 节正则表达式的关键伏笔。从发布记录本身也能读出这条插件的时间线2021-10-10 首次 Beta0.1.0随后两周内密集修复了结账支付类型展示、生产 API 的merchant id参数丢失等缺陷0.1.1、0.1.20.1.3增加 Pix 支付码复制与移动端屏幕0.1.4为 Plug API 请求头补充Accept-Language参数0.1.5完善单元测试与 CI/CodeSniffer 工程化建设最终在 2022-01-11 以1.0.0正式Release :)。这些细节对检测器不重要但正是它们让这份夹具足够像真货能真实地触发解析逻辑。2. WPScan 的指纹配置一条正则定义如何找版本号WPScan 的核心指纹库位于 spec/fixtures/db/dynamic_finders.yml该 fixture 对应运行时动态检测库的测试数据。其中plug-payments-gateway的完整配置为plug-payments-gateway: ChangeLog: class: BodyPattern path: CHANGELOG.md pattern: !ruby/regexp /^\# (?v\d\.[\.\d])(?!.*\# \d\.[\.\d])/mi version: true Readme: path: README.md逐项拆解配置项取值含义ChangeLog检测器名表示从 Changelog 文件检测版本这一检测手段在输出中显示为Change Log (Aggressive Detection)class: BodyPattern检测器类使用 BodyPattern 对响应体做正则匹配适用于 HTML/XPath 不适用的纯文本响应path: CHANGELOG.md请求路径拼接到/wp-content/plugins/plug-payments-gateway/之后即 WPScan 实际发起的主动Aggressive请求目标pattern正则表达式从命中的标题行提取捕获组(?v…)作为版本号version: true布尔标记命中结果应被构造为一个Version对象而非仅仅记录发现了该文件核心正则的语义是/^\# (?v\d\.[\.\d])(?!.*\# \d\.[\.\d])/mi^\#行首一个或多个#Markdown 任意级标题兼容##、###等写法(?v\d\.[\.\d])命名捕获组v匹配1.0、0.1.5这类以数字.数字开头的版本号(?!.*\# \d\.[\.\d])负向前瞻——本行后续不能再出现标题符号 版本号的组合/mi忽略大小写、逐行匹配.不跨行。这套正则的设计意图可以这样理解它只接受标题行以版本号开头的写法恰好覆盖### 1.0.0 - 2022-01-11 ###这种格式而负向前瞻排除了同一行还挂着另一个版本号的复合标题。由于 Ruby 正则的~返回的是全文第一次命中位置在最新版本在文件最上方的倒序 Changelog 里命中点就是最新版本在本夹具这种正序排列里命中的则是0.1.0——但夹具的预期输出告诉我们测试实际断言的结果是1.0.0说明真实生效的检测路径对排列顺序另有处理下面第 4 节的预期结果文件是最终裁决依据。3. 检测器实现BodyPattern 如何把正则命中变成版本ChangeLog配置中的class: BodyPattern指向源码文件 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 才参与判定response.code ! 404保证了文件不存在常见于已删除的 Changelog时静默失败版本号来自命名捕获组Regexp.last_match[:v]取v组的值而不是整个匹配行这正是正则里(?v…)存在的意义证据链interesting_entries命中时会记录实际请求的 URL 命中的原始文本形如http://wp.lab/wp-content/plugins/plug-payments-gateway/CHANGELOG.md, Match: ### 1.0.0。这条证据最终出现在 WPScan 扫描报告的found_by详情中是审计者复核检测结论的关键。类注释也说明了它的应用场景Version finder using Body Pattern method. Typically used when the response is not an HTML doc and Xpath cant be used——Changelog、readme、配置文件等纯文本响应正是它的用武之地。同类检测器家族还包括同目录下的 xpath.rb、header_pattern.rb、query_parameter.rb、javascript_var.rb 等分别应对 HTML 结构、响应头、?ver查询参数、JS 变量等不同版本的披露方式。4. 测试闭环夹具如何被请求、命中并断言WPScan 的动态指纹测试通过共享示例文件 spec/shared_examples/dynamic_finders/wp_items.rb 驱动。其中的关键逻辑第 97107 行展示了夹具路径的拼装方式finder.aggressive_configs.each do |slug, configs| configs.each do |finder_class, config| finder_super_class config[class] || finder_class fixture fixtures.join(slug, finder_class.underscore, config[path]) stubbed_response df_stubbed_response(fixture, finder_super_class) path finder.aggressive_path(slug, config) stub_request(:get, target.url(path)).to_return(stubbed_response) ... end end注意finder_class.underscore配置键ChangeLog会被转换成change_log于是 WebMock 会把对http://wp.lab/wp-content/plugins/plug-payments-gateway/CHANGELOG.md的 GET 请求直接以本地夹具文件的内容作为响应体返回——这就是本文开头那份 CHANGELOG.md 被请求到的完整链路slug: plug-payments-gateway finder_class.underscore: change_log config[path]: CHANGELOG.md spec/fixtures/dynamic_finders/plugin_version/plug-payments-gateway/change_log/CHANGELOG.md测试断言的目标数据则记录在 spec/fixtures/dynamic_finders/expected.yml 中plug-payments-gateway的条目为plug-payments-gateway: ChangeLog: number: 1.0.0 found_by: Change Log (Aggressive Detection) interesting_entries: - http://wp.lab/wp-content/plugins/plug-payments-gateway/CHANGELOG.md, Match: ### 1.0.0这组预期值精确回答了两个问题检出结果是1.0.0而非文件顶部的0.1.0即无论 Changelog 是正序还是倒序检测器都收敛到正式发布的最新版本Match: ### 1.0.0与interesting_entries的拼接格式与第 3 节BodyPattern#find中#{response.effective_url}, Match: #{Regexp.last_match}的构造逻辑逐字吻合found_by字符串Change Log (Aggressive Detection)则体现了该检测属于主动探测需要额外请求 Changelog URL区别于从首页/404 页被动识别的(Passive Detection)。5. 从这份夹具能学到的三件事Changelog 是 WordPress 生态中最高频的版本披露点之一。插件作者习惯在发布包中保留CHANGELOG.md/readme.txt而 Web 服务器对wp-content/plugins/slug/目录通常不做访问控制这使得读文件拿版本号成为被动之外的标准主动检测手段。WPScan 的指纹配置ChangeLogBodyPatternversion: true把这件事标准化了新增一个插件的 Changelog 检测只需在动态检测库中登记path与pattern两条配置无需写任何代码命名捕获组是配置与代码之间的契约。指纹配置里的(?v…)与 body_pattern.rb 中Regexp.last_match[:v]一一对应——社区贡献新的 Changelog 指纹时正则必须提供名为v的捕获组否则检测器拿到的是nil测试夹具即回归语料。这份0.1.0 → 1.0.0的 Changelog 之所以长成现在这样是因为它必须同时满足存在可被^\#锚定的版本标题行、含有多版本条目以验证取最新版本的收敛逻辑、且格式贴近真实插件Fixes/News分组、日期后缀。修改 dynamic_finders.yml 或 body_pattern.rb 后这条夹具链路与 expected.yml 中的断言会第一时间暴露行为变化。6. 小结这份 36 行的插件 Changelog 夹具是 WPScan动态检测器 指纹库 测试夹具三层架构的一个最小完整样本CHANGELOG.md 提供靶子数据dynamic_finders.yml 提供请求哪里、用哪条正则的指纹BodyPattern 提供统一的命中→版本构造逻辑expected.yml 锁定1.0.0Match: ### 1.0.0的可复现断言。理解这条链路后无论是排查为什么某插件版本号没被检出还是为新插件补充 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 插件版本动态检测机制以 monk 插件 CHANGELOG.md 测试固件为例WPScan 插件版本动态检测机制以 monk 插件 CHANGELOG.md 测试固件为例 WPScan 通过动态查找器dynamic finders网络安全漏洞扫描渗透测试应用安全CLIWPScan 插件版本检测实例以 MultiSafepay CHANGELOG.md 为例解析 ChangeLog 动态指纹机制WPScan 插件版本检测实例以 MultiSafepay CHANGELOG.md 为例解析 ChangeLog 动态指纹机制 本文以 WPScan 测试夹网络安全漏洞扫描渗透测试应用安全CLIWPScan 插件版本检测实战以 get-the-image 的 changelog.md 为例解析 ChangeLog 动态查找机制WPScan 插件版本检测实战以 get the image 的 changelog.md 为例解析 ChangeLog 动态查找机制 导读 WordPres网络安全漏洞扫描渗透测试应用安全CLI上一篇5分钟搞定英雄联盟皮肤自由R3nzSkin开源换肤工具完全指南下一篇Xinference 部署 Qwen3-Omni-Instruct全模态模型从启动命令到源码原理全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表