comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

upload.php [Vulnerabilidad]

  • 22 Respuestas
  • 8788 Vistas

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 874
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« en: Febrero 08, 2016, 09:33:36 pm »
Muy buenas Underc0ders, en este caso vengo a explicar como se puede explotar una vulnerabilidad en un upload.php. Hay más información sobre esto en el foro, pero lo que he visto o es en video o no está explicado como a mi me gustaría que me lo explicaran.

Lo primero que tenemos que saber es que es un uploader en php.

Citar
Un uploader en php es un código que nos va a permitir subir un archivo a una página web.

En este caso nuestro código de prueba vulnerable va a ser el siguiente (El codigo no es propio, es No tienes permisos para ver links. Registrate o Entra con tu cuenta modificado).

Código: PHP
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. .upload{
  5. background:#e7e7e7;
  6. box-shadow:0px 0px 10px black;
  7. width:500px;
  8. height:200px;
  9. margin-right:auto;
  10. margin-left:auto;
  11. border-radius:20px;
  12.  
  13. }
  14. form{
  15.         margin: 126px auto 0;
  16.         width: 225px;
  17.     }
  18.     label{
  19.         display: block;
  20.     }
  21.     input[type="file"]{
  22.         display: block;
  23.         margin: 8px 0;
  24.     }
  25.     div.resultado{
  26.         margin: 25px auto 0;
  27.         width: 225px;
  28.     }
  29.     div.resultado img{
  30.         border: 2px solid #EEEEEE;
  31.         height: auto;
  32.         width: 225px;
  33.     }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="upload">
  38. <form action="" method="post" enctype="multipart/form-data">
  39.     <br><br>Sube un archivo:
  40.     <input type="file" name="archivo" id="archivo" /> <br>
  41.     <input type="submit" name="boton" value="Subir" />
  42. </form>
  43. <div>
  44. <div class="resultado">
  45. <?php
  46. if(No tienes permisos para ver links. Registrate o Entra con tu cuenta($_POST['boton'])){
  47.     // Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
  48.     if ((true==true)  &&  ($_FILES["archivo"]["size"] < 200000000)) {
  49.      
  50.     //Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
  51.       if ($_FILES["archivo"]["error"] > 0) {
  52.         echo $_FILES["archivo"]["error"] . "<br />";
  53.       } else {
  54.           // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
  55.           if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("archivos/" . $_FILES["archivo"]["name"])) {
  56.             echo $_FILES["archivo"]["name"] . " ya existe. ";
  57.           } else {
  58.            // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
  59.             No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["archivo"]["tmp_name"],
  60.             "archivos/" . $_FILES["archivo"]["name"]);
  61.             echo "Archivo Subido <br />";
  62.             echo "<img src='archivos/".$_FILES["archivo"]["name"]."' />";
  63.           }
  64.       }
  65.     } else {
  66.         echo "Archivo no permitido";
  67.     }
  68. }
  69. ?>
  70. </div>
  71. </body>
  72. </html>

Este código nos deja subir archivos de cualquier extensión y aquí es donde nosotros nos vamos a aprovechar. En este caso yo voy a subir una shell No tienes permisos para ver links. Registrate o Entra con tu cuenta, que es muy intuitiva de manejar.



Ya solo nos quedaría ir al directorio está el archivo malicios, en este caso: "/archivos/c99.php".

Dejo aquí una foto de la shell. El funcionamiento como digo es muy intuitivo.



(Ya se que tengo que activar Windows xD)

Ahora voy a mostrar un filtro que NO DEBÉIS USAR y como hacer un bypass, es decir, saltarse el filtro.(Despues mostrare el filtro final).

