Método para revelar codigo oculto en PHP

Método para revelar codigo oculto en PHP

Trabajando en mp3.gaguma.net me encontre el siguiente extracto de codigo en un repositorio publico Github.

El codigo esta codificado 15 veces en una combinación de múltiples llamadas a funciones como str_rot13, gzinflate, gzuncompress, strrev y base64_decode. Estudiando computacion he aprendido que una de las reglas mas importantes para un programador es que nunca debes incluir código oculto en tu aplicación ya que es un problemas de seguridad y privacidad.

Una de las formas de revelar el código oculto es de llamar cada función, una por una, hasta que te devuelva el código abierto. Dentro del repositorio hay un comentario cerrado que te revela el codigo pero yo no lo vi cuando estaba analizando el código, pero como me gusta un buen reto me decidí a revelar el código sin la ayuda de herramientas online que se especializan en este tipo de tareas.

Para esta tarea decidi usar una herramienta para ejecutar codigo PHP online. Las líneas 22-64 son el código a revelar, copie el código y elimine la llamada a eval para que me mostrara lo que se ejecutaba ocultamente.

El resultado me mostraba mas codigo oculto

eval(gzinflate(base64_decode(rawurldecode('XZXHroTgDUYfJ4lY0IamKAt67w ...'))));

Si repetía el mismo proceso de copiar el código de salida y remover la llamada a eval, me daba mas codigo oculto

eval(base64_decode(gzuncompress(base64_decode('eJwVlt1iq6wWRV8JNfbbudy ...'))));

Viedo que el mismo patrón se repetía, decidi hacer un pequeño script para automatizar el proceso.

<?php
$linea = str_rot13(gzinflate(str_rot13(base64_decode('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
+F/j9+78=')))); // linea original sin la llamada a 'eval'

$profundidad = 100; // numero de repeticiones, 100 es un numero aleatorio para probar

for($nivel = 0; $nivel<=$profundidad; $nivel++) {
    $linea_sin_eval = substr(substr($linea, 5), 0 , -2) . ";"; // remover "eval(" y ultima ")"
    eval('$linea=' . $linea_sin_eval);  // ejecutar la nueva linea sin "eval" y guardar el resultado
    echo($linea . "\n");
}
?>

Finalmente observe que a $profundidad = 14 el script me mostraba el código oculto.

<?php
    $ytresponse = @file_get_contents("https://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D$id&format=json");
    $ytinfo = array();
    $ytinfo = json_decode($ytresponse,true);
    $type = $ytinfo['type'];
?>

Este es un método que desarrolle en unos minutos, pero puede que existan otros métodos más rápidos y eficientes que el mio. Al final tengo que decir que usando código que no puedas leer en tu servidor es una muy mala practica y es preferible correr codigo que tu entiendas y confies.

Si vas a compartir código con el resto del mundo, por favor nunca intentes de ocultarlo!

JG.

Julio G.

Julio G.
Soy un GNU/Linux entusiasta, me gusta programar en mi tiempo libre y escribir acerca de problemas que me encuentro en mis proyectos personales