Foros del Web » Programando para Internet » PHP »

Ataque a mi web por inyección mysql

Estas en el tema de Ataque a mi web por inyección mysql en el foro de PHP en Foros del Web. Hola gente!! Tras comprobar que mi servidor llevaba unos días excesivamente lentos me he encontrado viendo los logs de consultas a my sql lo siguiente: ...
  #1 (permalink)  
Antiguo 16/05/2011, 13:33
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Ataque a mi web por inyección mysql

Hola gente!!

Tras comprobar que mi servidor llevaba unos días excesivamente lentos me he encontrado viendo los logs de consultas a my sql lo siguiente:

where ID=1 and 5=6 union select concat(0x5E252421,ifnull(`userid`,0x4E5C4C),char(9 ),ifnull(`password`,0x4554C4C),char(9),ifnull(`ema il`,0x4EC4C),char(9),0x2B7D2F) from `basededatos`.`usaurios` where email like 0x25686F74696C2E25 limit 30483,1

Lo que está en rojo es el final de mi consulta, el nº 1 se pasa POR GET, y todo lo demás lo están inyectando pero no se como!!

La variable ID para recibirla le aplico strip_tags pero no se si es suficiente para evitar esto.

El caso es que no se como lo están haciendo, si pasan esa variable externamente o directamente desde la url, pero el caso es que me llegan cientos de consultas así

Ayuda por favor!!
  #2 (permalink)  
Antiguo 16/05/2011, 13:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

Si la pasas directamente por GET es por eso que te estan haciendo una inyeccion, si tu variable es del tipo INT es mejor comprobar:
Código PHP:
Ver original
  1. $id = $_GET['id'];
  2. if (!is_numeric($id)) {
  3.         echo "ID no es numerico";
  4. }
  5. $id = (int) $id;
  6. $query = "SELECT .. WHERE id=$id";

O aún mejor usar consultas preparadas con PDO para realmente limpiar mejor las variables (aunque siempre es bueno que compruebes los valores).

Recuerda: NUNCA confies en el input que viene desde el cliente (cookies, get, post, archivos).

Saludos.
  #3 (permalink)  
Antiguo 16/05/2011, 13:50
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Ataque a mi web por inyección mysql

Muchas gracias, donde puedo consultar información del PDO?

Por cierto, sabéis que hace exactamente esa consulta que me han lanzado a miles? Pueden haberme sacado alguna contraseña?

