XUT_ / COURSES / PENETRATION TESTER

Bypassing Client-Side Filtering

Empezaremos con la primera (y más débil) linea de defensa: filtrado del lado del cliente.

Como mencionamos previamente, el filtrado del lado del cliente suele ser extremadamente fácil de bypassear. Como ocurre por completo en la máquina que puedes controlar, al tener acceso al código es fácil de modificar.

Hay cuatro maneras fáciles de bypassear los típicos filtros de subida del lado del cliente:

  1. Deshabilita JavaScript en tu navegador: Esto funcionará si el sitio web no requiere JavaScript para ofrecer funcionaliddades básicas.
  2. Intercepta y modifica la página entrante: Usando Burp Suite, podemos interceptar la página entrante y quitarle el filtro JavaScript antes de que tenga oportunidad de ejecutarse.
  3. Intercepta y modifica el archivo subido: Este método permite que la página se cargue de forma normal pero intercepta el archivo subido después de haber pasado los filtros pero cuando todavía no ha llegado al servidor.
  4. Manda el archivo directamente al punto de subida: Si puedes mandar el archivo directamente al punto de salida, puedes evitar filtros del navegador. El comando para dicho propósito sería algo así: curl -X POST -F "submit:<value>" -F "<file-parameter>:@<path-to-file>" <site>. Para poder usar este método deberías primero interceptar una petición de subida exitosa para ver parámetros, headers y demás.

Cubriremos los métodos 2 y 3 en profundidad debajo.


Asumamos que hemos encontrado una página de subida.

Bypassing Client-Side Filtering

Como siempre, miraremos el código fuente. Aquí podemos ver una función JavaScript básica que comprueba el tipo MIME de los archivos subidos:

Bypassing Client-Side Filtering

En esta instancia podemos ver que el filtro está usando una whitelist para excluir cualquier tipo MIME que no sea image/jpeg.

El próximo paso es intentar una subida de archivo. Si seleccionamos JPEG, la función lo acepta y cualquier otra la rechaza.

Habiendo establecido esto, arrancamos BurpSuite y recargamos la página. Veremos nuestra propia petición al sitio web pero lo que realmente queremos es ver es la respuesta del servidor, así que hacemos click derecho en la información interceptada, bajamos hasta "Do Intercept" y seleccionamos "Response to this Request".

Bypassing Client-Side Filtering

Cuando hacemos click en "Forward" arriba de la ventana, veremos la respuesta del servidor a nuestra petición. Aquí, podemos borrar, comentar o romper la función JavaScript antes de que tenga oportunidad de cargar.

Bypassing Client-Side Filtering

Habiendo borrado la función, le damos de nuevo a "Forward" hasta que veamos que el sitio web ha terminado de cargarse y ahora ya podemos subir cualquier tipo de archivo a la página.

Bypassing Client-Side Filtering

IMPORTANT

Burp Suite no intercepta (por defecto) archivos JavaScript externos que la página cargue. Si necesitas editar un script que no esté en la página principal, necesitas ir a Options > Intercept Client Requests y editar la condición de la primera línea para eliminar ^js$|:

Bypassing Client-Side Filtering


Ya hemos bypasseado este filtro interceptando y eliminándolo antes de que cargue la página, pero intentémoslo hacer subiendo un archivo con una extensión y tipo MIME legítimos e interceptándolo y corrigiéndolo con BurpSuite.

Habiendo recargado la página web, para poner el filtro en su lugar, tomemos la reverse shell que hemos usado antes y renombrémosla para que se llame "shell.jpg". Como el archivo cumple con la condición del tipo MIME, nuestro filtro del lado del cliente deja pasar nuestro payload sin quejas.

Bypassing Client-Side Filtering

Una vez más, activamos Burp Suite y le damos a "Upload" para interceptar la petición.

Bypassing Client-Side Filtering

Observa que el tipo MIME de nuestra shell PHP es image/jpeg. Cambiaremos esto a text/x-php, y la extensión de .jpg a .php y le daremos a forward.

Bypassing Client-Side Filtering

Ahora, al navegar a http://demo.uploadvulns.thm/uploads/shell.php habiendo activado un listener, recibiremos una conexión de la shell.

Bypassing Client-Side Filtering


Hemos cubierto en detalle dos formas de bypassear un filtro de subida de lado del cliente. Ahora es hora de que lo probemos. Ve a java.uploadvulns.thm y bypassea el filtro para conseguir una reverse shell. Recuerda escanear el sitio web con gobuster.

  1. Vamos al sitio web dado. Bypassing Client-Side Filtering
  2. Escanearemos mientras tanto la página con gobuster. Bypassing Client-Side Filtering
  3. Vamos a interceptar una subida de archivo con Burp Suite.
    1. Abrimos Burp Suite y su navegador y vamos al sitio web que nos dan. Bypassing Client-Side Filtering
    2. Seleccionamos un archivo y activamos la intercepción. Bypassing Client-Side Filtering
    3. Le damos a "Upload" y esperamos la petición. Bypassing Client-Side Filtering
  4. El content type parece ser image/png. Bypassing Client-Side Filtering
  5. Le damos a "Forward". Bypassing Client-Side Filtering Parece que se ha subido exitosamente.
  6. Vamos ahora a subir una shell.php y a capturar la respuesta.
    1. Editamos la shell. Bypassing Client-Side Filtering
    2. Nos ponemos en escucha. Bypassing Client-Side Filtering
    3. Subimos la shell y la interceptamos con Burp Suite. Bypassing Client-Side Filtering Parece que no nos deja.
    4. Le cambiamos la extensión a .png. Bypassing Client-Side Filtering
    5. Ahora sí. Bypassing Client-Side Filtering
    6. Vamos a interceptarlo. Bypassing Client-Side Filtering
    7. Cambiamos el filename a reverseshell.php y content-type a text/x-php. Bypassing Client-Side Filtering
    8. Le damos a forward hasta que ponga success. Bypassing Client-Side Filtering
  7. Ahora debemos navegar a la shell, que basándonos en nuestro escaneo con gobuster seguramente esté en /images. Bypassing Client-Side Filtering La página parece quedarse cargando.
  8. Pero si volvemos al listener: Bypassing Client-Side Filtering
  9. Ahora vamos al directorio que nos dan y leemos la flag. Bypassing Client-Side Filtering