Código: PHP
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. .upload{
  5. background:#e7e7e7;
  6. box-shadow:0px 0px 10px black;
  7. width:500px;
  8. height:200px;
  9. margin-right:auto;
  10. margin-left:auto;
  11. border-radius:20px;
  12.  
  13. }
  14. form{
  15.         margin: 126px auto 0;
  16.         width: 225px;
  17.     }
  18.     label{
  19.         display: block;
  20.     }
  21.     input[type="file"]{
  22.         display: block;
  23.         margin: 8px 0;
  24.     }
  25.     div.resultado{
  26.         margin: 25px auto 0;
  27.         width: 225px;
  28.     }
  29.     div.resultado img{
  30.         border: 2px solid #EEEEEE;
  31.         height: auto;
  32.         width: 225px;
  33.     }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="upload">
  38. <form action="" method="post" enctype="multipart/form-data">
  39.     <br><br>Sube un archivo:
  40.     <input type="file" name="archivo" id="archivo" /> <br>
  41.     <input type="submit" name="boton" value="Subir" />
  42. </form>
  43. <div>
  44. <div class="resultado">
  45. <?php
  46. if(No tienes permisos para ver links. Registrate o Entra con tu cuenta($_POST['boton'])){
  47.     // Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
  48.     if ((($_FILES["archivo"]["type"] == "image/gif") ||
  49.     ($_FILES["archivo"]["type"] == "image/jpeg") ||
  50.     ($_FILES["archivo"]["type"] == "image/pjpeg")) &&
  51.     ($_FILES["archivo"]["size"] < 20000)) {
  52.      
  53.     //Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
  54.       if ($_FILES["archivo"]["error"] > 0) {
  55.         echo $_FILES["archivo"]["error"] . "<br />";
  56.       } else {
  57.           // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
  58.           if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("archivos/" . $_FILES["archivo"]["name"])) {
  59.             echo $_FILES["archivo"]["name"] . " ya existe. ";
  60.           } else {
  61.            // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
  62.             No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["archivo"]["tmp_name"],
  63.             "archivos/" . $_FILES["archivo"]["name"]);
  64.             echo "Archivo Subido <br />";
  65.             echo "<img src='archivos/".$_FILES["archivo"]["name"]."' />";
  66.           }
  67.       }
  68.     } else {
  69.         echo "Archivo no permitido";
  70.     }
  71. }
  72. ?>
  73. </div>
  74. </body>
  75. </html>

Si os fijáis en estas lineas:
 
Código: PHP
  1. if ((($_FILES["archivo"]["type"] == "image/gif") ||
  2.     ($_FILES["archivo"]["type"] == "image/jpeg") ||
  3.     ($_FILES["archivo"]["type"] == "image/pjpeg")) &&
  4.     ($_FILES["archivo"]["size"] < 20000))

Lo que hace el php es comprobar el content type del archivo y no comprueba la terminación del archivo (si es php, html, etc). Para saltarte este filtro lo que hay que hacer es lo siguiente:

1º Hay que descargarse firefox, ya que vamos a usar una No tienes permisos para ver links. Registrate o Entra con tu cuenta de firefox para esta prueba.

2º Hay que renombrar el archivo c99.php a c99.jpg, ya que es un tipo de los archivos que nos permite subir este uploader.

3º En la web le damos a examinar y ponemos nuestro archivo c99.jpg (NO LE DAMOS A SUBIR TODAVIA). Tiene que quedar asi.



4º Iniciamos Tamper Data. (Está en el menú de arriba en la barra de herramientas).



5º Le damos a comenzar modificación.



6º Ya podemos darle a enviar el archivo, nos saldra una pantallita y le tenemos que dar a modificar.



7º Entonces nos saldrá otra pantalla y tenemos que modificar el código de la derecha.



En ese código hay que buscar algo de este estilo.

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
filename="c99.jpg"\r\nContent-Type: image/jpeg\r\n\r\n
Y cambiar "c99.jpg" por c99.php. Le das a enviar y listo. Esto saltará el filtro ya que aunque estas subiendo el archivo con la terminación .php el content type es de un jpg, y el código del upload comprueba el content type y no la terminación.

Por último una forma de arreglar esto sería añadir estas líneas.

El código ha sido editado porque como decía @seth seguía siendo vulnerable.

