help_outline
Ayudanos!
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
  • 9903 Vistas

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

Conectado 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 este 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(isset($_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 (file_exists("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.             move_uploaded_file($_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 c99.php, 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(isset($_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 (file_exists("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.             move_uploaded_file($_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 herramienta 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: [Seleccionar]
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 = array(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  2.  
  3.     foreach ($blacklist as $item) {
  4.       if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
  5.          echo "No se permiten archivos PHP";
  6.          exit;
  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 = array(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  48.  
  49.     foreach ($blacklist as $item) {
  50.       if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
  51.          echo "No se permiten archivos PHP";
  52.          exit;
  53.      }
  54. }
  55. if(isset($_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 (file_exists("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.             move_uploaded_file($_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: @RoloMijan

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

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 381
  • Actividad:
    3.33%
  • 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

Conectado 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 »
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 aqui info.

Si me equivoco que se me corrija :D

Conectado arthusu

  • *
  • Underc0der
  • Mensajes: 554
  • Actividad:
    3.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 »
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:
Pentest - Hacking & Security Services

Contact me: arthusu@gmail.com

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 381
  • Actividad:
    3.33%
  • 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 @arthusu jaja confuciones de terminos

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   :)

Desconectado blackdrake

  • *
  • Co Admin
  • Mensajes: 1915
  • Actividad:
    1.67%
  • 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 @rollth, a más de uno le vendrá bien.

Saludos.



Conectado 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 »
Esa shell me recuerda a una web bastante tentadora ^^ (ya tu sabes), buen aporte @rollth, a más de uno le vendrá bien.

Saludos.

A mi no me suena esa shell  ::). Gracias por tu comentario @blackdrake :D

Desconectado meteor0

  • *
  • Underc0der
  • Mensajes: 66
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #8 en: Febrero 09, 2016, 12:13:56 pm »
Buena esa @rollth, 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", @rush nada que ver bro xD, @arthusu tienes razón bro Burpsuite es la onda, @rollth te ha quedado muy bueno el post y usaste un clásico de shell la c99 xD.

Saludos a todos!

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 381
  • Actividad:
    3.33%
  • Reputación 7
    • Ver Perfil
  • Skype: iruxh1773
« Respuesta #10 en: Febrero 09, 2016, 03:52:13 pm »
Tienes razon @EPSILON, un bypass upload, tiene mucho tiempo esta tecnica jaja tal vez lo confundi por que en el RFI se utilizaba mucho la shell c99

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: www.hackingdesdecero.org
Igm: /secureart
Telegram: @roaddhdc
Correo: r0add@hotmail.com
Face: /roaddhdc
Twitter: @roaddhdc
Youtube: www.youtube.com/channel/UCx8hRcHzHboIjpyfCWz_W_w

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 @rush 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

Conectado 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 »
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

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 https://github.com/seth--/imgup/blob/master/uploads/.htaccess
Los guardo  con un nombre aleatorio para que no hagan cosas raras como escalar directorios https://github.com/seth--/imgup/blob/master/php/models/upload.php#L48
Con un archivo php leo la imagen y la mando al navegador https://github.com/seth--/imgup/blob/master/php/models/f.php
Los mime types estan limitados con una whitelist https://github.com/seth--/imgup/blob/master/php/models/upload.php#L14

Conectado 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 »
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 https://github.com/seth--/imgup/blob/master/uploads/.htaccess
Los guardo  con un nombre aleatorio para que no hagan cosas raras como escalar directorios https://github.com/seth--/imgup/blob/master/php/models/upload.php#L48
Con un archivo php leo la imagen y la mando al navegador https://github.com/seth--/imgup/blob/master/php/models/f.php
Los mime types estan limitados con una whitelist https://github.com/seth--/imgup/blob/master/php/models/upload.php#L14

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.

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 »
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 este 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(isset($_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 (file_exists("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.             move_uploaded_file($_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 c99.php, 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(isset($_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 (file_exists("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.             move_uploaded_file($_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 herramienta 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: [Seleccionar]
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 = array(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  2.  
  3.     foreach ($blacklist as $item) {
  4.       if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
  5.          echo "No se permiten archivos PHP";
  6.          exit;
  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 = array(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  48.  
  49.     foreach ($blacklist as $item) {
  50.       if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
  51.          echo "No se permiten archivos PHP";
  52.          exit;
  53.      }
  54. }
  55. if(isset($_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 (file_exists("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.             move_uploaded_file($_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:
    0%
  • 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!