Foros del Web » Programando para Internet » PHP »

Me están hackeando la página!

Estas en el tema de Me están hackeando la página! en el foro de PHP en Foros del Web. Todos los fines de semana me están hackeando la página , a ver si me ayudan a encontrar la vilnerabilidad en el código. Creo que ...
  #1 (permalink)  
Antiguo 05/11/2006, 05:31
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Me están hackeando la página!

Todos los fines de semana me están hackeando la página , a ver si me ayudan a encontrar la vilnerabilidad en el código.

Creo que consiguen hackear la página inyectando el código a través de un formulario de contacto que existe en la web .

La página no tiene conexión a base datos ni sentencias sql. Al principio pensé que el problema residía en que estaba usando variables para componer los includes, es decir, utilizaba:

include $root."/includes/title.inc.php";

Evité esto, y lo sustituí por:

include $_SERVER["DOCUMENT_ROOT"]."/includes/title.inc.php";

Pero el hackeo se sigue produciendo . La solución creo que pasa por validar adecuadamente los campos de texto del formulario, he utilizado diversas fórmulas pero no consigo evitar los ataques.
  #2 (permalink)  
Antiguo 05/11/2006, 05:33
Avatar de renton  
Fecha de Ingreso: enero-2004
Ubicación: BCN (PPCC)
Mensajes: 573
Antigüedad: 20 años, 2 meses
Puntos: 1
Como no dés mas información (tipo de hackeo, ejemplos mas extensos del código, un link a tu web...) veo chunguillo encontrar el fallo.
__________________
"No et limites a contemplar aquestes hores que ara venen, baixa al carrer i participa.
No podran res davant un poble unit, alegre i combatiu!!"
  #3 (permalink)  
Antiguo 05/11/2006, 06:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Creo que consiguen hackear la página inyectando el código a través de un formulario de contacto que existe en la web
Si crees eso .. indica el código de tus formularios, el código que lo procesa y donde van esos datos a parar: los presentas tal cual en tu página HTML? .. generas un e-mail? .. va a una BBDD (según dices esto no ..) ..

Podemos ver el ejemplo en vivo del "hackeo"? .. que es lo que te hacen exactamente?

En general .. el hecho por ejemplo de no filtrar variables que vengan externas a tu script te expones a "ataques" de tipo "XSS" (Cross Site Scripting):

http://es.wikipedia.org/wiki/XSS

De esta manera te inyectan código HTML/Javascript en tus formularios (donde pides datos en general, no sólo en formulario .. también puede ser por el URL) y si el dato que recibes directamente lo presentas en tu página sin más filtrado (aunque por médio lo almacenes en una BBDD o archivo de texto plano o generes un e-mail por ejemplo ..) te podrían ejecutar algúna sentencia Javascript maliciosa.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 05/11/2006, 06:59
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Es que temo dar la dirección de la web, a ver si este hackeo se va a convertir en una diversión de masas.

Lo que me gustaría conseguir al menos es información de cómo validar adecuadamente un formulario para evitar inyección de código. He buscado en Google pero no encuentro buenos ejemplos de validación anti-hackeo de forms
  #5 (permalink)  
Antiguo 05/11/2006, 07:03
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
El formulario lo único que hace es generar un email con los datos que me llega a mi correo, o sea, tal que así:


$msg= "";
$msg= "Mensaje del formulario de contacto ";
$msg.= "\nNombre: ". $_POST['nombre'];
$msg.= "\nEmail: ".$_POST['email'];
$msg.= "\nTelefono: ".$_POST['telefono'];
$msg.= "\nConsulta: \n".$_POST['comentario'];


$subject = "Consulta enviada desde por: ".$_POST['nombre'];

mail('[email protected]', $subject, $msg, "FROM: dominio.com <[email protected]>\n");

  #6 (permalink)  
Antiguo 05/11/2006, 07:08
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Otra cosa: lo que hacen al hackear es meter enlaces ocultos, supongo que con el fin de conseguir posicionamiento, ya que la web en cuestión tiene un PR elevado.