Gracias!! Que disgusto :(
  #4 (permalink)  
Antiguo 16/05/2011, 14:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

Sí al parecer estan tratando de seleccionar campos de tu base de datos.

http://www.php.net/pdo

Es un disgusto, pero no te lo tomes a mal, es tu tarea como programador el hacer una web lo más segura posible.

Saludos.
  #5 (permalink)  
Antiguo 16/05/2011, 14:03
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Respuesta: Ataque a mi web por inyección mysql

Aprovecho para preguntar, ya que tiene relación con esto e igual le sirve al autor del post.

Ultimamente estoy encontrando post de este estilo, mi pregunta:

Es posible mediante algún tipo de técnica, saltarse un str_replace?

Si tienes claro que datos vas a obtener, tienes claro que caracteres no permitir.

Pero me queda esa duda, si hay posibilidad de que se salten eso.

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #6 (permalink)  
Antiguo 16/05/2011, 14:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

No, no se puede "brincar" un str_replace, sí esta dentro de tu código, se va a ejecutar con el flujo de tu programa.

Saludos.
  #7 (permalink)  
Antiguo 16/05/2011, 14:13
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por GatorV Ver Mensaje
Sí al parecer estan tratando de seleccionar campos de tu base de datos.

[url]http://www.php.net/pdo[/url]

Es un disgusto, pero no te lo tomes a mal, es tu tarea como programador el hacer una web lo más segura posible.

Saludos.
Crees que debería cambiar contraseñas o algo?

Tengo miedo a las consecuencias de este ataque
  #8 (permalink)  
Antiguo 16/05/2011, 14:14
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Ataque a mi web por inyección mysql

¿que tipo de seguridad se puede implementar con str_replace?
  #9 (permalink)  
Antiguo 16/05/2011, 14:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

Seguridad, pues solamente el reemplazar carácteres que no requieras, es mucho mejor usar PDO para eso ya que usando prepared statements, limpias las variables de una forma más correcta.

Saludos.
  #10 (permalink)  
Antiguo 16/05/2011, 14:37
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por GatorV Ver Mensaje
Seguridad, pues solamente el reemplazar carácteres que no requieras, es mucho mejor usar PDO para eso ya que usando prepared statements, limpias las variables de una forma más correcta.

Saludos.
Estoy viendo que con PDO tendré que cambiar todo el código, pues cambia la manera de conexión, e incluso de consultar.

Lo que no me queda claro que función dentro de PDO es la que limpia las variables

gracias!!
  #11 (permalink)  
Antiguo 16/05/2011, 15:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

Cuando creas un query con prepared statements:
Código PHP:
Ver original
  1. $sQuery = "SELECT * FROM person WHERE id = ?";
  2. $stmt = $pdo->prepare($sQuery);
  3. $stmt->bindParam(1, $id, PDO::PARAM_INT);
  4. $stmt->execute();
  5. foreach ($stmt->fetchAll() as $row) {
  6.         var_dump($row);
  7. }

Saludos.
  #12 (permalink)  
Antiguo 16/05/2011, 15:58
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 9 meses
Puntos: 155
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por arrasia Ver Mensaje
Hola gente!!

Tras comprobar que mi servidor llevaba unos días excesivamente lentos me he encontrado viendo los logs de consultas a my sql lo siguiente:

where ID=1 and 5=6 union select concat(0x5E252421,ifnull(`userid`,0x4E5C4C),char(9 ),ifnull(`password`,0x4554C4C),char(9),ifnull(`ema il`,0x4EC4C),char(9),0x2B7D2F) from `basededatos`.`usaurios` where email like 0x25686F74696C2E25 limit 30483,1

Lo que está en rojo es el final de mi consulta, el nº 1 se pasa POR GET, y todo lo demás lo están inyectando pero no se como!!

La variable ID para recibirla le aplico strip_tags pero no se si es suficiente para evitar esto.

El caso es que no se como lo están haciendo, si pasan esa variable externamente o directamente desde la url, pero el caso es que me llegan cientos de consultas así

Ayuda por favor!!
se puede ver como haces esa consulta? el codigo en si?
__________________
No me interesan ni las gracias ni los karmas , pero si que se genere conocimiento, si se dio con la respuesta por favor confirmalo
  #13 (permalink)  
Antiguo 16/05/2011, 16:12
 
Fecha de Ingreso: febrero-2010
Mensajes: 295
Antigüedad: 14 años, 9 meses
Puntos: 58
Respuesta: Ataque a mi web por inyección mysql

Ya que se habla de seguridad, quería hacer una consulta.
Una vez leí por ahí que para evitar ataques de inyeccion sql era aconsejable no poner nombres muy evidentes a los campos de la tabla. Así, por ejemplo, era mejor poner passw_123412 en vez de password, etc. ¿Es esto correcto?, ¿ayuda en algo eso o es una solución demasiado simplista?

Gracias. Un saludo.
  #14 (permalink)  
Antiguo 16/05/2011, 16:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

Pues ayuda, aunque sí dejas pasar un hacker hasta el punto que puede ejecutar consultas en tu BDD, creo tienes más problemas, es mejor tratar de evitar que lleguen hasta ese punto y frenarlos en la entrada.

Saludos.
  #15 (permalink)  
Antiguo 16/05/2011, 16:33
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Ataque a mi web por inyección mysql

vaya que si es molesto que hagan eso, pero es muy común, y no solo en las variables $_GET, actualmente enviar datos alterados por $_POST es muy fácil también con herramientas como google Chrome

Cuando haces un envió por get tu url queda algo así:

Código HTML:
Ver original
  1. pagina.com?variable=valor

tu tomas ese valor y lo pones en una sentencia mysql y queda algo asi:

Código PHP:
Ver original
  1. "Select * FROM tabla where variable1='".$_GET[variable]."';"

lo que se convierte en:

Código MySQL:
Ver original
  1. "Select * FROM tabla where variable1='variable';"

pero que pasa si un usuario cambia la url a esto?

Código HTML:
Ver original
  1. pagina.com?variable=valor';DELETE FROM tabla

pues, que tu sentencia queda así:

Código MySQL:
Ver original
  1. "Select * FROM tabla where variable1='variable';DELETE FROM tabla"

y pierdes toda esa tabla de la base de datos.

Para evitar este tipo de cosas tal como te dijo GatorV asegúrate de que los campos numéricos sean numéricos (is_numeric($variable);) y si son textos reemplaza todos los ' por \' (str_replace("'","\'",$variable);)

algunos se creen hackers pero es tu deber demostrarles que son noobs!

tienes suerte de que estén ayudandote rápido con esto, es algo que no debes dejar pasar mucho tiempo mas.
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #16 (permalink)  
Antiguo 16/05/2011, 16:59
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Ataque a mi web por inyección mysql

que consigue exactamente (str_replace("'","\'",$variable);)

Tengo que aplicar todo tanto a lo que pasa por get como por post?

Mil gracias señores!! ;)
  #17 (permalink)  
