feed://
Anotaciones
Comentarios

Sí, son las tres de la mañana y tengo sueño. Pero antes de meterme en la cama me ha dado por hacer una tontería. Una de esas que espero que podáis mejorar vosotros que sabéis mucho más de estas cosas. Se trata de un chapuScript (un script chapuza, cómo no jeje) relacionado con la anterior anotación a ésta. Consiste en ir contra corriente y tener la poca vergüenza de decidir emplear parámetros en la URL para pasar variables al script que finalmente lanza la función show_source().

Si, ya nos hemos puesto de acuerdo hace un post de que esta forma de emplear show_source no es la adecuada. Pero el sueño es que es así… he intentado que el script sea lo más tiquismiquis posible y que no deje más que visualizar el contenido de aquellos ficheros alojados en el mismo directorio que donde se encuentre. También comprueba cosas como si el parámetro pasado es un fichero que existe, o tiene permisos adecuados (644) y cosas así.

En fin, ahí va (más vale no utilizarlo jeje)

<?
        /*
         * Muestra el contenido del fichero de texto especificado.
         * Utilícese para mostrar ficheros PHP. Colorea su sintaxis.
         * Por motivos de seguridad no funciona con ficheros fuera de ./
         * El fichero a mostrar debe tener permisos 644
         */
 
        define ("kRET_2","Fichero no especificado. Añada: ?file=nombreFichero");
        define ("kRET_3","El fichero especificado no existe.");
        define ("kRET_4","No tiene los permisos adecuados.");
        define ("kRET_5","La lectura solo se permite en el directorio actual.");
 
        if (empty($_GET['file']))
                $retorna = 2;
        elseif (!file_exists($_GET['file']))
                $retorna = 3;
        else
        {
                $permisos = base_convert(fileperms($_GET['file']), 10, 8);
                $permisos = substr($permisos, (strlen($permisos) - 3));
 
                if ($permisos != 644)
                        $retorna = 4;
                else
                {
                        $fic = $_GET['file'];
                        if (($fic[0]=='/') xor (($fic[0]=='.') && $fic[1]=='.'))
                                $retorna = 5;
                        else
                                $retorna = 1;
                }
        }
 
        switch ($retorna)
        {
                case 1: show_source($_GET['file']); break;
                case 2: echo kRET_2; break;
                case 3: echo kRET_3; break;
                case 4: echo kRET_4; break;
                case 5: echo kRET_5; break;
        }
?>

Lo he probado un poco (en un servidor local) y parece que funcione bien. Si se le indica un ?file=/etc/passwd devuelve un “kRET_5“, si se le pasa un ?file=/etc/shadow te devuelve un”kRET_4” (y en caso de tener permisos de lectura daría un “kRET_5“), etc.

¿Qué os parece semejante chapuza? ¿Os atreveríais a utilizar algo así en vuestras páginas si quisiérais colorear el código PHP? Adelante, explotarme el código este chapuceitor y darme de collejas. Me lo merezco jaja

Buenas noches.

Hay 4 comentarios

  1. on 15 May 2004 at 11:51 Ferdy

    Mi amigo lical en su web tiene uno basado en url http://rcn.zonasiete.org/go/aboutthiswebsite/es y yo personalmente no he podido explotarlo.

    Salu2.Ferdy

  2. on 15 May 2004 at 16:36 Juanjo

    Espera que igual me parece muy simple pero… suponiendo que el script está en /var/www entonces ?file=loquesea/../../../etc/passwd se salta tus comprobaciones. Juas, parece hasta una cagada de IIS :D

    En mi apache corriendo como usuario sin privilegios y dentro de un chroot el impacto sería mínimo. No obstante yo me olvidaría de usarlo (al menos así).

  3. on 15 May 2004 at 17:23 ebarbeito

    ¡Uff, qué mal lo acabo de pasar! Creí haberme cargado esta anotación en vez de tus comentarios, Juanjo. Ya estaba en google buscando un duplicado XDDD

    Pues efectivamente tío :) joder, qué facilón. Has dejado a mi pobre chapuza por los suelos, en un santiamén :D (es lo que tienen las chapuzas imagino… que son poco fiables XD)

    Se podría añadir más y más comprobaciones pero, en fin, esta anotación fue un lapsus antes de irme a dormir jajaja. Lo dejo ahí, tal cual.

    Seguro que puede ser vulnerado de otras formas. Así que ya sabéis, si os aburrís… todo vuestro jeje

    Un saludo :-)

  4. on 12 Jun 2004 at 01:21 QuasaR

    No se trata de añadir comprobaciones. Con expresiones regulares en dos lineas escapas los caracteres problematicos y punto.

    ;)

Trackback URI |