网络安全漏洞扫描渗透测试应用安全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 站点维护者的 WordPress 安全扫描器其核心能力之一是动态指纹识别Dynamic Finders针对数以万计的插件与主题从各类公开可访问的文件中自动提取版本号。本篇文章以仓库中的一份真实样本——Vacation Soup Waiter 插件的 CHANGELOG.md——为切入点完整解析Change Log更新日志这一类动态指纹的识别原理、配置格式、匹配逻辑与测试验证方式。读完本文你将掌握 WPScan 动态指纹数据库的配置写法、BodyPattern 匹配器的底层实现以及如何在本地复现与调试这类版本探测。一、从一份 CHANGELOG 样本说起动态指纹素材长什么样WPScan 的指纹数据库中每一个插件条目都对应着大量证据文件fixture它们模拟的是真实 WordPress 站点上可被访问到的文件内容。soup-waiter插件对应的就是 CHANGELOG.md这是一份标准 Markdown 格式的更新日志开头如下# Changelog for Vacation Soup Waiter ## 1.2.3 (xx.xx.xx) * **Enhancements**: - Removed 10 property limit * **Bug Fixes**: - Recent posts show all users posts in single user mode ## 1.2.2 (2018.10.15) * **Enhancements**: - Added Enhanced Multi-user capabilities - Enabled switchable multi-user or shared user settings这份文件从 2017 年 9 月的 0.2.x 系列一直记录到 2018 年的 1.2.3版本条目均以## x.y.z的 Markdown 二级标题开头。正是这种高度规律的格式让它成为版本探测的理想目标只要在 HTTP 响应正文中匹配到##后跟版本号的模式就能判定插件版本。值得说明的是这份 CHANGELOG 本身是 WPScan 在 spec/fixtures/dynamic_finders/expected.yml 中登记的预期结果对应的真实素材。在该文件中soup-waiter的期望版本被登记为soup-waiter: ChangeLog: number: 1.2.3 found_by: Change Log (Aggressive Detection) interesting_entries: - http://wp.lab/wp-content/plugins/soup-waiter/CHANGELOG.md, Match: ## 1.2.3也就是说对这份 CHANGELOG.md 做探测WPScan 应当判定出 1.2.3 这个最新版本——这正是本文要复现的完整链路。二、动态指纹的配置源头dynamic_finders.yml 中的 ChangeLog 条目动态指纹数据库的核心配置文件是 lib/wpscan/db/dynamic_finders/base.rb 中所引用的DB_DIR.join(dynamic_finders.yml)。在实际安装中这份 YAML 由wpscan --update从远端数据库下载而在本仓库内其测试版本位于 spec/fixtures/db/dynamic_finders.yml。针对soup-waiter配置条目如下见spec/fixtures/db/dynamic_finders.yml第 107104-107109 行soup-waiter: ChangeLog: class: BodyPattern path: CHANGELOG.md pattern: !ruby/regexp /\#\# (?v\d\.[\.\d])/ version: true逐字段拆解配置字段值含义ChangeLog条目名指纹类型标识最终会体现为found_by: Change LogclassBodyPattern指定使用BodyPattern这一匹配器实现见下文第四节pathCHANGELOG.md需要请求的相对路径拼接到插件目录 URL 之后存在path意味着该指纹属于攻击性探测Aggressive Detectionpattern/\#\# (?v\d\.[\.\d])/匹配正文的正则(?v...)命名捕获组用于提取版本号versiontrue标记该条目产出版本信息纳入versions_finders_configs其中version: true是关键开关在 lib/wpscan/db/dynamic_finders/plugin.rb 的versions_finders_configs方法中只有带version键的配置才会被收集进版本查找器集合df_data.each do |slug, finders| finders.each do |finder_name, config| next unless config.key?(version) versions_finders_configs[slug] || {} versions_finders_configs[slug][finder_name] config end end被动探测与攻击性探测的分界从 lib/wpscan/db/dynamic_finders/plugin.rb 的finder_configs方法可以看出path是否存在决定了指纹的工作模式fs if aggressive finders.reject { |_f, c| c[path].nil? } else finders.select { |_f, c| c[path].nil? } end被动探测Passive Detection配置中没有path的指纹直接从首页或 404 页面的响应里找版本线索不额外发请求攻击性探测Aggressive Detection配置中有path的指纹会主动请求插件目录/该路径例如wp-content/plugins/soup-waiter/CHANGELOG.md。soup-waiter的 ChangeLog 指纹带path因此属于攻击性探测found_by标记为Change Log (Aggressive Detection)——这与expected.yml中的登记完全吻合。三、配置如何变成可运行的查找器类动态指纹系统并不是为每个插件手写 Ruby 类而是运行时动态生成。整体链路如下app/finders/plugin_version.rb 中PluginVersion::Base初始化时会调用create_and_load_dynamic_versions_finders(plugin) def create_and_load_dynamic_versions_finders(plugin) DB::DynamicFinders::Plugin.create_versions_finders(plugin.slug).each do |finder| finders finder.new(plugin) end endlib/wpscan/db/dynamic_finders/plugin.rb 的create_versions_finders(slug)会通过maybe_create_module(slug)把 slug 转换为常量名soup-waiter→SoupWaiter在WPScan::Finders::PluginVersion下创建同名模块遍历该 slug 的版本查找器配置调用version_finder_super_class(klass).create_child_class(...)动态生成子类。类生成的核心在 lib/wpscan/finders/dynamic_finder/finder.rb 的create_child_classdef self.create_child_class(mod, klass, config) class_constants child_class_constants mod.const_set( klass, Class.new(self) do class_constants.each do |key, value| const_set(key, config[key.downcase.to_s] || value) end end ) end这意味着 YAML 中的path、pattern、confidence等键会被逐一下沉为生成类的PATH、PATTERN、CONFIDENCE常量。对soup-waiter而言最终会生成一个WPScan::Finders::PluginVersion::SoupWaiter::ChangeLog类其PATH CHANGELOG.md、PATTERN /\#\# (?v\d\.[\.\d])/。被动与攻击性的执行分派生成类从 lib/wpscan/finders/dynamic_finder/finder.rb 继承了两个入口def passive(opts {}) return if self.class::PATH homepage_result find(target.homepage_res, opts) unless homepage_result.nil? || (homepage_result.is_a?(Array) homepage_result.empty?) return homepage_result end find(target.error_404_res, opts) end def aggressive(opts {}) return unless self.class::PATH find(Browser.get(target.url(self.class::PATH)), opts) end带PATH的ChangeLog指纹其passive直接返回 nil不做被动探测aggressive则请求target.url(CHANGELOG.md)不带PATH的指纹如某些 MetaTag、QueryParameter 类则相反被动时检查首页与 404 页攻击性时直接返回。这里也可以看到 HTTP 请求层由单例 lib/wpscan/browser.rb 统一发起它会注入 User-Agent、Referer、gzip 压缩等默认请求参数lib/wpscan/browser.rb。四、BodyPatternCHANGELOG 版本提取的底层实现soup-waiter的 ChangeLog 指纹指定class: BodyPattern。BodyPattern 的匹配器实现位于 lib/wpscan/finders/dynamic_finder/version/body_pattern.rb完整代码如下module WPScan module Finders module DynamicFinder module Version # Version finder using Body Pattern method. Typically used when the response is not # an HTML doc and Xpath cant be used class 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 end end end end几个值得注意的实现细节适用场景注释明确说明BodyPattern 用于响应不是 HTML 文档、无法使用 XPath 的场景——CHANGELOG.md 这类纯文本正是典型默认置信度CONFIDENCE默认为 60除非 YAML 里显式覆盖404 防护只有响应码非 404 时才会尝试匹配命名捕获组正则中的(?v...)通过Regexp.last_match[:v]取出版本号证据记录interesting_entries会记录有效URL, Match: 正则匹配原文这正是扫描报告中证据条目的来源也与expected.yml中Match: ## 1.2.3的期望值一一对应。匹配成功后lib/wpscan/finders/dynamic_finder/version/finder.rb 的create_version会构造WPScan::Model::Version对象并把found_by与confidence一并写入供后续的报告格式化CLI/JSON/SARIF使用。顺带一提app/finders/plugin_version/readme.rb 中还有一条独立的Readme查找器它解析 readme.txt 的Stable Tag置信度 80与ChangeLog Section置信度 50。也就是说WPScan 对更新日志类信息的利用有两条路径一条是这里讨论的独立 CHANGELOG 文件指纹另一条是 readme.txt 内嵌的 changelog 段落。五、正则模式剖析##标题与命名捕获组soup-waiter配置里的正则/\#\# (?v\d\.[\.\d])/是一个值得反复揣摩的模式片段含义\#\#转义后的两个井号加空格匹配 Markdown 二级标题##(?v...)命名捕获组名为v匹配结果可通过Regexp.last_match[:v]获取\d至少一位数字主版本号\.小数点[\.\d]小数点或数字的重复匹配1.2、1.2.3、甚至更多段用这份 CHANGELOG 验证文件首个版本条目是## 1.2.3 (xx.xx.xx)正则匹配到## 1.2.3捕获组v取出1.2.3这正是expected.yml中登记的期望版本。由于该正则会匹配到文件中所有符合格式的## x.y.z标题但 BodyPattern 只取第一次匹配~返回首个命中位置因此实际检出的是文件中的最新版本 1.2.3。同类写法在整个指纹库中广泛复用例如spec/fixtures/db/dynamic_finders.yml中2fas、404-solution等插件同样配置了CHANGELOG.md/changelog.md路径的 BodyPattern 指纹只是各插件更新日志的格式不同正则也会相应调整有的用 x.y.z 有的用Version x.y.z。六、测试如何验证这条链路WPScan 为动态指纹配备了自动化回归测试。在 spec/lib/finders/dynamic_finder/plugin_version_spec.rb 中所有插件动态版本查找器都会从WPScan::DB::DynamicFinders::Plugin.versions_finders_configs读取每个 slug 的配置调用create_versions_finders(slug)动态生成类用 WebMock 桩掉http://wp.lab/的请求把 fixture 文件作为响应体spec/spec_helper.rb的df_stubbed_response断言返回的WPScan::Model::Version的number、found_by、confidence、interesting_entries与expected.yml完全一致。具体到攻击性分支spec/lib/finders/dynamic_finder/plugin_version_spec.rbdescribe #aggressive do before do stub_request(:get, plugin.url(config[path])).to_return(stubbed_response) if config[path] end context when the version is detected do let(:stubbed_response) do df_stubbed_response(fixtures.join(config[path]), finder_super_class) end ... end end即桩请求wp-content/plugins/soup-waiter/CHANGELOG.md响应体就是 CHANGELOG.md 的原始内容。BodyPattern 基类的行为也由 spec/lib/finders/dynamic_finder/version/body_pattern_spec.rb 单独覆盖包括create_child_class是否正确把pattern、confidence、path下沉为常量。值得留意的是该 spec 文件头部注释给出的贡献流程新增一个指纹配置后需要同步编辑spec/fixtures/dynamic_finders/expected.yml登记预期结果、并放入对应的 fixture 文件排查失败时可用rspec -e Full Description精确定位例如rspec -e WPScan::Finders::PluginVersion::SoupWaiter::ChangeLog#aggressive。绝大多数这类用例被打上slow标签只在全量套件中运行以保证 PR 的覆盖率统计稳定。七、实战视角这份机制对扫描与安全分析的意义把上述链路串起来一次针对soup-waiter的攻击性版本探测实际发生的事是枚举到插件soup-waiter存在于目标站点从dynamic_finders.yml加载其ChangeLog指纹配置path: CHANGELOG.md、pattern: ...、class: BodyPattern动态生成WPScan::Finders::PluginVersion::SoupWaiter::ChangeLog类发起GET wp-content/plugins/soup-waiter/CHANGELOG.md携带 WPScan 默认 UA 等请求头响应体命中## 1.2.3生成Version(1.2.3)found_by为Change Log (Aggressive Detection)置信度 60并记录匹配证据 URL。之后这个版本号会进入 lib/wpscan/db/wp_item.rb 与漏洞库数据的比对流程从而判断该插件版本是否存在已知漏洞。也就是说一份看似平淡无奇的 CHANGELOG 文件实际上是攻击面枚举中版本确认 → 漏洞匹配链条的关键一环。对插件作者而言这也带来一个安全启示发布到目录的插件包内不要遗留可读的版本标记文件或至少不要在新版本中把版本号写成易被正则捕获的固定格式——因为 WPScan 这类工具的指纹库正是靠这些公开文件完成版本确认的。当然从安全扫描的合规角度这类探测属于对公开资源的信息收集应在获得授权的前提下进行。八、小结本文以 Vacation Soup Waiter 的 CHANGELOG.md 为线索完整走通了 WPScan 动态指纹系统中更新日志类版本探测的整条链路配置源头spec/fixtures/db/dynamic_finders.yml 中soup-waiter.ChangeLog条目定义了class、path、pattern、version四个关键字段类生成lib/wpscan/db/dynamic_finders/plugin.rb 在运行时按 slug 动态生成查找器类匹配实现lib/wpscan/finders/dynamic_finder/version/body_pattern.rb 通过命名捕获组从 Markdown 标题中提取版本号执行模式lib/wpscan/finders/dynamic_finder/finder.rb 依据PATH区分被动/攻击性探测回归保障spec/lib/finders/dynamic_finder/plugin_version_spec.rb 与 expected.yml 把CHANGELOG.md → 1.2.3的预期固化为自动化测试。理解这条链路无论是想要为 WPScan 贡献新的插件指纹还是希望从源码层面理解 WordPress 版本枚举工具的工作原理都能获得一份完整且可复现的参考。赞分享网络安全漏洞扫描渗透测试应用安全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 动态发现机制实战从 revision-strike 的 CHANGELOG.md 看 WordPress 插件版本指纹识别WPScan 动态发现机制实战从 revision strike 的 CHANGELOG.md 看 WordPress 插件版本指纹识别 导读 本文以 WPS网络安全漏洞扫描渗透测试应用安全CLIWPScan 动态指纹实战从 Post Type Switcher 的 CHANGELOG.md 识别 WordPress 插件版本WPScan 动态指纹实战从 Post Type Switcher 的 CHANGELOG.md 识别 WordPress 插件版本 导读 本文以 WPSca网络安全漏洞扫描渗透测试应用安全CLI从 changelog.md 指纹识别插件版本WPScan 动态指纹 ChangeLog 探测机制深度解析从 changelog.md 指纹识别插件版本WPScan 动态指纹 ChangeLog 探测机制深度解析 导读 本文聚焦 WPScan 动态指纹Dynam网络安全漏洞扫描渗透测试应用安全CLI上一篇KdaInputProj 算子深度解析Recurrent KDA 推理前处理投影的 NPU 融合实现下一篇极致优化React-Markdown服务器组件性能调优指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
GenOffice 安全体系深度解读:渲染器锁定、AI 布局脚本沙箱与 AI 生成 HTML 隔离 人工智能AI 应用桌面应用AI AgentMCP 服务AI 技能 【免费下载链接】genoffice Free, open-source AI Office suite: Docs, Sheets, Slides, PDF, Markdown and HTML editors with a built-in AI agent, plus a genoffice CLI and agent skill so Claude Code, Codex and Cursor… · 2026/9/27 7:59:24
rsuite DateRangePicker hoverRange 详解:悬停预选整周、整月与自定义日期范围 前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 本篇技术指南聚焦 rsuite DateRangePicker 组件的 hoverRange 属性,讲解如何让鼠标悬停即实… · 2026/9/27 7:59:18
wordpress4.8教程里的安全最佳实践 wordpress4.8教程里的安全最佳实践 域名解析指向了127.0.0.1,服务器却提示连接超时,这种“域名服务器搞不懂”的死循环,是不是让你抓狂?我见过太多老板,网站做好了,域名也备案了,结果一上线就被黑客盯上,甚至直接挂马。别急,这… · 2026/9/27 7:59:11
isomorphic-git readTag 完全指南:直接读取并解析 annotated tag 对象 开发工具 【免费下载链接】isomorphic-git A pure JavaScript implementation of git for node and browsers! 项目地址: https://gitcode.com/gh_mirrors/is/isomorphic-git 点击查看 免费下载 readTag 是 isomorphic-git(一个纯 JavaScript 实现的 Gi… · 2026/9/27 8:46:24
Midway 开源仓库协作指南:Issue 规范、Commit 约束与版本发布全流程解析 后端微服务云原生 【免费下载链接】midway 🍔 A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate w… · 2026/9/27 8:46:17
前端CI流水线构建缓存深度调优:GitHubActions与TurboCache 前端CI流水线构建缓存深度调优:GitHubActions与TurboCache在大型前端 Monorepo 工程或独立全栈产品的持续集成(CI/CD)发版流程中,“每次提 PR 或发版时 CI 流水线构建极其漫长(超过 8~12 分钟)” 是摧毁团队… · 2026/9/27 8:46:17
网站建设公司营销推广:3个报价策略让客户秒懂价值 网站建设公司营销推广:3个报价策略让客户秒懂价值 不会写代码?想做网站又怕被坑?先别急着问建站报价。 很多老板找网站建设公司营销推广时,第一反应是“最便宜多少钱”。但真相是:低价往往意味着模板堆砌、无SEO优化、后期维护扯皮。真正的痛点不是… · 2026/9/27 8:46:11
产业资本运作之县域经济底层逻辑 产业资本运作之县域经济底层逻辑何伏 融通资管 投资合伙人县域经济产业资本运作,底层逻辑从来不是“资本砸出一个产业”;是“资本激活本地禀赋,长出一个产业”。别追风口,追禀赋。风口三年一变,禀赋百年不变。别拼… · 2026/9/27 8:46:11
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01