¿Cómo omitir las cadenas de PHP == comparación para la cadena sha256?

0

Ya conozco las cadenas de PHP == vulnerabilidades de comparación

  1. enlace
  2. enlace
  3. enlace

Pero no puedo encontrar la manera de omitir la comparación == para la cadena sha256 . A continuación se muestra el código de ejemplo:

$username = $mysqli->real_escape_string($_POST['username']);
$password = $mysqli->real_escape_string(hash("sha256", $_POST['password']));

$UserDB = $mysqli->query("SELECT * FROM Database")->fetch_assoc()['value'];
$PwDB = $mysqli->query("SELECT * FROM Database")->fetch_assoc()['value'];

if($UserDB == $username){
    if($PwDB == $password){
        $_SESSION['admin'] = "Admin_".$username."_Password_".$password;
        header("Location: admin.php");
        exit;
    } else {
        $content .= alert("danger", "Password is wrong.");
    }
} else {
    $content .= alert("danger", "Username is wrong.");
}

¿Tiene alguna idea para omitir sha256 contraseña?

    
pregunta Nam Vu 11.10.2017 - 18:41
fuente

1 respuesta

4

Esto es imposible de explotar.

El problema es que no tienes control sobre el valor real con el que se compara: primero se pasa a través de una función hash y luego se comparan los hashes. Si tenía control directo sobre uno de los parámetros en la comparación, entonces podría hacer que esto suceda si:

  1. De alguna manera, logró forzar que el tipo de su argumento sea booleano verdadero (generalmente imposible en un contexto web, pero ¿tal vez para algo que responde a una solicitud JSON?)
  2. El hash de la contraseña real comenzó con 0e (que tiene un 3% de probabilidad de un hash sha-256) y de alguna manera logró pasar int (0).

Sin embargo, debido a que cualquier entrada que usted pase siempre estará marcada y comparada, no puede hacer que suceda ninguno de los dos casos. En su lugar, PHP siempre realizará una comparación de cadenas, y esa comparación de cadenas siempre devolverá el valor falso (a menos que sepa la contraseña o algo que colisiona con la contraseña, por supuesto).

h / t a AndrolGenhald por la sugerencia sobre boolean true.

h / t a Anders para corregir al necesitar int (0)

    
respondido por el Conor Mancone 11.10.2017 - 19:20
fuente

Lea otras preguntas en las etiquetas