Foros del Web » Programando para Internet » PHP »

Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destruir sesiones

Estas en el tema de Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destruir sesiones en el foro de PHP en Foros del Web. Hola amigos. les cuento mi problema, tengo un Servidor dedicado en CENTos en el cual, solo tengo una cuenta (creada con WHM) dentro de esa ...
  #1 (permalink)  
Antiguo 07/11/2011, 15:09
 
Fecha de Ingreso: noviembre-2011
Mensajes: 13
Antigüedad: 13 años, 1 mes
Puntos: 0
Desacuerdo Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destruir sesiones

Hola amigos.
les cuento mi problema, tengo un Servidor dedicado en CENTos
en el cual, solo tengo una cuenta (creada con WHM)

dentro de esa cuenta, tengo un sitio web muy visitado, que esta hecho en FLASH
(y es programado por php)

desde hace unos dias, un usuario esta atacando un mensajero, el cual se conecta a
insertar.php y recibe 2 parametros del flash
Nombre
Mensaje

insertar.php se encarga de procesar dichas variables, para que no contengan inyeccion SQL.

bueno, ese no es el problema. el problema es que me estan insertando SPAM (una gran cantidad de mensajes insertados por segundo)

Supuse que un usuario descompilo el flash, supo los valores que se enviaban a insertar.php y realizo una aplicacion la cual enviaba esos 2 valores al php.

como los campos solo contenian nombres y mensajes aleatorios(mas no dañinos) el insert.php los insertaba.

entonces.. intente capturar la IP del usuario
[URL="www.eslomas.com/index.php/archives/2005/04/26/obtencion-ip-real-php/"](obtener ip real)[/URL]

e insert.php hacia una consulta, si el ultimo mensaje provenia de dicha IP, simplemente no insertaba.


el usuario se detuvo por unas 3 horas, y pense que el problema estaba solucionado


al cabo de dicho tiempo se empezo a llenar de SPAM la base de datos, vi la tabla y las ips empezaron a cambiar ''drasticamente'' entonces la consulta a la base de datos era "nula"