Código: PHP
  1. $blacklist = No tienes permisos para ver links. Registrate o Entra con tu cuenta(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  2.  
  3.     foreach ($blacklist as $item) {
  4.       if(No tienes permisos para ver links. Registrate o Entra con tu cuenta("/$item\$/i", $_FILES['userfile']['name'])) {
  5.          echo "No se permiten archivos PHP";
  6.          No tienes permisos para ver links. Registrate o Entra con tu cuenta;
  7.       }
  8.     }

Con lo que el código final quedaría así.

Código: PHP
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. .upload{
  5. background:#e7e7e7;
  6. box-shadow:0px 0px 10px black;
  7. width:500px;
  8. height:200px;
  9. margin-right:auto;
  10. margin-left:auto;
  11. border-radius:20px;
  12.  
  13. }
  14. form{
  15.         margin: 126px auto 0;
  16.         width: 225px;
  17.     }
  18.     label{
  19.         display: block;
  20.     }
  21.     input[type="file"]{
  22.         display: block;
  23.         margin: 8px 0;
  24.     }
  25.     div.resultado{
  26.         margin: 25px auto 0;
  27.         width: 225px;
  28.     }
  29.     div.resultado img{
  30.         border: 2px solid #EEEEEE;
  31.         height: auto;
  32.         width: 225px;
  33.     }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="upload">
  38. <form action="" method="post" enctype="multipart/form-data">
  39.     <br><br>Sube un archivo:
  40.     <input type="file" name="archivo" id="archivo" /> <br>
  41.     <input type="submit" name="boton" value="Subir" />
  42. </form>
  43. <div>
  44. <div class="resultado">
  45. <?php
  46.  
  47. $blacklist = No tienes permisos para ver links. Registrate o Entra con tu cuenta(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  48.  
  49.     foreach ($blacklist as $item) {
  50.       if(No tienes permisos para ver links. Registrate o Entra con tu cuenta("/$item\$/i", $_FILES['userfile']['name'])) {
  51.          echo "No se permiten archivos PHP";
  52.          No tienes permisos para ver links. Registrate o Entra con tu cuenta;
  53.      }
  54. }
  55. if(No tienes permisos para ver links. Registrate o Entra con tu cuenta($_POST['boton'])){
  56.     // Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
  57.     if ((($_FILES["archivo"]["type"] == "image/gif") ||  
  58.     ($_FILES["archivo"]["type"] == "image/jpeg") ||  
  59.     ($_FILES["archivo"]["type"] == "image/pjpeg")) &&  
  60.     ($_FILES["archivo"]["size"] < 200000000)) {
  61.      
  62.     //Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
  63.       if ($_FILES["archivo"]["error"] > 0) {
  64.         echo $_FILES["archivo"]["error"] . "<br />";
  65.       } else {
  66.           // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
  67.           if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("archivos/" . $_FILES["archivo"]["name"])) {
  68.             echo $_FILES["archivo"]["name"] . " ya existe. ";
  69.           } else {
  70.            // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
  71.             No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["archivo"]["tmp_name"],
  72.             "archivos/" . $_FILES["archivo"]["name"]);
  73.             echo "Archivo Subido <br />";
  74.             echo "<img src='archivos/".$_FILES["archivo"]["name"]."' />";
  75.           }
  76.       }
  77.     } else {
  78.         echo "Archivo no permitido";
  79.     }
  80. }
  81. ?>
  82. </div>
  83. </body>
  84. </html>


Espero que esto sea utilidad.

También me pueden seguir en Twitter si les hace ilusión: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Saludos.
 
« Última modificación: Abril 01, 2018, 10:22:31 am por rollth »

Rollth
Buen hacker mejor persona.
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 377
  • Actividad:
    0%
  • Reputación 7
    • Ver Perfil
  • Skype: iruxh1773
« Respuesta #1 en: Febrero 08, 2016, 10:39:11 pm »
Bonito tutorial y a esto se le llama "RFI" Remote File Inclusion :D
No tienes permisos para ver links. Registrate o Entra con tu cuenta


Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 874
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #2 en: Febrero 08, 2016, 10:49:36 pm »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Bonito tutorial y a esto se le llama "RFI" Remote File Inclusion :D

Perdon si me equivoco, pero por lo que tengo entendido el RFI es cuando carga contenido a través del metodo GET de forma.

servervictima.com/file.php?file="archivo" y este archivo se puede sustituir por una shell.

Dejo No tienes permisos para ver links. Registrate o Entra con tu cuenta info.

Si me equivoco que se me corrija :D

