Cuando realizamos pruebas de variables en una aplicacion web en busca de vulnerabilidades del tipo SQLI o Blind SQLI nos limitamos a testearla solo mediante peticiones GET y POST pero nos olvidamos o desconocemos de otros parametros que pueden ser inyectados para obtener un lindo error de la DB que nos permita meterle jeringa hasta sacarle jugo a toda la informacion posible.
¿Y los parametros de una cabecera HTTP? ¿no son inyectables?
(http://resources.infosecinstitute.com/wp-content/uploads/033012_1704_SQLInjectio1.png?d9c344)
Este es un analisis que se realizo usando varios scaneres de aplicaciones web de codigo abierto y comerciales, como se puede distinguir, el 75% de estas herramientas no pudo encontrar una vulnerabilidad en los encabezados HTTP, por otro lado el 70% de estos scaneres no inspecciona las cookies. Generalmente y si no me queda mas que indagar en las cabeceras trato de buscar este tipo de vulns a mano limpia, como deberia hacerse con todo :)
Posibles encabezados HTTP para inyecciones SQL
Los campos de la cabecera HTTP
(http://underterminal.nixiweb.com/wp-content/uploads/2012/04/sshot-1.png)
X-Forwarded-For
X-Forwarded-For es un campo de encabezado HTTP para la identificación de la dirección IP de origen de un cliente que se conecta a un servidor web a través de un proxy HTTP o un equilibrador de carga.
Vamos a ver un ejemplo de esta falla
$req = mysql_query("SELECT user,password FROM admins WHERE user='".sanitize($_POST['user'])."' AND password='".md5($_POST['password'])."' AND ip_adr='".ip_adr()."'");
La variable login es controlada por la funcion sanitize()
function sanitize($param){ if (is_numeric($param)) { return $param; } else { return mysql_real_escape_string($param); } }
Vamos a inspeccionar la variable ip controlada por la funcion ip_addr()
function ip_adr() { if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip_adr = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip_adr = $_SERVER["REMOTE_ADDR"]; } if (preg_match("#^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#",$ip_addr)) { return $ip_adr; } else { return $_SERVER["REMOTE_ADDR"]; }
Obviamente, la dirección IP se obtiene del parametro X_FORWARDED_FOR. Luego es controlado por preg_match que verifica si el valor corresponde a una dirección IP
la variable HTTP_X_FORWARDED_FOR no es verificada apropiadamente antes de su valor que se utiliza en la consulta SQL. Esto puede llevar a ejecutar cualquier consulta SQL mediante la inyección de código SQL arbitrario en este campo.
La simple modificación de este campo de encabezado a algo así como :}
GET /index.php HTTP/1.1
X_FORWARDED_FOR :127.0.0.1' or 1=1#
User-Agent
Tambien podemos hacer uso de este parametro para verificar
GET /index.php HTTP/1.1
User-Agent: aaa' or 1/*
Referer
GET /index.php HTTP/1.1
Host: [host]
User-Agent: aaa' or 1/*
Referer: http://underterminal.nixiweb.com
Cookie
Podemos testear el parametro cookie manualmente complementando algun addon en el navegador que nos permita hacer esto, como Cookies Manager+ o el Tamper Data, asi inyectamos una sqli en el campo content.(http://[img]http://resources.infosecinstitute.com/wp-content/uploads/033012_1704_SQLInjectio3.png?d9c344)
(http://resources.infosecinstitute.com/wp-content/uploads/033012_1704_SQLInjectio4.png?d9c344)
(http://resources.infosecinstitute.com/wp-content/uploads/033012_1704_SQLInjectio5.png?d9c344)
O usando alguna herramienta de automatizacion como Sqlmap
(http://resources.infosecinstitute.com/wp-content/uploads/033012_1704_SQLInjectio10.png?d9c344)
Espero que les haya servido muchachos! saludos!
Esto no va en malwares, esto va en Inseguridad Informatica " Bugs y Exploits" o Tutoriales y Manuales, pero como aun no esta esa sección en inseguridad informatica, te lo muevo aqui
Aver si miramos un poco en la zona que posteamos, Saludos y gracias ;)
uy, me disculpo jeje andaba con la cabeza en cualquier lado!
Gran aporte... Interesante!!!
Sigue asi.
SALU2
Añadí la etiqueta code en las partes de código del tuto para que esté más ordenado. Buen aporte, gracias...