Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema De Seguridad

Estas en el tema de Problema De Seguridad en el foro de PHP en Foros del Web. Tengo esto creado para que los usuarios puedan cambiar su clave en cualquier momento, hasta el día de ayer, me cambiaron la contraseña tanto ami ...
  #1 (permalink)  
Antiguo 05/03/2014, 05:11
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Problema De Seguridad

Tengo esto creado para que los usuarios puedan cambiar su clave en cualquier momento, hasta el día de ayer, me cambiaron la contraseña tanto ami como a otros usuarios y entraron a la cuenta... Si alguien me puede ayudar.

Código PHP:
Ver original
  1. if(isset($_POST['save3'])) {
  2.         $username = $_SESSION['usuario'];
  3.         $password = FilterText(md5($_POST['password'], $username));
  4.         $password2 = FilterText(md5($_POST['password'], $username));
  5.        
  6.         if(empty($password))
  7.         {
  8.             $result = "No puedes dejar el campo de la contraseña vacio.";
  9.         }
  10.         else
  11.         {
  12.         $sql = mysql_query("SELECT id FROM users WHERE username = '".$username."' AND password = '".$password."' OR username = '".$username."' AND password = '".$password2."' LIMIT 1") or die(mysql_error());
  13.             if(mysql_num_rows($sql) < 1)
  14.             {
  15.                 $result = "Tu contrase&ntilde;a actual no coincide.";
  16.             } else {
  17.              if($_POST['new_password'] != $_POST['rep_new_password']) {
  18.              $result = "No coinciden las nuevas contrase&ntilde;as.";
  19.              }
  20.              else if(empty($_POST['new_password']))
  21.             {
  22.             $result = "No puedes dejar el campo nueva password vacio.";
  23.             }
  24.              else
  25.              {
  26.             $new_password = FilterText($_POST["rep_new_password"]);
  27.             $new_password = md5($new_password);
  28.              $sql = mysql_query("UPDATE users SET password='".$new_password."' WHERE username='".$_SESSION['usuario']."'");
  29.              if($sql) {
  30.              $result = "Cambios guardados correctamente.";
  31.              } else {
  32.              $result = "Error: No se pudieron guardar los cambios.";
  33.              }
  34.            
  35.              }
  36.             }
  37.        
  38.         }
  39.    
  40.     }
  #2 (permalink)  
Antiguo 05/03/2014, 05:24
Avatar de fbedia  
Fecha de Ingreso: julio-2010
Mensajes: 159
Antigüedad: 14 años, 4 meses
Puntos: 8
Respuesta: Problema De Seguridad

Deberías filtrar todos los datos recibidos por $_POST

Te recomiendo algo como lo siguiente:

Código PHP:
Ver original
  1. //strip_tags para retirar todas las etiquetas HTML y PHP de un string:
  2. $password = strip_tags($_POST['password']);
  3. //pasarle tambien un real_scape_string antes de usar la variable en la consulta sql
  4. $password = mysqli_real_escape_string($password);

Adicionalmente puedes controlar la longitud de la nueva password...

Código PHP:
Ver original
  1. //guardamos la longitud de la password
  2. $long_password = strlen($_POST["password"]);
  3. //comprobamos que la logitud este entre 4 caracteres y 20 por ejemplo
  4. if(($long_password<4)||($long_password>20)) {
  5.  
  6. //error... password muy corta o muy larga
  7.  
  8. } else {
  9.  
  10. //logitud ok... puedes continuar el codigo...
  11.  
  12. }

Con lo anterior deberia ser suficiente para evitar xss, sqli....etc...

Adicionalmetne... revisa que el BUG no venga por otro lado: cambia las contraseñas de la BD.... SSH.... analiza el servidor con algun antirrotkit por si tienes algojada alguna shell...etc..

Saludos.
__________________
Follow me on twitter @franbedia
  #3 (permalink)  
Antiguo 05/03/2014, 05:29
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 7 meses
Puntos: 40
Respuesta: Problema De Seguridad

Dependiendo de lo que haga Filter_Text() podría tener buena seguridad o no, de todas maneras un bug que veo es que en la sentencia SQL Update estas usando el valor de $_SESSION['usuario'] en vez de usar el ID que conseguiste varias lineas arriba haciendo las comprobaciones necesarias.


Un saludo
  #4 (permalink)  