Rollth
Buen hacker mejor persona.
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado arthusu

  • *
  • Underc0der
  • Mensajes: 541
  • Actividad:
    8.33%
  • Reputación 2
  • Yo solo se que no se nada - Socrátes
    • Ver Perfil
    • Arthusu BLOG
  • Skype: arthusuxD
« Respuesta #3 en: Febrero 08, 2016, 11:05:12 pm »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Bonito tutorial y a esto se le llama "RFI" Remote File Inclusion :D
Rush deje la marijuana le he dicho que esa cosa hace daño XD :v, No te creas :P, Saludos bro!, Buen tuto!
PD: Burp suite es cool tambien C:

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 377
  • Actividad:
    0%
  • Reputación 7
    • Ver Perfil
  • Skype: iruxh1773
« Respuesta #4 en: Febrero 08, 2016, 11:30:33 pm »
Jajaj lo siento por la confucion, entonces tengo un mal entendido y no recuerdo, pero segun yo tambien se le llamaba asi al poder subir en un upload una shell o ando marihuano como dice @No tienes permisos para ver links. Registrate o Entra con tu cuenta jaja confuciones de terminos
No tienes permisos para ver links. Registrate o Entra con tu cuenta


Desconectado bernatixer

  • *
  • Underc0der
  • Mensajes: 14
  • Actividad:
    0%
  • Reputación 0
  • Not yet
    • Ver Perfil
    • bernatixer
  • Skype: bernat.torres.bellido
  • Twitter: BernatTorres
« Respuesta #5 en: Febrero 09, 2016, 11:07:38 am »
Buen aporte, gracias por compartirlo   :)
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Conectado blackdrake

  • *
  • Co Admin
  • Mensajes: 1910
  • Actividad:
    13.33%
  • Reputación 15
    • Ver Perfil
« Respuesta #6 en: Febrero 09, 2016, 12:06:54 pm »
Esa shell me recuerda a una web bastante tentadora ^^ (ya tu sabes), buen aporte @No tienes permisos para ver links. Registrate o Entra con tu cuenta, a más de uno le vendrá bien.

Saludos.



Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 874
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #7 en: Febrero 09, 2016, 12:11:59 pm »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Esa shell me recuerda a una web bastante tentadora ^^ (ya tu sabes), buen aporte @No tienes permisos para ver links. Registrate o Entra con tu cuenta, a más de uno le vendrá bien.

Saludos.

A mi no me suena esa shell  ::). Gracias por tu comentario @No tienes permisos para ver links. Registrate o Entra con tu cuenta :D

Rollth
Buen hacker mejor persona.
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado meteor0

  • *
  • Underc0der
  • Mensajes: 66
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #8 en: Febrero 09, 2016, 12:13:56 pm »
Buena esa @No tienes permisos para ver links. Registrate o Entra con tu cuenta, es una vulnerabilidad bastante común, fácil y rapido,
Saludos :)

Desconectado EPSILON

  • *
  • Underc0der
  • Mensajes: 364
  • Actividad:
    0%
  • Reputación 0
  • epsilon@crypt.am
    • Ver Perfil
  • Skype: epsilon.root1
« Respuesta #9 en: Febrero 09, 2016, 03:12:10 pm »
En definitiva a esta técnica se la conoce como "bypass upload", @No tienes permisos para ver links. Registrate o Entra con tu cuenta nada que ver bro xD, @No tienes permisos para ver links. Registrate o Entra con tu cuenta tienes razón bro Burpsuite es la onda, @No tienes permisos para ver links. Registrate o Entra con tu cuenta te ha quedado muy bueno el post y usaste un clásico de shell la c99 xD.

Saludos a todos!

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 377
  • Actividad:
    0%
  • Reputación 7
    • Ver Perfil
  • Skype: iruxh1773
« Respuesta #10 en: Febrero 09, 2016, 03:52:13 pm »
Tienes razon @No tienes permisos para ver links. Registrate o Entra con tu cuenta, un bypass upload, tiene mucho tiempo esta tecnica jaja tal vez lo confundi por que en el RFI se utilizaba mucho la shell c99
No tienes permisos para ver links. Registrate o Entra con tu cuenta


Desconectado roadd

  • *
  • Underc0der
  • Mensajes: 118
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
    • Hacking Desde Cero By Roadd Dogg
  • Skype: r0add@hotmail.com
  • Twitter: @RoaddHDC
