elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [Resuelto] SQLi en esta consulta?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Resuelto] SQLi en esta consulta?  (Leído 4,590 veces)
#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
[Resuelto] SQLi en esta consulta?
« en: 25 Marzo 2018, 01:32 am »

Tenía la duda de si se puede inyectar código a esta consulta desde los formularios usuario/contraseña.

Código
  1.  
  2. /*________________________________________
  3.           MÉTODO INICIAR SESIÓN
  4.   ________________________________________*/
  5.    public function Iniciar_sesion($usuario, $password){
  6.      session_start();
  7.  
  8.      if(isset($_POST['user']) && strlen($_POST['user'])>0 &&
  9.      isset($_POST['password']) && strlen($_POST['password'])>0) {
  10.  
  11.        $Save_password = $this->connection->query("SELECT PASSWORD FROM usuarios WHERE USER = '$usuario' ")->fetchColumn();
  12.  
  13.       if($Save_password === md5($password)){
  14.            $_SESSION['user'] = $this->connection->query("SELECT USER FROM usuarios WHERE USER = '$usuario'")->fetchColumn();
  15.  
  16.            # Si los datos introducidos son correctos.
  17.       header('Location:'. $_SERVER["HTTP_REFERER"]);
  18.  
  19.            # Si la contraseña es incorrecta.
  20.       }else{header("Location:Login.php");}
  21.  
  22.          # Si los campos están vacios.
  23.      }else{header("Location:index.php");}
  24.    }
  25.  
  26.  

Diría que sí, ya que en el formulario usuario se podría inyectar perfectamente código para la consulta que se genera.

¿Cómo se podría solucionar?


« Última modificación: 29 Mayo 2018, 19:17 pm por #!drvy » En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: SQLi en esta consulta?
« Respuesta #1 en: 25 Marzo 2018, 03:20 am »

Si, es vulnerable a SQLi.

Solución: Usa prepared statements.

http://php.net/manual/es/mysqli.quickstart.prepared-statements.php
http://php.net/manual/es/pdo.prepare.php

No uses MD5 para contraseñas.. hoy en día es casi inútil, una GPU decente te puede hacer millones de comparaciones de hash por segundo lo cual lo hace super viable e inseguro a ataques de fuerza bruta.

Usa cifrados con factor de dificultad:

http://php.net/manual/es/function.password-hash.php
http://php.net/manual/es/function.password-verify.php
http://php.net/manual/es/function.crypt.php

Saludos


En línea

#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: SQLi en esta consulta?
« Respuesta #2 en: 25 Marzo 2018, 04:37 am »

Si, es vulnerable a SQLi.

Solución: Usa prepared statements.

http://php.net/manual/es/mysqli.quickstart.prepared-statements.php
http://php.net/manual/es/pdo.prepare.php

No uses MD5 para contraseñas.. hoy en día es casi inútil, una GPU decente te puede hacer millones de comparaciones de hash por segundo lo cual lo hace super viable e inseguro a ataques de fuerza bruta.

Usa cifrados con factor de dificultad:

http://php.net/manual/es/function.password-hash.php
http://php.net/manual/es/function.password-verify.php
http://php.net/manual/es/function.crypt.php

Saludos

¡Genial, muchas gracias!

Y en cuánto a consultas estáticas ¿me recomiendas prepararlas y ejecutarlas o dejarlas simplemente como están? ¿supongo que dejarlas como están porque hacer una consulta genera menos consumo que prepararla y ejecutarla? Aunque quizá sea una buena práctica empezar a preparar todas las consultas...

Gracias Dryv! :)
En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: SQLi en esta consulta?
« Respuesta #3 en: 25 Marzo 2018, 05:06 am »

Yo generalmente, cuando no uso un ORM (que suelo usar casi todo el rato, y te lo recomiendo), lo que me hago es una función de query.. dicha función acepta mínimo dos parámetros, la query (obligatorio) y un array (opcional). Si el array viene con datos, ejecuto una sentencia preparada, si el array esta vació, hago un "exec".

Aunque realmente, creo que la diferencia entre una sentencia preparada y una directa en cuanto a eficiencia es mínima.

Saludos
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: SQLi en esta consulta?
« Respuesta #4 en: 25 Marzo 2018, 05:48 am »

Para eso existe: http://php.net/manual/es/mysqli.real-escape-string.php
En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: SQLi en esta consulta?
« Respuesta #5 en: 25 Marzo 2018, 06:15 am »

Nota: Es 100 veces más seguro usar sentencias preparadas que "escapar" datos.

Comparalo con una frontera.. ¿prefieres "procesar" a cada visitante extranjero o directamente meterle en un área aislado?

https://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html

Saludos
« Última modificación: 25 Marzo 2018, 06:21 am por #!drvy » En línea

#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: SQLi en esta consulta?
« Respuesta #6 en: 25 Marzo 2018, 15:04 pm »


