enchufado
   RSS
#
Automatización de GET y POST con PHP (Seguridad) 2010-06-30 23:33:13

La mayoría de las webs disponen de formularios o de elementos de entrada de datos (normalmente relativos al usuario) que acaban siendo almacenados en algún backend. El problema surge cuando estas entradas de datos no estan lo suficientemente protegidas. No me refiero a la validación de los datos introducidos, sino a un plano más básico: la entrada masiva/automatizada de datos. Tampoco me estoy refiriendo (aunque ya nos aproximamos) a los spambots (btw, ¿conocéis XRunner?), de los cuales podemos protegernos p.ej. con campos de entrada de datos ocultos vía css o de no-escritura. Estoy hablando de scripts personalizados (adecuados a un formulario en concreto).

La razón de este post es pues, mostrar las consecuencias de no proteger convenientemente las entradas de datos, que pueden ser varias: desde una molestia de cara a tener que realizar una limpieza del backend (hoy en día, comunmente una Base de Datos), hasta llegar a sufrir la magnitud de un DoS (por la saturación provocada por la inserción de datos, bien sea porque el SGBD no da la talla ante esta situación y se colapsa, o bien por un agote en el espacio de almacenamiento donde se aloje la Base de Datos) en el peor de los casos. Pasemos a la acción.

Inserción de datos por GET

Este es, efectivamente, el modo sencillo de inserción de datos, puesto que éstos son pasados como parámetros desde la propia URL y son los datos que se ven. Tómese como ejemplo la URL de Google después de haber realizado una búsqueda. Que esté al abasto de todo el mundo no significa que sea más peligroso (refiérase al término seguridad por oscuridad u ocultación para saber porqué), aunque sí es más propenso a tener mayor número de indagaciones por parte de profanos -siempre más numerosos- en la materia.

Bien, pues al grano. Con PHP, al menos se tienen un par de modos de generar este tipo de requests. El más sencillo pasa por usar la función file_get_contents() de PHP con una URL. Sirva este sencillo snippet de código a modo de ejemplo:

<?php
   $url = 'http://www.test.com/user.php?user=TOD&pass=123';
   echo file_get_contents($url);
?>

Sencillo snippet, ¿verdad? Pues ahora imaginaros que os encontráis una entrada de datos que funciona por GET que no tenga ninguna protección frente a la automatización. Añadidle un bucle y una variación/randomización de datos de entrada, y... exacto, tenemos un problema.

Inserción de datos por POST

En esta ocasión, los datos no se ven a simple vista (válgase la rebuznancia), aunque esto no es motivo para pensar que su entrada sea segura y no pueda ser automatizada. ¿Cómo lo abordamos? Si usas Firefox/Iceweasel, hay una útil extensión (entre otras del ramo) llamada TamperData. Esta pequeña maravilla nos permite ver y modificar cabeceras HTTP/HTTPS y parámetros GET/POST. Ahora mismo, en realidad, con ver nos basta, así que la instalamos :)

A continuación, localizamos una página cualquiera con un formulario (por ejemplo, ésta de prueba), dado que estos acostumbran a funcionar con POST. Luego, en Firefox/Iceweasel nos vamos al menú Tools/Herramientas y seleccionamos el add-on Tamper Data, que se abrirá en una nueva ventana. Ahora rellenamos el formulario (escribimos "Hola caracola" y marcamos el check), lo enviamos y volvemos a la ventana de Tamper Data. Podéis ver algo como esto, con especial atención en el POST:

Comento brevemente la ventana de Tamper Data, que está dividida en 3 secciones. La más amplia, de forma rectangular y ubicada en la parte superior, es la que registra las peticiones GET/POST. La parte inferior izquierda es la petición enviada, y la parte inferior derecha lo que responde el servidor.

Dicho esto, centrémonos en el POSTDATA (parte inferior izquierda). Si encima suyo, con el botón derecho del ratón seleccionamos "Copiar" en lugar de "Detalles", como hemos hecho en la captura de pantalla, tendremos todo el churro en una sola linea, que nos será útil para el siguiente paso: la automatización. Ahí va el siguiente ejemplo en PHP, que viene a ser lo mismo que hicimos en el anterior snippet, pero esta vez con POST y -necesariamente- cURL:

<?php
   $url = 'http://www.cs.tut.fi/~jkorpela/forms/form1.html';
   $postdata = 'Comments=Hola+caracola%0D%0A&box=yes&hidden+field=something';
   
   # Y aquí viene la mano mágica: curl!
   $ch = curl_init($url);
   curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_exec($ch);
   curl_close($ch);
?>

Está de más decir que necesitamos una versión de PHP con soporte para cURL, cosa que suele venir por defecto en una instalación tipo de PHP precompilado. Al igual que en el caso del GET, encontrad un formulario que no tenga protección ante (ro)bots de submits, añadidle bucle y randomización al ejemplo y el postre está servido.

Como nota adicional a los snapshots de código proporcionados, una buena manera de debugar el código para ver si vamos por buen camino es lanzar las funciones file_get_contents() y curl_exec() con un echo para poder ver lo que devuelven.

Con esto, hemos visto como se pueden hacer "soluciones" concretas para joder la marrana en concreto a algún sitio poco prudente. ¿Cómo podemos protegernos de esto? Mediante captchas o activación/confirmación por mail, aunque en esta vida no hay nada infalible: la seguridad 100% no existe.

Para terminar, ¿conocéis algún sitio con el nivel de desprotección mencionado? Va, empiezo la lista yo: el método para darse de alta en el lector de RSS personalizado del Ayuntamiento de Rubí.


Comentarios (0)


Volver al indice

login, admin, form, register