« Respuesta #11 en: Febrero 09, 2016, 04:55:32 pm »
Buenisimo Rolo! Excelente forma de mostrar el Upload. Aplausos desde aqui :) Muy util para todos
Web: No tienes permisos para ver links. Registrate o Entra con tu cuenta
Igm: /secureart
Telegram: @roaddhdc
Correo: r0add@hotmail.com
Face: /roaddhdc
Twitter: @roaddhdc
Youtube: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado EPSILON

  • *
  • Underc0der
  • Mensajes: 364
  • Actividad:
    0%
  • Reputación 0
  • epsilon@crypt.am
    • Ver Perfil
  • Skype: epsilon.root1
« Respuesta #12 en: Febrero 09, 2016, 09:43:54 pm »
Claro @No tienes permisos para ver links. Registrate o Entra con tu cuenta probablemente leiste sobre rfi hace 8 años cuando era común ver en foros aportes de  rfi usando la c99 como ejemplo, a mi me toco leer así y lo recuerdo igual jaja

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #13 en: Febrero 10, 2016, 02:28:26 pm »
Ese filtro sigue estando mal

Me deja subir un html que se puede usar para hacer xss
Tambien me deja subir un htaccess que se puede usar para hacer que otra extension se ejecute con php


Lo mejor es que el usuario no controle el nombre del archivo
Si no podes hacer eso, usa una whitelist y funciones que parsean nombres de archivos en lugar de expresiones regulares

Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 874
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #14 en: Febrero 10, 2016, 04:59:02 pm »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Ese filtro sigue estando mal

Me deja subir un html que se puede usar para hacer xss
Tambien me deja subir un htaccess que se puede usar para hacer que otra extension se ejecute con php


Lo mejor es que el usuario no controle el nombre del archivo
Si no podes hacer eso, usa una whitelist y funciones que parsean nombres de archivos en lugar de expresiones regulares

Cierto lo que dices, el ejemplo es algo simple para entender como va, al array se le podría añadir las extension html, para que no pueda subir htaccess y demás extensiones que uno quiera :D

Rollth
Buen hacker mejor persona.
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #15 en: Febrero 11, 2016, 07:44:11 pm »
El tema es que siempre te podes olvidar de alguna, o puede salir una nueva
No sirve una blacklist

Te muestro como lo resolvi yo para un uploader de imagenes con poco trafico
Subo los archivos en /uploads/, carpeta que siempre tira 403 No tienes permisos para ver links. Registrate o Entra con tu cuenta
Los guardo  con un nombre aleatorio para que no hagan cosas raras como escalar directorios No tienes permisos para ver links. Registrate o Entra con tu cuenta
Con un archivo php leo la imagen y la mando al navegador No tienes permisos para ver links. Registrate o Entra con tu cuenta
Los mime types estan limitados con una whitelist No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 874
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #16 en: Febrero 12, 2016, 10:38:24 am »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
El tema es que siempre te podes olvidar de alguna, o puede salir una nueva
No sirve una blacklist

Te muestro como lo resolvi yo para un uploader de imagenes con poco trafico
Subo los archivos en /uploads/, carpeta que siempre tira 403 No tienes permisos para ver links. Registrate o Entra con tu cuenta
Los guardo  con un nombre aleatorio para que no hagan cosas raras como escalar directorios No tienes permisos para ver links. Registrate o Entra con tu cuenta
Con un archivo php leo la imagen y la mando al navegador No tienes permisos para ver links. Registrate o Entra con tu cuenta
Los mime types estan limitados con una whitelist No tienes permisos para ver links. Registrate o Entra con tu cuenta

Hay muchas formas de filtrarlo, lo único es que esa me pareció la más rápida y sencilla, de esa forma filtras rapido lo que no quieres que suban, aunque se te pueda olvidar algo. Otra forma similar sería haciendo Whitelist como dijiste, el código sería similar. Igualmente hay miles de formas. Gracias por comentar.

Saludos.