Antiguo 16/05/2011, 17:14
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Ataque a mi web por inyección mysql

te recomiendo que si uses validaciones por $_POST, aunque sea poca la gente que sepa modificar estos valores las hay.

str_replace("'","\'",$variable);
Esta instruccion reemplaza todas las ' por \' lo que evita que las cadenas se rompan, por ejemplo, en el caso anterior:

"Select * FROM tabla where variable1='variable';DELETE FROM tabla"

se convertiría en

"Select * FROM tabla where variable1='variable\';DELETE FROM tabla'"

lo que salvaría tu tabla de la muerte XD
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #18 (permalink)  
Antiguo 16/05/2011, 17:15
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por stramin Ver Mensaje
te recomiendo que si uses validaciones por $_POST, aunque sea poca la gente que sepa modificar estos valores las hay.

str_replace("'","\'",$variable);
Esta instruccion reemplaza todas las ' por \' lo que evita que las cadenas se rompan, por ejemplo, en el caso anterior:

"Select * FROM tabla where variable1='variable';DELETE FROM tabla"

se convertiría en

"Select * FROM tabla where variable1='variable\';DELETE FROM tabla'"

lo que salvaría tu tabla de la muerte XD
De nuevo muchas gracias.

Para validad los formularios, tengo areas de texto, como evito ahí código malicioso?

Gracias
  #19 (permalink)  
Antiguo 16/05/2011, 20:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

En lugar de usar ese str_replace es mejor usar addslashes() o aún mejor si estas usando MySQL mysql_escape_string().

Saludos.
  #20 (permalink)  
Antiguo 16/05/2011, 21:16
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 21 años, 3 meses
Puntos: 105
Respuesta: Ataque a mi web por inyección mysql

Holas,

Recomiendo que use el:

mysql_real_escape_string


Y haga un repaso absoluto de todas la entradas GET y POST, y cambia los accesos de tu base de datos.

Saludos
Gildus
__________________
.: Gildus :.
  #21 (permalink)  
Antiguo 17/05/2011, 01:43
Avatar de Jask  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 773
Antigüedad: 18 años, 7 meses
Puntos: 15
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por gildus Ver Mensaje
Holas,

Recomiendo que use el:

mysql_real_escape_string


Y haga un repaso absoluto de todas la entradas GET y POST, y cambia los accesos de tu base de datos.

Saludos
Gildus
No entiendo muy bien que hace mysql_real_escape_string La web de php no me lo deja muy claro...

:)
__________________
Os iusti meditabitur sapientiam
Si te he ayudado, por qué no un poquito de Karma :) ?
  #22 (permalink)  
Antiguo 17/05/2011, 02:38
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por gildus Ver Mensaje
Holas,

Recomiendo que use el:
[URL="http://www.php.net/manual/en/function.mysql-real-escape-string.php"]
mysql_real_escape_string[/URL]

Y haga un repaso absoluto de todas la entradas GET y POST, y cambia los accesos de tu base de datos.

Saludos
Gildus
Ahora le echo un vistazo, muchas gracias :)

No obstante, para las variables que tienen que ser números con comprobar que realmente son números me valdría verdad?
  #23 (permalink)  
Antiguo 17/05/2011, 05:01
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Respuesta: Ataque a mi web por inyección mysql

En primer lugar daos las gracias a todos por los aportes, me han aclarado muchas dudas.

