Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Zedmix en 7 Mayo 2017, 16:33 pm



Título: Ejercicio Inyección SQL
Publicado por: Zedmix en 7 Mayo 2017, 16:33 pm
Buenas tardes, estoy tratando de realizar un ejercicio y le he echo varias pruebas, con herramientas y también con pruebas manuales y no termino de conseguir el resultado. Si alguien me podría dar una guía lo agradecería, os pongo en situación.

Tengo un login

El cual tiene la siguiente función:

Código
  1. function areUserAndPasswordValid($user, $password) {
  2. global $db, $userId;
  3.  
  4. $query = SQLite3::escapeString('SELECT userId, password FROM users WHERE username = "' . $user . '"');
  5.  
  6. $result = $db->query($query) or die ("Invalid query: " . $query . ". Field user introduced is: " . $user);
  7. $row = $result->fetchArray();
  8.  
  9. if ($row === FALSE)
  10. return FALSE;
  11.  
  12. if ($password == $row['password'])
  13. {
  14. $userId = $row['userId'];
  15. $_COOKIE['userId'] = $userId;
  16. return TRUE;
  17. }
  18. else
  19. {
  20. return FALSE;
  21. }
  22. }
  23.  

Y se me facilita una lista de posibles password, pero nunca se me facilita ningún usuario.


Título: Re: Ejercicio Inyección SQL
Publicado por: SirSocket en 7 Mayo 2017, 21:27 pm
Hola

No lo he probado pero partiendo de la sentencia que tienes debes conseguir asignar a la variable user un valor que devuelva un true

SELECT userId, password
FROM users
WHERE username = "' . $user . '"'


Si en la variable user asignas algo así:

' or '1' = '1' --


el resultado de la sentencia seria como sigue:

SELECT userId, password
FROM users
WHERE username = ' ' or '1' = '1' -- '"'


lo que significa que te devuelva usuario y password cuyo nombre este vacio o 1=1

lo que significa que si una de las dos expresiones es válida devolverá registros


username = ' ' <-- No sabemos si es cierto
'1' = '1'          <--Pero esto siempre se cumple