Antiguo 05/03/2014, 05:34
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Problema De Seguridad

Cita:
Iniciado por fbedia Ver Mensaje
Deberías filtrar todos los datos recibidos por $_POST

Te recomiendo algo como lo siguiente:

Código PHP:
Ver original
  1. //strip_tags para retirar todas las etiquetas HTML y PHP de un string:
  2. $password = strip_tags($_POST['password']);
  3. //pasarle tambien un real_scape_string antes de usar la variable en la consulta sql
  4. $password = mysqli_real_escape_string($password);

Adicionalmente puedes controlar la longitud de la nueva password...

Código PHP:
Ver original
  1. //guardamos la longitud de la password
  2. $long_password = strlen($_POST["password"]);
  3. //comprobamos que la logitud este entre 4 caracteres y 20 por ejemplo
  4. if(($long_password<4)||($long_password>20)) {
  5.  
  6. //error... password muy corta o muy larga
  7.  
  8. } else {
  9.  
  10. //logitud ok... puedes continuar el codigo...
  11.  
  12. }

Con lo anterior deberia ser suficiente para evitar xss, sqli....etc...

Adicionalmetne... revisa que el BUG no venga por otro lado: cambia las contraseñas de la BD.... SSH.... analiza el servidor con algun antirrotkit por si tienes algojada alguna shell...etc..

Saludos.
La web la tengo subida a un Hosting, Acabo de buscar si tengo algún virus con "Virus scanner" y no hay nada...

Los Post como puedes ver los filtro mediante FilterText
Código PHP:
Ver original
  1. function FilterText($str, $advanced=false) {
  2.     if($advanced == true){ return mysql_real_escape_string($str); }
  3.     return $str;
  4. }

El mismo que hizo esto me dejo un comunicado y me dijo que uso: dork attack

Última edición por Jose789; 05/03/2014 a las 05:41
  #5 (permalink)  
Antiguo 05/03/2014, 05:47
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Problema De Seguridad

Cita:
Iniciado por Heli0s Ver Mensaje
Dependiendo de lo que haga Filter_Text() podría tener buena seguridad o no, de todas maneras un bug que veo es que en la sentencia SQL Update estas usando el valor de $_SESSION['usuario'] en vez de usar el ID que conseguiste varias lineas arriba haciendo las comprobaciones necesarias.
Un saludo
Espera que yo también me entienda de aqui :

Código PHP:
Ver original
  1. $sql = mysql_query("SELECT id FROM users WHERE username = '".$username."' AND password = '".$password."' OR username = '".$username."' AND password = '".$password2."' LIMIT 1") or die(mysql_error());
Sacar el Id correspondiente.

Y aquí actualizar la nueva password del id mas arrojado mas arriba.

Código MySQL:
Ver original
  1. $sql = mysql_query("UPDATE users SET password='".$new_password."' WHERE id='".$id."'");
  #6 (permalink)  
Antiguo 05/03/2014, 05:50
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 7 meses
Puntos: 40
Respuesta: Problema De Seguridad

Exacto a eso me refería, pero como te han dicho el problema podría estar en otro lado, en otros scripts, o fuera de lo que es PHP (aunque siendo un servidor compartido esto lo veo raro), lo más seguro es que sea a nivel de PHP, pero deberías revisar todos los scripts, y a tu Text_Filter le añadiría htmlentities o strip_tags.

Un saludo
  #7 (permalink)  
Antiguo 05/03/2014, 05:55
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Problema De Seguridad

En ajustes esta ese y el único UPDATE y el solo hizo cambiar la pass al usuario que quisiera No creo que el problema venga de otro lado.
  #8 (permalink)  
Antiguo 05/03/2014, 06:06
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 7 meses
Puntos: 40
Respuesta: Problema De Seguridad

Entonces lo más probable es que fuese lo que te he comentado, ya que si el usuario que hizo el hackeo es capaz de cambiar el valor de $_SESSION['usuario'] podría elegir a que usuario le cambiaba el pass, ahora no hay posibilidad a elección, se cambia al usuario que le corresponda la contraseña introducida.

A priori no le veo más vulnerabilidades a ese script.

Un saludo
  #9 (permalink)  
Antiguo 05/03/2014, 08:43
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Problema De Seguridad

Vale muchas gracias a todos hice todo lo que me dijeron... :)

Etiquetas: mysql, seguridad, select, sql, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:42.