Rollth
Buen hacker mejor persona.
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado We are all Phineas Fisher

  • *
  • Underc0der
  • Mensajes: 32
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #17 en: Abril 27, 2017, 11:31:08 pm »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Muy buenas Underc0ders, en este caso vengo a explicar como se puede explotar una vulnerabilidad en un upload.php. Hay más información sobre esto en el foro, pero lo que he visto o es en video o no está explicado como a mi me gustaría que me lo explicaran.

Lo primero que tenemos que saber es que es un uploader en php.

Citar
Un uploader en php es un código que nos va a permitir subir un archivo a una página web.

En este caso nuestro código de prueba vulnerable va a ser el siguiente (El codigo no es propio, es No tienes permisos para ver links. Registrate o Entra con tu cuenta modificado).

Código: PHP
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. .upload{
  5. background:#e7e7e7;
  6. box-shadow:0px 0px 10px black;
  7. width:500px;
  8. height:200px;
  9. margin-right:auto;
  10. margin-left:auto;
  11. border-radius:20px;
  12.  
  13. }
  14. form{
  15.         margin: 126px auto 0;
  16.         width: 225px;
  17.     }
  18.     label{
  19.         display: block;
  20.     }
  21.     input[type="file"]{
  22.         display: block;
  23.         margin: 8px 0;
  24.     }
  25.     div.resultado{
  26.         margin: 25px auto 0;
  27.         width: 225px;
  28.     }
  29.     div.resultado img{
  30.         border: 2px solid #EEEEEE;
  31.         height: auto;
  32.         width: 225px;
  33.     }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="upload">
  38. <form action="" method="post" enctype="multipart/form-data">
  39.     <br><br>Sube un archivo:
  40.     <input type="file" name="archivo" id="archivo" /> <br>
  41.     <input type="submit" name="boton" value="Subir" />
  42. </form>
  43. <div>
  44. <div class="resultado">
  45. <?php
  46. if(No tienes permisos para ver links. Registrate o Entra con tu cuenta($_POST['boton'])){
  47.     // Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
  48.     if ((true==true)  &&  ($_FILES["archivo"]["size"] < 200000000)) {
  49.      
  50.     //Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
  51.       if ($_FILES["archivo"]["error"] > 0) {
  52.         echo $_FILES["archivo"]["error"] . "<br />";
  53.       } else {
  54.           // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
  55.           if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("archivos/" . $_FILES["archivo"]["name"])) {
  56.             echo $_FILES["archivo"]["name"] . " ya existe. ";
  57.           } else {
  58.            // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
  59.             No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["archivo"]["tmp_name"],
  60.             "archivos/" . $_FILES["archivo"]["name"]);
  61.             echo "Archivo Subido <br />";
  62.             echo "<img src='archivos/".$_FILES["archivo"]["name"]."' />";
  63.           }
  64.       }
  65.     } else {
  66.         echo "Archivo no permitido";
  67.     }
  68. }
  69. ?>
  70. </div>
  71. </body>
  72. </html>

Este código nos deja subir archivos de cualquier extensión y aquí es donde nosotros nos vamos a aprovechar. En este caso yo voy a subir una shell No tienes permisos para ver links. Registrate o Entra con tu cuenta, que es muy intuitiva de manejar.



Ya solo nos quedaría ir al directorio está el archivo malicios, en este caso: "/archivos/c99.php".

Dejo aquí una foto de la shell. El funcionamiento como digo es muy intuitivo.



(Ya se que tengo que activar Windows xD)

Ahora voy a mostrar un filtro que NO DEBÉIS USAR y como hacer un bypass, es decir, saltarse el filtro.(Despues mostrare el filtro final).

