header() Passtrhough vía GET
Si bien esta no es una técnica, se podría tomar como una ya que se logra acceder a información que no debería ser vista por ningún usuario ya que no presenta los requisitos o privilegios para ello. A lo que me refiero es el traspaso de header() por medio de un HTTP GET desde una terminal, esto lo había visto hace rato y me intereso mucho. Su solución es tan simple como su modo de conseguir el traspaso. Supongamos que estamos desarrollando una aplicación web y estamos por su sección de administración, a este nivel seguro se utilizaran cookies y/o tokens para saber quien debería ver el archivo de administración y quien no, y para eso elegimos (como muchos..) a la función header() para redireccionar al usuario si no cumple con estas medidas de seguridad. Un codigo simple:
<?php
session_start();
if(!session_is_registered(’username’)){
header(’Location: http://www.victima.com/login.php’);
}
?><html>
<body>
SECRET CODE: 564132138
</body>
</html>
Bueno, el código funciona perfectamente si tratamos de acceder a el sin habernos registrado, porque nos va a redireccionar a “http://www.victima.com/login.php”.. Pero que pasaria si hacemos esto:
root@c1c4tr1z:/# nc www.victima.com 80
GET /admin.php HTTP/1.0HTTP/1.1 302 Found
Date: Mon, 03 Mar 2008 19:20:02 GMT
Server: Apache PHP/5.2.3X-Powered-By: PHP/5.2.3
Set-Cookie: PHPSESSID=73a12c965dd12b413b4713e9a25dc437; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: http://www.victima.com/login.php
Content-Length: 55
Connection: close
Content-Type: text/html<html>
<body>
SECRET CODE: 564132138
</body>
</html>
De este modo podemos “atravesar”la funcion header() mediante un GET para que tome todo lo que se encuentra en HTML y llegar a lo que queríamos ver, que es la información que se evita transmitir. Para solucionar esto se necesita simplemente colocarle un exit() al bucle que checkea la si existe una sesión.
<?php
session_start();
if(!session_is_registered(’username’)){
header(’Location: http://www.victima.com/login.php’);exit;
}
?>
Que termina la lectura de el archivo y redirecciona, cerrando la conexión en el momento del exit(). O sea:
root@c1c4tr1z:/# nc www.victima.com 80
GET /admin.php HTTP/1.0
HTTP/1.1 302 Found
Date: Mon, 03 Mar 2008 19:29:40 GMT
Server: Apache PHP/5.2.3X-Powered-By: PHP/5.2.3
Set-Cookie: PHPSESSID=005d06971141aefae56af9ff4ad93abf; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: http://www.victima.com/login.php
Content-Length: 0
Connection: close
Content-Type: text/html

Si, igual esto es medio “absurdo”
.. Te recomendaria (si usas Java) que pruebes la suite Burp, ya que tiene spiders, artilugios excelentes para modificar cookies, intrusion, etc.. Yo hace poco hize un articulo para New-Bytes sobre spoofing de cabezeras y XSS usando ese programa.
Saludos!
C1c4Tr1Z said this on March 29th, 2008 at 8:22 pm