Con una función como esta solucionariamos "mas o menos " el problema?
Código PHP:
function mysql_escape($cadena) {
    
// Incluimos los caracteres que queremos reemplazar
    
$nopermitidos = array('<','>','-''/');
    
// Los reemplazamos
    
$cadena str_replace($nopermitidos""$cadena);
    
// Para no escapar dos veces, comprobamos si esta activado    
    
if(get_magic_quotes_gpc() != 0) {
    
$cadena stripslashes($cadena);
    }
    return 
mysql_real_escape_string($cadena);

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #24 (permalink)  
Antiguo 17/05/2011, 07:40
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por arrasia Ver Mensaje
Ahora le echo un vistazo, muchas gracias :)

No obstante, para las variables que tienen que ser números con comprobar que realmente son números me valdría verdad?
si, pero usa is_numeric(), no uses is_int().

Cita:
Iniciado por Uncontroled_Duck Ver Mensaje
En primer lugar daos las gracias a todos por los aportes, me han aclarado muchas dudas.

Saludos,
si, pero como dijeron mas arriba, hay funciones que ya lo hacen y no olvides validar los números también :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #25 (permalink)  
Antiguo 17/05/2011, 08:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Ataque a mi web por inyección mysql

Recuerden algo importante, si bien la función que pone Uncontroled_Duck podría verse bien, es importante que no generalizemos, limpia cada variable por lo que necesita, si necesitas números, ¿para que ocupar esa función?.

Es mejor tratar cada variable para el dato que necesites, el filtrar todo POST, o GET no tiene caso si solo vas a usar una variable, es mejor tener el control exacto de que variable vas a ocupar y que tipo de dato debe de contener.

Saludos.
  #26 (permalink)  
Antiguo 17/05/2011, 13:05
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por GatorV Ver Mensaje
Recuerden algo importante, si bien la función que pone Uncontroled_Duck podría verse bien, es importante que no generalizemos, limpia cada variable por lo que necesita, si necesitas números, ¿para que ocupar esa función?.

Es mejor tratar cada variable para el dato que necesites, el filtrar todo POST, o GET no tiene caso si solo vas a usar una variable, es mejor tener el control exacto de que variable vas a ocupar y que tipo de dato debe de contener...
Digamos que sería una base, después habría que hacer tantas funciones como distintos tipos de datos queremos recoger.

GatorV, como podríamos validar los números?

Cita:
Iniciado por stramin Ver Mensaje
...si, pero como dijeron mas arriba, hay funciones que ya lo hacen y no olvides validar los números también :)
Tienes algún enlace a mano donde se puedan ver esas funciones.

Gracias por dedicarnos vuestro tiempo,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #27 (permalink)  
Antiguo 17/05/2011, 14:12
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por Uncontroled_Duck Ver Mensaje
Digamos que sería una base, después habría que hacer tantas funciones como distintos tipos de datos queremos recoger.

GatorV, como podríamos validar los números?
is_numeric();

Cita:
Iniciado por Uncontroled_Duck Ver Mensaje
Tienes algún enlace a mano donde se puedan ver esas funciones.

Gracias por dedicarnos vuestro tiempo,
puedes encontrar todas las funciones existentes de PHP en el manual de php.net:

http://php.net/manual/en/function.my...ape-string.php
http://php.net/manual/en/pdo.prepared-statements.php
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #28 (permalink)  
Antiguo 17/05/2011, 14:30
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Ataque a mi web por inyección mysql

O mejor aún usar ctype para detectar que tipo de dato es exactamente, ya que las peticiones por via POST o GET se reciben como string.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #29 (permalink)  
Antiguo 17/05/2011, 14:48
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por abimaelrc Ver Mensaje
O mejor aún usar [URL="http://www.php.net/manual/en/book.ctype.php"]ctype[/URL] para detectar que tipo de dato es exactamente, ya que las peticiones por via POST o GET se reciben como string.
Interesante.

stramin, voy a echar un vistazo a esas funciones.

Gracias,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #30 (permalink)  
Antiguo 17/05/2011, 15:15
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Ataque a mi web por inyección mysql

Cita:
Iniciado por abimaelrc Ver Mensaje
O mejor aún usar ctype para detectar que tipo de dato es exactamente, ya que las peticiones por via POST o GET se reciben como string.
sip, por eso le dije que no usara is_int() XD

por cierto alguien se fijo de que en la inyección sql la consulta dice " and 5=6 " XD
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D

Etiquetas: inyección, mysql, ataques
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

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 09:13.