Código: PHP
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. .upload{
  5. background:#e7e7e7;
  6. box-shadow:0px 0px 10px black;
  7. width:500px;
  8. height:200px;
  9. margin-right:auto;
  10. margin-left:auto;
  11. border-radius:20px;
  12.  
  13. }
  14. form{
  15.         margin: 126px auto 0;
  16.         width: 225px;
  17.     }
  18.     label{
  19.         display: block;
  20.     }
  21.     input[type="file"]{
  22.         display: block;
  23.         margin: 8px 0;
  24.     }
  25.     div.resultado{
  26.         margin: 25px auto 0;
  27.         width: 225px;
  28.     }
  29.     div.resultado img{
  30.         border: 2px solid #EEEEEE;
  31.         height: auto;
  32.         width: 225px;
  33.     }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="upload">
  38. <form action="" method="post" enctype="multipart/form-data">
  39.     <br><br>Sube un archivo:
  40.     <input type="file" name="archivo" id="archivo" /> <br>
  41.     <input type="submit" name="boton" value="Subir" />
  42. </form>
  43. <div>
  44. <div class="resultado">
  45. <?php
  46. if(No tienes permisos para ver links. Registrate o Entra con tu cuenta($_POST['boton'])){
  47.     // Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
  48.     if ((($_FILES["archivo"]["type"] == "image/gif") ||
  49.     ($_FILES["archivo"]["type"] == "image/jpeg") ||
  50.     ($_FILES["archivo"]["type"] == "image/pjpeg")) &&
  51.     ($_FILES["archivo"]["size"] < 20000)) {
  52.      
  53.     //Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
  54.       if ($_FILES["archivo"]["error"] > 0) {
  55.         echo $_FILES["archivo"]["error"] . "<br />";
  56.       } else {
  57.           // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
  58.           if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("archivos/" . $_FILES["archivo"]["name"])) {
  59.             echo $_FILES["archivo"]["name"] . " ya existe. ";
  60.           } else {
  61.            // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
  62.             No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["archivo"]["tmp_name"],
  63.             "archivos/" . $_FILES["archivo"]["name"]);
  64.             echo "Archivo Subido <br />";
  65.             echo "<img src='archivos/".$_FILES["archivo"]["name"]."' />";
  66.           }
  67.       }
  68.     } else {
  69.         echo "Archivo no permitido";
  70.     }
  71. }
  72. ?>
  73. </div>
  74. </body>
  75. </html>

Si os fijáis en estas lineas:
 
Código: PHP
  1. if ((($_FILES["archivo"]["type"] == "image/gif") ||
  2.     ($_FILES["archivo"]["type"] == "image/jpeg") ||
  3.     ($_FILES["archivo"]["type"] == "image/pjpeg")) &&
  4.     ($_FILES["archivo"]["size"] < 20000))

Lo que hace el php es comprobar el content type del archivo y no comprueba la terminación del archivo (si es php, html, etc). Para saltarte este filtro lo que hay que hacer es lo siguiente:

1º Hay que descargarse firefox, ya que vamos a usar una No tienes permisos para ver links. Registrate o Entra con tu cuenta de firefox para esta prueba.

2º Hay que renombrar el archivo c99.php a c99.jpg, ya que es un tipo de los archivos que nos permite subir este uploader.

3º En la web le damos a examinar y ponemos nuestro archivo c99.jpg (NO LE DAMOS A SUBIR TODAVIA). Tiene que quedar asi.



4º Iniciamos Tamper Data. (Está en el menú de arriba en la barra de herramientas).



5º Le damos a comenzar modificación.



6º Ya podemos darle a enviar el archivo, nos saldra una pantallita y le tenemos que dar a modificar.



7º Entonces nos saldrá otra pantalla y tenemos que modificar el código de la derecha.



En ese código hay que buscar algo de este estilo.

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
filename="c99.jpg"\r\nContent-Type: image/jpeg\r\n\r\n
Y cambiar "c99.jpg" por c99.php. Le das a enviar y listo. Esto saltará el filtro ya que aunque estas subiendo el archivo con la terminación .php el content type es de un jpg, y el código del upload comprueba el content type y no la terminación.

Por último una forma de arreglar esto sería añadir estas líneas.

El código ha sido editado porque como decía @seth seguía siendo vulnerable.