entonces, pense en verificar el navegador del usuario.
($_SERVER['HTTP_USER_AGENT'] e insertarlo en BD.

supe que el usuario mamon utilizaba java

entonces insert.php solo insertaba mensajes provenientes de IE,Firefox,Safari,Chrome.

igual, el problema se detuvo unas 2 horas.
(supe que el problema ya estaba solucionado)

FUCK!
se volvio a llenar de SPAM mi base de datos
cheque rapidamente de que navegador provenian los mensajes, y decia "Firefox"!!
obviamente el usuario cambio la referencia USER_AGENT
(supe que si se podia, pero jamas pense que se imaginara que lo estaba deteniendo por eso)

(cabe aclarar que a mi no me gustan los CAPTCHAS, se me hacen molestos para los usuarios)

pero en este punto sabia que tenia que empezar a utilizar uno, antes de ello quise probar unas cosas mas.

pense en un "captcha invisible" (cabe aclarar que uso 100% flash)

lo que hice, fue esconder un Movieclip vacio, y dentro de el, hacer un "load" cada 5 segundos (con direccion absoluta para no mostrar errores al probar)

el load era a un archivo que estaba fuera de la carpeta del insert.php
y con un nombre muy diferente (en este post lo llamare invisible.php)

invisible.php contiene:
Código PHP:
<?php
session_start
();
$c=md5(rand());
$_SESSION['codigo']=$c;
echo
"codigo=$c";
//ya se que es estupido mostrar el codigo, pero si se trata de
//un captcha invisible, el flash lo tiene que saber (no el usuario(aparentemente))
como dije antes, el flash hacia un load a este archivo y cargaba codigo y lo enviaba de forma _global al flash entero.
el valor global lo llamare en este post codigo_global

okey, entonces, ahora mi flash mandaba 3 parametros:
nombre
mensaje
codigo_global


insert.php hacia la comparacion
Código PHP:
<?php
if(!isset($_SESSION['codigo'])) exit();
//si no se a cargado la session (por medio de[B]invisible.php[/B]) entonces exit;

if(!isset($_POST['codigo_global'])) exit();
//si no hay valor en codigo_global (POST) obviamente el valor tiene que ser si visito el flash
//(ó invisible.php)

if($_POST['codigo_global'] !== $_SESSION['codigo']) exit();
//si existen los valores, pero no son iguales, sacalo!

//aclaro que los valores ya van formateados para evitar las inyecciones, pero asi lo puse para
//ahorrar codigo
*** En teoria un usuario tiene que visitar la pagina para poder enviar el mensaje

deje de recibir SPAM un dia, entonces pense que era una solucion ''rapida, pero no efectiva''
ya que si descubria invisible.php estaba perdido(practicamente)

asi fue, al dia siguiente SPAM SPAM SPAM

**o dios mio!! **

entonces, dije, bueno, ahora probare otro metodo
me dispuse a crear unas lineas.

teoria:
si es la primera vez que manda mensaje, crear sesion (contador) con valor 1
si vuelve a mandar mensaje, sumar contador a 2
si vuelve a mandar mensaje, sumar contador a 3
si vuelve a mandar mensaje, sumar contador a 4
...
si contador llega a 10, EXIT

(valor de contador se guardara en la BD)
teoricamente si funcionaba, de varias PC envie mensajes
y si iban seguidos (o como sea)
el contador si funcionaba, al llegar a 10 EXIT definitivo hasta cerrar navegador.
...

...

..

SPAM SPAM SPAM!!



ASH!
porque contador(sesion) no sumaba y permanecia siempre en 0 de mensaje en mensaje????????


aclaro, mi PC (y mi red local en gral) tiene antivirus actualizado, firewall al puro tiro.
asi que no creo que me hayan plantado algo en mi pc

la pregunta es...

se pueden burlar las sessiones???
a pesar de que tengo un sleep(4) antes de insertar, porque los mensajes se insertan
en menos de 1 segundo??? (campo fecha/hora/segundo me dice eso)

cuando borro insert.php automaticamente se deja de recibir spam, asi que no creo que haya otro archivo que los introduzca.
  #2 (permalink)  
Antiguo 07/11/2011, 15:19
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

si tienes sesiones automáticas claro que puedes crear un boot que no envié cookies y siempre habrá una session activa.

otra forma es registrar la IP y bloquear si la misma IP intenta de enviar un máximo de 50 inserts
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 07/11/2011, 16:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

Lamentablemente no se puede compartir tan sencilla la sesión desde Flash a PHP, ya que tienes que forzosamente enviar el identificador de sesión desde Flash.

La forma más correcta para bloquear lo que haces es, transmitiendo el identificador de sesión desde flash hacia PHP, y en PHP verificar que sea una sesión valida, y así permitir el insert, en caso contrario (que fuera una sesión aleatoria) denegar el acceso.

Saludos.
  #4 (permalink)  
Antiguo 07/11/2011, 18:32
 
Fecha de Ingreso: noviembre-2011
Mensajes: 13
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

Gracias por la contentacion a los 2.

cual seria la forma (en php)

de enviar la ID de la session y como resolverla en otra pagina?

Saludos y gracias
  #5 (permalink)  
Antiguo 07/11/2011, 21:13
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años, 6 meses
Puntos: 55
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

Y porque no usas un captcha, que problema tiene usar una solucion tan facil como esa? si tu problema es que sea molesto para los usuarios esas largas palabras del recaptcha de google, puedes crear tu propio captcha con numero aleatorios descargados desde tu base de datos del 1 al 10 y sumandolos, luego pides que pongan el resultado y listo, facil y efectivo.
  #6 (permalink)  
Antiguo 07/11/2011, 22:44
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años, 6 meses
Puntos: 55
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

Despues de leer tu mensaje pense en crear una captcha simple como el de openclassifieds, este muestra dos valores del 0 al 9 y pide al usuario hacer la suma de estos valores, si la suma es correcta crea el registro, si no, pasa de largo.
Yo use una base de datos con una tabla captcha y dos campos (id, valor) en valor cree diez registros con los numeros del 0 al 9 (diez en total), luego selecciono dos al azar, los sumo secretamente, y los mando por un hidden hasta el archivo que ingresa el mensaje, junto con un input rellenado por el usuario, si los valores son iguales se crea el registro, si no pasa de largo o lo mandas a algun otro lado.

captcha.php
Código PHP:
Ver original
  1. <?php
  2. $ss=1;
  3. $sentencia="SELECT * FROM captcha ORDER by rand() LIMIT 2";
  4. $resultado=mysql_query ($sentencia)or die("Error al ver los valores del captcha".mysql_error());
  5. while($ver = mysql_fetch_object($resultado)){
  6. $ccc=$ver->valor;
  7. $capt[$ss]="$ccc";//creamos primero la variable $capt[1] y luego $capt[2] ayudados por la variable$ss
  8. $ss=$ss+1;//aumentamos $ss en 1
  9. }//fin while
  10. $suma=$capt[1]+$capt[2];//creamos la suma secreta
  11.  ?>

una vez con este archivo creado, lo llamamos al formulario con include() , y agregamos el hidden y el input para mandar los datos

Código PHP:
Ver original
  1. el principio de tu form
  2. ---
  3. ---
  4. --
  5. <?php
  6. require("inc/captcha.php");
  7. echo"<div>Cuanto es $capt[1] + $capt[2] ?";
  8.  ?>
  9.  <input id="agregarsuma" title="Ingresa tu nombre" name="suma2">
  10.  <input type="hidden" name="suma1" value="<?php echo"".$suma.""; ?>" >
  11. ---
  12. --
  13. ---
  14. resto de tu form

Código PHP:
Ver original
  1. //y en el archivo en el que esta el codigo para ingresar el mensaje o lo que sea, pones
  2. $suma1=$_POST['suma1'];
  3. $suma2=$_POST['suma2'];
  4. if($suma1==$suma2){
  5. echo"creamos registro del mensaje";
  6. }else{
  7. echo"o se equivoco al sumar o es spam";
  8. }

Nota:Si tu atacantee s muy habil y logra leer los numeros dados para la suma, puedes cambiar el campo valor por el campo imagen, y agregarle imagenes de los numeros del 0 al 9 , entonces muestras las imagenes y sumas los datos de los campos valor, espero que te sea de ayuda, saludos.

Última edición por waldragon; 07/11/2011 a las 22:59
  #7 (permalink)  
Antiguo 07/11/2011, 23:42
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 7 meses
Puntos: 322
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

Se me ocurre que, siguiendo el consejo de GatorV, crees un ID relativo a la fecha actual (función date) y envíes al PHP, así como envías los parámetros desde flash, el ID junto con el valor de date que tenía a la hora de generar el ID pero encriptado en un algoritmo de tu elección (incluso puedes hacer uno propio, aumentando más la seguridad). En el PHP te restaría desencriptar el valor de date, re-crear el ID y compararlo con el ID recibido.

Hace tiempo hice algo parecido para un sistema de 'token', es por eso que me acordé

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #8 (permalink)  
Antiguo 08/11/2011, 09:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

Exacto la idea es que cuando entren a tu app tu generes un id de sesión, digamos algo simple:
Código PHP:
Ver original
  1. // Generas el ID
  2. $id = md5(time());
  3.  
  4. // Lo almacenas en un medio persistente como una base de datos junto con la ip para mayor seguridad
  5. guardar_en_bdd($id);
  6.  
  7. // Lo transmites a flash de alguna manera
  8. echo "id=" . $id;

En Flash lo guardas en alguna variable y por cada request, envias el ID de sesión, así cuando vayan a hacer el comentario, compruebas:
Código PHP:
Ver original
  1. $id = $_POST['id'];
  2. // compruebas si ya comento usando el ID y la IP por ejemplo
  3. if (ya_comento($id)) {
  4.       die("ya comentaste");
  5. }
  6. // insertas el comentario

Con eso deberías de mitigar mucho el riesgo de que envien comentarios falsos ya que solo se generaría un id por cada request de ip y visita a la pagina, aunque también como te dicen, el captcha es la solución ideal para este tipo de casos.

Pruebas que distinguen a un bot de un usuario real.

Otra opción es que tu aplicación la bloquees con un usuario y contraseña, así el usuario se tiene que registrar para comentar y puedes detectar intentos fraudulentos más fácilmente.
  #9 (permalink)  
Antiguo 08/11/2011, 10:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Usuario malintencionado ataca el servidor(enviando SPAM), capaz de destrui

Otra opción ya más a fondo es usar algún plugin de Apache que detecta casos como este, de requests múltiples y los cataloga como un tipo de ataque DoS, y bloquea el acceso a esa ip por algún tiempo.

También puedes hacer eso desde código PHP, almacenas la ip y el número de requests, si son más de x requests en x tiempo bloqueas el acceso.

Etiquetas: destruir, sesiones, spam, sql, tabla, variables, 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 05:04.