/

CVE-2026-108109

Severity:

CRITICAL RISK

(9.1)

Brute-Force OTP (CWE-307) in PHPNuxBill Reset Flow

CVE-2026-108109

Deferred

Vulnerability type

Category:

Insufficient Protection Against Authentication Attempts

CWE:

CWE-307

Impact:

Account Takeover

Severity:

CRITICAL RISK

(9.1)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

PHPNuxBill contains an account takeover vulnerability in its customer password reset flow because six-digit OTP codes can be guessed without effective attempt limits or lockout controls.

An unauthenticated attacker who knows a customer username may brute-force the reset code and obtain the newly assigned password from the HTTP response, allowing the account to be hijacked.

PHPNuxBill contains an account takeover vulnerability in its customer password reset flow because six-digit OTP codes can be guessed without effective attempt limits or lockout controls.

An unauthenticated attacker who knows a customer username may brute-force the reset code and obtain the newly assigned password from the HTTP response, allowing the account to be hijacked.

Affected context

The issue occurs in PHPNuxBill customer password reset processing when:

  • A password reset can be initiated using a known customer username
  • The reset flow accepts a short, six-digit OTP code
  • Repeated OTP submissions are not adequately rate-limited
  • Failed attempts do not trigger effective lockout, expiration, or equivalent abuse controls
  • The newly set password may be exposed in the HTTP response

The practical exposure depends on how the reset endpoint, responses, and customer identifiers are reachable in a deployment.

The issue occurs in PHPNuxBill customer password reset processing when:

  • A password reset can be initiated using a known customer username
  • The reset flow accepts a short, six-digit OTP code
  • Repeated OTP submissions are not adequately rate-limited
  • Failed attempts do not trigger effective lockout, expiration, or equivalent abuse controls
  • The newly set password may be exposed in the HTTP response

The practical exposure depends on how the reset endpoint, responses, and customer identifiers are reachable in a deployment.

Exploit preconditions

  • Attack surface: Customer-facing password reset endpoint
  • Required access: No authenticated access; knowledge of a target customer username may be sufficient
  • Trigger point: OTP verification during the password reset flow
  • Why exploitation is possible: The limited OTP space can be repeatedly tested because the flow lacks effective attempt throttling or lockout, while the resulting password is disclosed in the response
  • Attack surface: Customer-facing password reset endpoint
  • Required access: No authenticated access; knowledge of a target customer username may be sufficient
  • Trigger point: OTP verification during the password reset flow
  • Why exploitation is possible: The limited OTP space can be repeatedly tested because the flow lacks effective attempt throttling or lockout, while the resulting password is disclosed in the response

Why this happens

The underlying issue is insufficient protection against repeated authentication-related attempts, mapping to CWE-307.

The reset flow treats a short OTP as an adequate authorization factor without binding it to strong rate limits, attempt counters, expiration, or account-level abuse controls. Exposing the newly generated password in the response further turns successful OTP verification into direct credential disclosure. Together, these patterns allow an unauthenticated party to automate guesses against the recovery process.

The underlying issue is insufficient protection against repeated authentication-related attempts, mapping to CWE-307.

The reset flow treats a short OTP as an adequate authorization factor without binding it to strong rate limits, attempt counters, expiration, or account-level abuse controls. Exposing the newly generated password in the response further turns successful OTP verification into direct credential disclosure. Together, these patterns allow an unauthenticated party to automate guesses against the recovery process.

Potential impact

  • Attackers may take over customer accounts
  • Exposed reset passwords could enable unauthorized access to customer data
  • Compromised accounts could be used for fraud, impersonation, or further attacks
  • Attackers could alter account settings or perform actions available to the victim
  • Credential reuse may increase the risk to other services
  • Attackers may take over customer accounts
  • Exposed reset passwords could enable unauthorized access to customer data
  • Compromised accounts could be used for fraud, impersonation, or further attacks
  • Attackers could alter account settings or perform actions available to the victim
  • Credential reuse may increase the risk to other services

General mitigation guidance

Mitigation generally focuses on making password recovery resistant to automated guessing and minimizing credential exposure.

