Das Zurücksetzen eines Kennworts ist eine authentifizierte Operation und setzt voraus, dass sich der Benutzer auf sichere Weise identifiziert hat. Normalerweise erfolgt dies mit einem Benutzernamen und einem Passwort sowie einem zweiten Faktor. Der Benutzername und das Kennwort werden häufig gleichzeitig in derselben HTTP-Anforderung übermittelt. Dies ist keine Seltenheit und keine rote Fahne.
In einem Szenario mit vergessenem Kennwort ist die Notwendigkeit, den Benutzer zu authentifizieren, genau gleich. Dies bedeutet, dass sie ihren Benutzernamen sowie eine alternative Form von Anmeldeinformationen übermitteln (in Ihrem Fall verwenden Sie möglicherweise Herausforderungsfragen, die ich nicht kommentieren werde). Abgesehen davon ist es immer noch eine Authentifizierung, und es ist kein Problem, den Benutzernamen und die Anmeldeinformationen gleichzeitig zu übermitteln, genau wie bei der regulären Anmeldung.
Das Problem tritt auf, wenn Sie den Benutzernamen auf einem sammeln separate Seite. Dies ist häufig bei Workflows der Fall, die eine benutzerspezifische Herausforderung und Antwort beinhalten (z. B. Herausforderungsfragen, aber auch bei Out-of-Band-OTPs), da das System den Benutzernamen im Voraus kennen muss, damit es weiß, welche Fragen angezeigt werden sollen oder wohin Senden Sie das OTP. Die Versuchung besteht darin, den Benutzernamen auf einer separaten Seite zu sammeln und ihn dann als versteckte Formularvariable weiterzugeben. Dies unterliegt Manipulationen auf der Clientseite und stellt daher einen Vektor für einen IDOR -Angriff bereit.
Die Abschwächung besteht darin, das vergessene Kennwort "Sitzung" auf die gleiche Weise zu behandeln, wie Sie es verwalten eine gewöhnliche Anmeldesitzung; Verwalten Sie den Benutzernamen manipulationssicher, z. B. ein verschlüsseltes Cookie oder eine Sitzungsvariable. Versteckte Felder sind trivial zu manipulieren.