Código: PHP
  1. $blacklist = No tienes permisos para ver links. Registrate o Entra con tu cuenta(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  2.  
  3.     foreach ($blacklist as $item) {
  4.       if(No tienes permisos para ver links. Registrate o Entra con tu cuenta("/$item\$/i", $_FILES['userfile']['name'])) {
  5.          echo "No se permiten archivos PHP";
  6.          No tienes permisos para ver links. Registrate o Entra con tu cuenta;
  7.       }
  8.     }

Con lo que el código final quedaría así.

Código: PHP
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. .upload{
  5. background:#e7e7e7;
  6. box-shadow:0px 0px 10px black;
  7. width:500px;
  8. height:200px;
  9. margin-right:auto;
  10. margin-left:auto;
  11. border-radius:20px;
  12.  
  13. }
  14. form{
  15.         margin: 126px auto 0;
  16.         width: 225px;
  17.     }
  18.     label{
  19.         display: block;
  20.     }
  21.     input[type="file"]{
  22.         display: block;
  23.         margin: 8px 0;
  24.     }
  25.     div.resultado{
  26.         margin: 25px auto 0;
  27.         width: 225px;
  28.     }
  29.     div.resultado img{
  30.         border: 2px solid #EEEEEE;
  31.         height: auto;
  32.         width: 225px;
  33.     }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="upload">
  38. <form action="" method="post" enctype="multipart/form-data">
  39.     <br><br>Sube un archivo:
  40.     <input type="file" name="archivo" id="archivo" /> <br>
  41.     <input type="submit" name="boton" value="Subir" />
  42. </form>
  43. <div>
  44. <div class="resultado">
  45. <?php
  46.  
  47. $blacklist = No tienes permisos para ver links. Registrate o Entra con tu cuenta(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  48.  
  49.     foreach ($blacklist as $item) {
  50.       if(No tienes permisos para ver links. Registrate o Entra con tu cuenta("/$item\$/i", $_FILES['userfile']['name'])) {
  51.          echo "No se permiten archivos PHP";
  52.          No tienes permisos para ver links. Registrate o Entra con tu cuenta;
  53.      }
  54. }
  55. if(No tienes permisos para ver links. Registrate o Entra con tu cuenta($_POST['boton'])){
  56.     // Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
  57.     if ((($_FILES["archivo"]["type"] == "image/gif") ||  
  58.     ($_FILES["archivo"]["type"] == "image/jpeg") ||  
  59.     ($_FILES["archivo"]["type"] == "image/pjpeg")) &&  
  60.     ($_FILES["archivo"]["size"] < 200000000)) {
  61.      
  62.     //Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
  63.       if ($_FILES["archivo"]["error"] > 0) {
  64.         echo $_FILES["archivo"]["error"] . "<br />";
  65.       } else {
  66.           // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
  67.           if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("archivos/" . $_FILES["archivo"]["name"])) {
  68.             echo $_FILES["archivo"]["name"] . " ya existe. ";
  69.           } else {
  70.            // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
  71.             No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["archivo"]["tmp_name"],
  72.             "archivos/" . $_FILES["archivo"]["name"]);
  73.             echo "Archivo Subido <br />";
  74.             echo "<img src='archivos/".$_FILES["archivo"]["name"]."' />";
  75.           }
  76.       }
  77.     } else {
  78.         echo "Archivo no permitido";
  79.     }
  80. }
  81. ?>
  82. </div>
  83. </body>
  84. </html>


Espero que esto sea utilidad.

Saludos.

Hola rollth, no tengo ni idea de lo que has dicho, pero creo que lo he pillado, es decir el codigo php que estaba dentro del HTML de la página web estaba mal programado ya que dejaba subir archivos .php y también en el otro ejemplo bypaseabas el content type con una extensión no?, después modificabas el código y le ponias a una variable de lista negra todas las extensiones? creo que lo he pillado pero no muy bien xD

Desconectado BrowserNet

  • *
  • Underc0der
  • Mensajes: 88
  • Actividad:
    1.67%
  • Reputación 2
  • El TioCyberPunks esta en el barco
    • Ver Perfil
  • Skype: browsernet
« Respuesta #18 en: Abril 28, 2017, 04:26:40 pm »
JAJAJAJA, estos temas hacen recordar mis inicios  ;D ;D ;D ;D

Desconectado DevilCry

  • *
  • Underc0der
  • Mensajes: 14
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #19 en: Junio 11, 2017, 02:30:03 pm »
Esto tuto es genial.

Tengo un problema, he instalado tamper data en mi firefox, pero no me sale la opcion de POST_DATA en la parte derecha, me salen un moton de cosas, pero esa en concreto no me sale. He estado investigando pero no consigo encontrar nada, quisiera saber como teneis vosotros configurado tamper data.

Un saludo

 

¿Te gustó el post? COMPARTILO!