Common defensive patterns include:

  • Apply server-side rate limits and bounded retry counters per account, token, device, and network context
  • Expire reset codes quickly and invalidate them after successful or excessive failed verification
  • Use cryptographically strong, sufficiently unpredictable recovery tokens with adequate entropy
  • Avoid returning newly generated passwords or other secrets in HTTP responses
  • Deliver reset links or one-time credentials through controlled channels and require secure credential setup
  • Use generic responses that do not reveal whether usernames or reset attempts are valid
  • Monitor and alert on repeated failures, distributed guessing, and unusual recovery activity
  • Apply least privilege to reset operations and require reauthentication or additional verification for sensitive changes

Mitigation generally focuses on making password recovery resistant to automated guessing and minimizing credential exposure.

Common defensive patterns include:

  • Apply server-side rate limits and bounded retry counters per account, token, device, and network context
  • Expire reset codes quickly and invalidate them after successful or excessive failed verification
  • Use cryptographically strong, sufficiently unpredictable recovery tokens with adequate entropy
  • Avoid returning newly generated passwords or other secrets in HTTP responses
  • Deliver reset links or one-time credentials through controlled channels and require secure credential setup
  • Use generic responses that do not reveal whether usernames or reset attempts are valid
  • Monitor and alert on repeated failures, distributed guessing, and unusual recovery activity
  • Apply least privilege to reset operations and require reauthentication or additional verification for sensitive changes

How teams detect issues like this

Detection can combine application review, runtime monitoring, and automated analysis:

  • Review password-reset handlers for missing retry counters, lockout, expiration, or per-identity throttling
  • Use static analysis and code review rules to identify short-code comparisons without abuse controls
  • Search responses, logs, and API contracts for passwords, reset tokens, or other secrets returned to clients
  • Test recovery workflows with controlled repeated-failure scenarios and distributed request patterns
  • Enforce policies requiring one-time-use tokens, bounded verification attempts, and secret-free responses
  • Monitor authentication telemetry for repeated OTP failures, broad username targeting, and rapid reset activity
  • Automated security review tools may help flag weak recovery workflows and exposed sensitive response fields

Detection can combine application review, runtime monitoring, and automated analysis:

  • Review password-reset handlers for missing retry counters, lockout, expiration, or per-identity throttling
  • Use static analysis and code review rules to identify short-code comparisons without abuse controls
  • Search responses, logs, and API contracts for passwords, reset tokens, or other secrets returned to clients
  • Test recovery workflows with controlled repeated-failure scenarios and distributed request patterns
  • Enforce policies requiring one-time-use tokens, bounded verification attempts, and secret-free responses
  • Monitor authentication telemetry for repeated OTP failures, broad username targeting, and rapid reset activity
  • Automated security review tools may help flag weak recovery workflows and exposed sensitive response fields

Sources

SourceLink
github.comgithub.com/hotspotbilling/phpnuxbill
github.comgithub.com/hotspotbilling/phpnuxbill/blob/2025.3.13/system/controllers/forgot.php#L41
github.comgithub.com/hotspotbilling/phpnuxbill/commit/c3c2a92d468af91136d747b75142ed72f10320cc
github.comgithub.com/hotspotbilling/phpnuxbill/security/advisories/GHSA-337r-rrrc-r559
vulncheck.comvulncheck.com/advisories/phpnuxbill-through-2025.3.20-account-takeover-via-brute-forceable-password-reset-code

Frequently asked

questions

Yes. The reset endpoint is generally reachable remotely, and exploitation may be possible without authentication when an attacker knows a customer username and the endpoint lacks effective request controls.

No authenticated account access is necessarily required. The key prerequisites are a target username, access to the password reset flow, and the ability to submit repeated OTP verification attempts.

Use high-entropy, short-lived, single-use reset tokens with strict server-side attempt limits, progressive throttling, and invalidation after failures or successful use. Do not return newly set passwords in responses.

Treat account recovery as an authentication-sensitive workflow, define abuse controls during design, test retry and lockout behavior, return generic responses, and continuously monitor reset activity for automated guessing.

Yes. The reset endpoint is generally reachable remotely, and exploitation may be possible without authentication when an attacker knows a customer username and the endpoint lacks effective request controls.

No authenticated account access is necessarily required. The key prerequisites are a target username, access to the password reset flow, and the ability to submit repeated OTP verification attempts.

Use high-entropy, short-lived, single-use reset tokens with strict server-side attempt limits, progressive throttling, and invalidation after failures or successful use. Do not return newly set passwords in responses.

Treat account recovery as an authentication-sensitive workflow, define abuse controls during design, test retry and lockout behavior, return generic responses, and continuously monitor reset activity for automated guessing.

Find out what's already
exploitable in your codebase.