Había visto esa opción pero no me apetecía usar Mysqli, ya que todo lo había empezado con PDO, que desde mi punto de vista es algo mejor, además la idea de escapar caracteres tampoco me llamaba mucho la atención, porque imagino que al igual que con las inyeciones XSS, habrá formas de saltarse ese escape.

lo que me hago es una función de query.. dicha función acepta mínimo dos parámetros, la query (obligatorio) y un array (opcional). Si el array viene con datos, ejecuto una sentencia preparada, si el array esta vació, hago un "exec".


Al final termine haciendo un método privado para realizar las consultas preparadas/simples en función de si el array era null o no.

Gracias, como siempre! :)

En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: SQLi en esta consulta?
« Respuesta #7 en: 28 Marzo 2018, 01:33 am »

Lo peor que puedes hacer es usar pdo para mysql para eso existe la extensión nativa mysqlnd para php con el cual puedes manejar mysql con mysqli::, no creas mucho que puedes migrar de un motor a otro con pdo porque de todas maneras necesitarás cambar sintaxis y otras cosas importantes.

Hay varias maneras de crear consultas sql, preparadas, escapadas, persistencia modelada, etc, pero no quiere decir que utilizando una manera tu proyecto será mas o menos inseguro, el creador de php creó todas las funciones necesarias para prevenir las inyecciones entre otras cosas para cada tipo de manipulación de bases de datos asi que en la práctica estarás seguro aun utilizando consultas a modo de texto plano.

Lo que si, es mucho mas recomendable utilizar modelamiento de datos y consultas parametrizadas por temas de seguridad en la escalabilidad, esto quiere decir que si el dia de mañana tu desarrollo es tomado por otra persona correrás el riesgo de que caiga en crear un agujero de tipo inyección sql sin no sabe utilizar bien las funciones de php creadas para que eso no pase, en cambio las consultas preparadas te dan la ventaja de que muy dificilmente una persona tendrá inyección sql debido a que ya no necesita realizar los escapes de manera manual.

Por otro lado te recomiendo utilizar codeigniter ya que estás utilizando php, codeigniter ofrece algo llamado Active Record el cual son sentencias basadas en objetos, ya no necesitas parametrizar ni escapar cosas, es todo mas fluido y viene nativamente con varios drivers para conectarse a diferentes tipos de bases de datos sin la necesidad de modificar tus consultas sql.

Si piensas hacer un proyecto grande y que sea mantenible con el tiempo (transaccional/escalable) te recomiendo que comiences por aprender codeigniter y migres tu proyecto a algo con mejores prácticas.

https://www.codeigniter.com/userguide2/database/active_record.html
https://www.codeigniter.com/userguide3/database/query_builder.html
En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: SQLi en esta consulta?
« Respuesta #8 en: 28 Marzo 2018, 03:09 am »

Citar
Lo peor que puedes hacer es usar pdo para mysql para eso existe la extensión nativa mysqlnd para php con el cual puedes manejar mysql con mysqli::, no creas mucho que puedes migrar de un motor a otro con pdo porque de todas maneras necesitarás cambar sintaxis y otras cosas importantes.

Es que PDO usa el driver de mysql... Pruebalo, intenta usar PDO sin haber instalado el modulo php-mysql.. Por mucho que necesites cambiar de sintaxis, usando PDO NO necesitaras cambiar de funciones.. todo tiene el mismo procedimiento.. Por no hablar de otras ventajas que ofrece PDO como los parámetros nombrables.. Compara esto:

Código
  1. SELECT nombre, apellidos, direccion FROM clientes WHERE nombre = :nombre AND apellidos = :apellidos

Contra esto:
Código
  1. SELECT nombre, apellidos, direccion FROM clientes WHERE nombre = ? AND apellidos = ?

..

Lo del ORM (que es básicamente lo que mencionas) si es recomendable, tal y como recomendé en un post anterior.

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Consulta] SQLi En una web asi..
Nivel Web
Ifiuse 0 2,342 Último mensaje 23 Diciembre 2009, 04:50 am
por Ifiuse
[Resuelto] CONSULTA SELECT PHP
PHP
mgarcia.informatico 6 2,747 Último mensaje 30 Diciembre 2014, 15:18 pm
por mgarcia.informatico
Duda sobre cómo explotar esta vulnerabilidad (SQLi)
Nivel Web
SonrisaCs 2 2,448 Último mensaje 20 Febrero 2015, 16:44 pm
por pablox_co
[Resuelto] ordenar consulta con like ?
Bases de Datos
basickdagger 2 2,874 Último mensaje 26 Febrero 2015, 20:18 pm
por basickdagger
[Resuelto] consulta MY SQL PHP
PHP
javier.lenis 2 1,878 Último mensaje 1 Julio 2015, 19:28 pm
por javier.lenis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines