Comunidad PHPeros

Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: nmartin021 en 12 de Agosto de 2011, 13:18:27 pm

Título: 1 tip al usar el sistema de modulación
Publicado por: nmartin021 en 12 de Agosto de 2011, 13:18:27 pm
El sistema de modulación de naveda, tiene (quizás) una pequeña vulnerabilidad que encontré mientras hacía mi propio sistema...

Este es el código de naveda:

<?PHP
if (isset($_GET['id'])) {
if (!empty($_GET['id']) && $_GET['id'] != "index") {
if (file_exists($_GET['id'].".php")) {
include ("./".$_GET['id'].".php");
} else {
echo "No existe esta seccion";
}
} else {
include ("principal.php");
}
} else {
include ("principal.php");
}
?>

Si os fijáis, comprueba si está el ?id=, luego comprueba que no esté vacío y que no sea index (porque sino se crearía un bucle infinito, el index llama al index, ese hace lo mismo que el anterior, y por eso se crea un bucle infinito) y finalmente comprueba que el archivo existe en el servidor... aquí es donde falla... ¿por qué? porque si en vez de ?id=archivo pongo ../archivo sube un directorio y ¡CHAN! ya puede acceder a aquellos archivos a los que hemos prohibido que se acceda directamente (y justo por eso usamos sistema de modulación). Para solucionar ese detalle, simplemente debemos añadir a esta línea:
Código: [Seleccionar]
<?
if (file_exists($_GET['id'].".php")) {
?>
un preg match, así:

<?
if (file_exists($_GET['id'].".php") && preg_match('/^[a-zA-Z0-9\-_]+$/i', $_GET['id'])) {
?>

Te preguntarás, ¿qué hace el preg match? se llama expresión regular, y se usa así:

<?
preg_match('/aqui tu expresion regular/modificadores', $dondebuscar);
?>

El mío hace esto:

En resumen, compruebo que no hay caracteres raros (como por ejemplo una barra / o puntos .., porque poniendo ../ sube un directorio, y ya está fuera de control...)

Así nos aseguramos que solamente se incluirán archivos del directorio actual ;)

PD: Si queréis poner barras, para ingresar así: ?do=categoria/info, simplemente reemplazad el preg match de antes por este:

<?
preg_match('/^[a-zA-Z0-9\-_\/]+$/i', $_GET['id']);
?>

Le puse \/ al preg match, así admito barras ( / ), pero ¿por qué 2 barras en vez de una?
Porque hay que escapar la barra con otra barra (invertida), para más información, visita wikipedia (http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular)
Saludos, y espero que os ayude ;)
Título: Re:1 tip al usar el sistema de modulación
Publicado por: Incompatible en 12 de Agosto de 2011, 13:29:24 pm

Hola Martin,

La verdad es que yo también me había percatado de ese problema pero no dije nada por que no estaba registrado en el foro, pero gracias por ayudar a la comunidad. Si tuviese K+ te daba alguno.

Un saludo,
Incomodidad.
Título: Re:1 tip al usar el sistema de modulación
Publicado por: nmartin021 en 12 de Agosto de 2011, 13:36:21 pm
Hola Martin,

La verdad es que yo también me había percatado de ese problema pero no dije nada por que no estaba registrado en el foro, pero gracias por ayudar a la comunidad. Si tuviese K+ te daba alguno.

Un saludo,
Incomodidad.
Hola, te agradezdo el hecho de que hayas comentado, porque lo importante es que no se incluyan esos archivos que algunos no deben ver (lammers), por eso, hay que ponerle seguridad a la web :P

PD: Bienvenido :)
Título: Re:1 tip al usar el sistema de modulación
Publicado por: Incompatible en 12 de Agosto de 2011, 13:37:52 pm

Hola, te agradezdo el hecho de que hayas comentado, porque lo importante es que no se incluyan esos archivos que algunos no deben ver (lammers), por eso, hay que ponerle seguridad a la web :P

PD: Bienvenido :)

Faltaría mas, lo importante es ayudarnos entre todos. Y por cierto, gracias :) Espero poder ayudar a la gente del foro.

Un saludo,
Incomodidad.
Título: Re:1 tip al usar el sistema de modulación
Publicado por: nmartin021 en 12 de Agosto de 2011, 13:43:12 pm
Faltaría mas, lo importante es ayudarnos entre todos. Y por cierto, gracias :) Espero poder ayudar a la gente del foro.

Un saludo,
Incomodidad.
Y yo espero que aprendas mucho :D

Saludos :)