Tras hackearme, me aparece tras el </html> final una larga lista de enlaces tal que así:

<u style=display:none><a href="http://www.everykid.com/worldnews3/popeye/tramadol/buy-tramadol.html">buy tramadol</a> ........ </u>
  #7 (permalink)  
Antiguo 05/11/2006, 07:12
Avatar de renton  
Fecha de Ingreso: enero-2004
Ubicación: BCN (PPCC)
Mensajes: 573
Antigüedad: 20 años, 2 meses
Puntos: 1
Bueno, en mi opinión, basta con que hagas pasar todo lo que introducen en tu formulario por una función que reemplace los tags <,> y las comillas ",' por, por ejemplo, sus corrrespondientes simbolos de html (o que si detecta uno de estos simbolos, no deje "pasar" la transacción).
__________________
"No et limites a contemplar aquestes hores que ara venen, baixa al carrer i participa.
No podran res davant un poble unit, alegre i combatiu!!"
  #8 (permalink)  
Antiguo 05/11/2006, 07:23
Avatar de ZiTAL  
Fecha de Ingreso: marzo-2004
Ubicación: Bermio (Bizkaia)
Mensajes: 1.545
Antigüedad: 20 años, 1 mes
Puntos: 62
;)

no dejes que te metan codigo en tus formularios, mira esto:

http://es2.php.net/manual/es/function.htmlentities.php

suerte
__________________
http://zital.no-ip.org
____________________

Euskerie ahuen eta bijotzan
  #9 (permalink)  
Antiguo 05/11/2006, 07:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Deberías indicar el código completo que ya te pedí.

Ese "HTML" que te injectan .. donde lo ves? .. en tu e-mail generado? .. o a caso en tu página que genera el e-mail también haces una vista previa de lo que vas a enviar (algún "echo" a tus $_POST variables?)

Tu en cuerpo del mensaje necesitas aceptar HTML o no? .. (aunque luego compongas el e-mail en HTML) ..

Bueno .. en general deberías aplicar htmlentities() mínimo a tus variables $_POST para evitar que esos "links" sea "ejecutables" (o mejor dicho clickeables). Pero, si realmente no aceptas nada de HTML en tus "input" mejor quita todo HTML o código que pueda venir por ahí .. es decir todo lo que esté bajo < y > con strip_tags()

Luego podrías usar sesiones por ejemplo para asegurarte de que pasan de tu formulario al script de proceso y no directamente injectando datos a tu script PHP de proceso.

Incluso (lo más seguro) es combinar todo esto y usar técnicas de "CAPTCHA" (tienes una FAQ que explica el método). Se trata de que tu usuario tiene que ver un "código" de confirmación que está en un "gráfico" y digitarlo como un dato más en tu formulario ..todo eso se compara y si es válido tu sigues ejecutando tus procesos.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 05/11/2006 a las 07:30
  #10 (permalink)  
Antiguo 05/11/2006, 10:36
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
La función htmlentities() la he probado y no evita el hackeo.

Sin embargo no había probado striptags(), lo probaré a ver qué tal.

En cuanto a las preguntas de Cluster:

-¿Dónde veo el html que me inyectan? Me aparece en el html de la página index.php, detrás de la etiqueta </html>. Como curiosidad, diré que me hackean todos los archivos que empiezan por index.php, ya que guardé en el servidor un index-hackeado.php, y este archivo también es hackeado cuando vuelven a entrar.

-El código de la página ya digo que es html + varios includes (sin variables) para meter el header, footer, etc. Nada más.

Y una pregunta: He leído que el register_global puede influir en este tema. ¿Es así?

Gracias a todos.
  #11 (permalink)  
Antiguo 05/11/2006, 10:47
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Joder, acaban de volverlo a hacer, y ya tenía el filtro striptags() puesto. O sea que ni el striptags() ni el htmlentities() evitan el hackeo.

Y pienso que el captcha evitaría el hackeo automatizado pero no uno manual.

Una pista más para el que le interese: Cuando se produce el hackeo, recibo email comko este:

Mensaje del formulario de contacto de dominio.com
Nombre: Max
Email: [email protected]
Telefono:
Consulta:
Hello, nice site look this:


(url)http://www.gogetforum.com/cheapphentermin/(/url) overnight phentermine (url=http://www.gogetforum.com/cheapphentermin/)overnight phentermine(/url) .........


NOTA: Los Parentesis son en realidad corchetes [] pero si pongo corchetes el foro me los traduce a urls.
  #12 (permalink)  
Antiguo 05/11/2006, 19:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Realmente intentar ver un problema de estas características sin el problema delante: código completo que usas, el própio servidor (para verificar su configuración) .. "sitio del suceso" (tu domino afectado) .. etc .. no sé que más vamos a ver.

Mis sugerencias son en base a la poca información que dás o que podemos verificar del problema .. Tu dices que te llegan un e-mail con esa información .. pero a su vez dices que te "editan" tu index.php y te insertan algo de código .. eso es mucho más grave pues implica que de alguna manera tienen acceso a tu servidor!!! ...

Podría ser un "vecino" en un servidor compartido el que pueda acceder a los archivos de tu sitio. Esto se hace más evidente cuando no se usan restricciones tipo "safe mode" .. o PHP configurado como un CGI (no como módulo ..). En fin .. todo esto necesita su analisis. Si tu usas un servicio de hosting, habla con tu proveedor y le expones el tema .. a ver si te puede ayudar; no te va ayudar con tu código PHP "inseguro" si es que así lo es, pero si que te debería ayudar con el tema de tus "index.php" modificados revisando temas de permisos de los archivos .. de quien lo modificó (usuario) .. etc.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 06/11/2006, 04:21
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
El código de la página index.php es tal que así:
Código:
<?
session_start();
include($_SERVER["DOCUMENT_ROOT"]."/includes/pre.inc.php"); //aquí meto el doctype y el <html>
?>
<head>
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/head.inc.php";?>
</head>
<body id="home">
		
<div id="container">

	<div id="header">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/header.inc.php";?>
	</div><!-- fin header -->

	<div id="nav">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/nav.inc.php";?>
	</div><!-- fin nav -->

	<div id="content">

		<div id="main">

<!-- CONTENIDO -->

		</div>

		<div id="sidebar">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/sidebar.inc.php";?>
		</div><!-- fin sidebar -->

	</div><!-- fin content -->

	<div id="footer"><div id="footer2">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/footer.inc.php";?>
	</div></div>

</div><!-- fin container -->

</body>

</html>
La página con el formulario de contacto es así:

Código:
<?
session_start();
$seccion="contacto";
include($_SERVER["DOCUMENT_ROOT"]."/includes/pre.inc.php"); 
?>
<head>
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/head.inc.php";?>
</head>
<body>
		
<div id="container">

	<div id="header">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/header.inc.php";?>
	</div><!-- fin header -->

	<div id="nav">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/nav.inc.php";?>
	</div><!-- fin nav -->

	<div id="content">

		<div id="main">


<?if (!isset($_POST['email'])) {?>


				<!-- FORM -->
				<div id="formmasinfo">

					<form method="post" action="contacto.php">
					<fieldset>

					<input type="hidden" name="url" value="contacto" /> 

					<label for="nombre" accesskey="N">Nombre (*):<input tabindex="1" maxlength="100" type="text" name="nombre" id="nombre" /></label>
					<label for="email" accesskey="E">Email (*):<input tabindex="2" maxlength="50" type="text" name="email" id="email" /></label>
					<label for="telefono" accesskey="T">Teléfono:<input tabindex="3" maxlength="20" type="text" name="telefono" id="telefono" /></label>

			
					<label for="comentario" accesskey="C">Consulta:<textarea tabindex="4" name="comentario" id="comentario" rows="5" cols="30"></textarea></label>

					<p><input tabindex="5" class="boton" type="submit" value="Enviar" /></p>
						
					</fieldset>
					</form>
				</div>
				<!-- FORM -->


<?}else{

//$url = 

	$msg= "";
	$msg= "Mensaje del formulario de contacto";
	$msg.= "\nNombre: ". strip_tags($_POST['nombre']);
	$msg.= "\nEmail: ".strip_tags($_POST['email']);
	$msg.= "\nTelefono: ".strip_tags($_POST['telefono']);
	$msg.= "\nConsulta: \n".strip_tags($_POST['comentario']);

	$subject = "Consulta enviada por: ".strip_tags($_POST['nombre']);

	mail('[email protected]', $subject, $msg, "FROM: dominio.com <[email protected]>\n");
?>

				<div class="resaltado">

					<p><strong>Mensaje enviado</strong></p>
					<p>Su solicitud de información ha sido enviada con éxito. Pronto recibirá información de uno de nuestros agentes.</p>

				</div>

<?}?>

		</div><!-- fin main -->

		<div id="sidebar">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/sidebar.inc.php";?>
		</div><!-- fin sidebar -->

	</div><!-- fin content -->

	<div id="footer"><div id="footer2">
<?include $_SERVER["DOCUMENT_ROOT"]."/includes/footer.inc.php";?>
	</div></div>

</div><!-- fin container -->

</body>

</html>
El dominio tiene el register_globals en off (es un hosting y el register_globals lo he cambiado yo mediante htaccess, para el resto del servidor está en On), el safe_mode en On.

Gracias a todos por vuestra ayuda

DE otro lado comentar que la última vez que me han hackeado (anoche) no he recibido email ninguno del fomrulario de contacto.
  #14 (permalink)  
Antiguo 06/11/2006, 04:35
Avatar de ZiTAL  
Fecha de Ingreso: marzo-2004
Ubicación: Bermio (Bizkaia)
Mensajes: 1.545
Antigüedad: 20 años, 1 mes
Puntos: 62
;)

register_globals en OFF por dios!!!!
__________________
http://zital.no-ip.org
____________________

Euskerie ahuen eta bijotzan
  #15 (permalink)  
Antiguo 06/11/2006, 04:47
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Según el phpinfo(), el register_globals está en local en off (Local Value) y en On (Master Value)
  #16 (permalink)  
Antiguo 06/11/2006, 04:49
Avatar de ZiTAL  
Fecha de Ingreso: marzo-2004
Ubicación: Bermio (Bizkaia)
Mensajes: 1.545
Antigüedad: 20 años, 1 mes
Puntos: 62
;)

perdonad pero me ha venido la jefa y no podia seguir escribiendo. El tema de register_globals es que si lo tienes en ON, se pueden meter variables por ejemplo desde la URL, es un fallo de seguridad MUY GRAVE. Solucion: utilizar variables, GET, POST, SESSION, COOKIES, nada de variables globales, tus formularios te lo agradeceran ;)

pongamos un ejemplo:

si tenemos un formulario que llama a si mismo y hace la inserccion en la BBDD:

index.php
Código PHP:

if($insertar==true)
 {
   
insertar en la bd$variable1$variable2 //paso de poner el codigo ;)
 

con la url: index.php?insertar=true&variable1=tarari&variable2 =ketevi

pues ya te hace la picha un lio, no se si se me entiende.

en su lugar se deberia de utilizar las variables POST, para formulario

Código PHP:
if($_POST["insertar"]==true)
 {
   
insertar en la bd$_POST["variable1"$_POST["variable2"];
 } 
si quieres pasar las variables por URL como el ejemplo de antes pues utiliza $_GET para recoger las variables, eso si, no los utilices para formularios.

Un saludo y suerte
__________________
http://zital.no-ip.org
____________________

Euskerie ahuen eta bijotzan
  #17 (permalink)  
Antiguo 06/11/2006, 05:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
DE otro lado comentar que la última vez que me han hackeado (anoche) no he recibido email ninguno del fomrulario de contacto.
A eso voy yo .. Una cosa es que tu formulario HTML y proceso PHP que genera el e-mail ya no te llegue código "PHP" o filtres contenido (links .. o ciertas palabras ..). Pero tu problema según comentabas es que te "editan" cierta página (index.php) para incrustrar algo de HTML.

Ya te has contactado con tu proveedor?

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 17:48.