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]

  • 20 Respuestas
  • 8075 Vistas

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

Conectado rollth

  • *
  • Underc0der
  • Mensajes: 875
  • Actividad:
    1.67%
  • 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 You are not allowed to view links. Register or Login 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(You are not allowed to view links. Register or Login($_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 (You are not allowed to view links. Register or Login("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.             You are not allowed to view links. Register or Login($_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 You are not allowed to view links. Register or Login, 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(You are not allowed to view links. Register or Login($_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 (You are not allowed to view links. Register or Login("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.             You are not allowed to view links. Register or Login($_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 You are not allowed to view links. Register or Login 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: You are not allowed to view links. Register or Login
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 = You are not allowed to view links. Register or Login(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  2.  
  3.     foreach ($blacklist as $item) {
  4.       if(You are not allowed to view links. Register or Login("/$item\$/i", $_FILES['userfile']['name'])) {
  5.          echo "No se permiten archivos PHP";
  6.          You are not allowed to view links. Register or Login;
  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 = You are not allowed to view links. Register or Login(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  48.  
  49.     foreach ($blacklist as $item) {
  50.       if(You are not allowed to view links. Register or Login("/$item\$/i", $_FILES['userfile']['name'])) {
  51.          echo "No se permiten archivos PHP";
  52.          You are not allowed to view links. Register or Login;
  53.      }
  54. }
  55. if(You are not allowed to view links. Register or Login($_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 (You are not allowed to view links. Register or Login("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.             You are not allowed to view links. Register or Login($_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: You are not allowed to view links. Register or Login

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

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 378
  • 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
You are not allowed to view links. Register or Login


Conectado rollth

  • *
  • Underc0der
  • Mensajes: 875
  • Actividad:
    1.67%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #2 en: Febrero 08, 2016, 10:49:36 pm »
You are not allowed to view links. Register or Login
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 You are not allowed to view links. Register or Login info.

Si me equivoco que se me corrija :D

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado arthusu

  • *
  • Underc0der
  • Mensajes: 531
  • 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 »
You are not allowed to view links. Register or Login
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: 378
  • 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 @You are not allowed to view links. Register or Login jaja confuciones de terminos
You are not allowed to view links. Register or Login


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   :)
You are not allowed to view links. Register or Login

Conectado blackdrake

  • *
  • Co Admin
  • Mensajes: 1893
  • Actividad:
    16.67%
  • Reputación 14
    • 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 @You are not allowed to view links. Register or Login, a más de uno le vendrá bien.

Saludos.



Conectado rollth

  • *
  • Underc0der
  • Mensajes: 875
  • Actividad:
    1.67%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #7 en: Febrero 09, 2016, 12:11:59 pm »
You are not allowed to view links. Register or Login
Esa shell me recuerda a una web bastante tentadora ^^ (ya tu sabes), buen aporte @You are not allowed to view links. Register or Login, a más de uno le vendrá bien.

Saludos.

A mi no me suena esa shell  ::). Gracias por tu comentario @You are not allowed to view links. Register or Login :D

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado meteor0

  • *
  • Underc0der
  • Mensajes: 66
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #8 en: Febrero 09, 2016, 12:13:56 pm »
Buena esa @You are not allowed to view links. Register or Login, es una vulnerabilidad bastante común, fácil y rapido,
Saludos :)

Desconectado EPSILON

  • *
  • Underc0der
  • Mensajes: 365
  • 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", @You are not allowed to view links. Register or Login nada que ver bro xD, @You are not allowed to view links. Register or Login tienes razón bro Burpsuite es la onda, @You are not allowed to view links. Register or Login te ha quedado muy bueno el post y usaste un clásico de shell la c99 xD.

Saludos a todos!

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 378
  • Actividad:
    0%
  • Reputación 7
    • Ver Perfil
  • Skype: iruxh1773
« Respuesta #10 en: Febrero 09, 2016, 03:52:13 pm »
Tienes razon @You are not allowed to view links. Register or Login, un bypass upload, tiene mucho tiempo esta tecnica jaja tal vez lo confundi por que en el RFI se utilizaba mucho la shell c99
You are not allowed to view links. Register or Login


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: You are not allowed to view links. Register or Login
Igm: /secureart
Telegram: @roaddhdc
Correo: r0add@hotmail.com
Face: /roaddhdc
Twitter: @roaddhdc
Youtube: You are not allowed to view links. Register or Login

Desconectado EPSILON

  • *
  • Underc0der
  • Mensajes: 365
  • Actividad:
    0%
  • Reputación 0
  • epsilon@crypt.am
    • Ver Perfil
  • Skype: epsilon.root1
« Respuesta #12 en: Febrero 09, 2016, 09:43:54 pm »
Claro @You are not allowed to view links. Register or Login 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: 875
  • Actividad:
    1.67%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #14 en: Febrero 10, 2016, 04:59:02 pm »
You are not allowed to view links. Register or Login
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.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

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 You are not allowed to view links. Register or Login
Los guardo  con un nombre aleatorio para que no hagan cosas raras como escalar directorios You are not allowed to view links. Register or Login
Con un archivo php leo la imagen y la mando al navegador You are not allowed to view links. Register or Login
Los mime types estan limitados con una whitelist You are not allowed to view links. Register or Login

Conectado rollth

  • *
  • Underc0der
  • Mensajes: 875
  • Actividad:
    1.67%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #16 en: Febrero 12, 2016, 10:38:24 am »
You are not allowed to view links. Register or Login
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 You are not allowed to view links. Register or Login
Los guardo  con un nombre aleatorio para que no hagan cosas raras como escalar directorios You are not allowed to view links. Register or Login
Con un archivo php leo la imagen y la mando al navegador You are not allowed to view links. Register or Login
Los mime types estan limitados con una whitelist You are not allowed to view links. Register or Login

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.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

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 »
You are not allowed to view links. Register or Login
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 You are not allowed to view links. Register or Login 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(You are not allowed to view links. Register or Login($_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 (You are not allowed to view links. Register or Login("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.             You are not allowed to view links. Register or Login($_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 You are not allowed to view links. Register or Login, 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(You are not allowed to view links. Register or Login($_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 (You are not allowed to view links. Register or Login("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.             You are not allowed to view links. Register or Login($_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 You are not allowed to view links. Register or Login 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: You are not allowed to view links. Register or Login
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 = You are not allowed to view links. Register or Login(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  2.  
  3.     foreach ($blacklist as $item) {
  4.       if(You are not allowed to view links. Register or Login("/$item\$/i", $_FILES['userfile']['name'])) {
  5.          echo "No se permiten archivos PHP";
  6.          You are not allowed to view links. Register or Login;
  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 = You are not allowed to view links. Register or Login(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess");
  48.  
  49.     foreach ($blacklist as $item) {
  50.       if(You are not allowed to view links. Register or Login("/$item\$/i", $_FILES['userfile']['name'])) {
  51.          echo "No se permiten archivos PHP";
  52.          You are not allowed to view links. Register or Login;
  53.      }
  54. }
  55. if(You are not allowed to view links. Register or Login($_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 (You are not allowed to view links. Register or Login("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.             You are not allowed to view links. Register or Login($_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!