domingo, 11 de agosto de 2013

[Tutorial] PHP no alfanumerico

Este tutorial ha sido originalmente creado por Gareth Heyes en su BLOG:
http://www.thespanner.co.uk/2012/08/21/php-nonalpha-tutorial/
Esto solo es una traduccion, espero que les sea de ayuda como me fue a mi al investigar sobre el tema, ademas pueden usar su herramienta Hackvertor para generar este tipo de obfuscado.




Mi primer post de código no alfanumérico era un poco breve, en la emoción del descubrimiento y falle en profundizar el proceso. He decidido seguir con este tutorial y espero explicar mejor el proceso para cualquiera que quiera aprender o mejorar esta técnica.

La base de código PHP no alfanumérico es aprovechar el hecho de que PHP automáticamente convierte matrices (Arrays) en una cadena "Array" cuando se usa en un contexto de cadenas. Un ejemplo sencillo seria:

$x= array(1,2,3);
echo $x; // Salida: Array

$x ahora es la cadena "Array". Perto te daras cuenta que usamos caracteres alfanumericos, tambien podemos crear una matriz sin utilizar array() como el siguiente:

$_="";
$_[+""]='';
echo $_; // Salida Array

La primera parte crea una variable "$_" la segunda parte hace referencia a 0 mediante el operador de prefijo de una cadena en blanco para convertir a 0, la asignación crea el array. Este fue un primer intento de hackear una matriz cuando escribí por primera vez, pero se pueden utilizar todo tipo de trucos, por ejemplo, no es necesario que parta de "0".

$_="";
$_[+$_]++;
echo $_; // Salida Array

Te dejare a ti experimentar formas de crear matrices pero tu tienes la idea.
Claro nosotros tenemos los caracteres "A","r","r" etc, Ahora tenemos que acceder a ellos y afortunadamente PHP es muy similar a JavaScript en ese sentido. El primer paso es forzar a nuestra matriz (Array) dentro de la cadena actual para concatenar con una cadena en blanco como esto:

$_=$_.""; // $_ contiene nuestro Array anteriormente creado y lo forzamos dentro de una cadena

El siguiente paso es acceder a la letra actual y PHP convenientemente provee el mismo método que javascript para acceder. Para hacerlo necesitamos cero (0), como mostramos antes usando el operador prefijo con una cadena en blanco podemos convertir a cero (0) (también como javascript).

echo +""; // Salida 0

Usando el 0 nosotros podemos acceder a nuestra letra "A" desde la matriz convertida.

echo $_[+""]; // Salida "A"

Ahora originalmente por que estaba descubriendo esta técnica hice algunas operaciones matemáticas locas en múltiples caracteres para obtener otros caracteres para la matriz, pero esto no fue necesario como Stefan Esser propuso puede ser mas simple usar cadenas de incremento/decremento. Pero de cualquier manera yo imagine la salida de las letras haciendo una anidación de todos los caracteres en bucles, luego haré un post del script. Por ahora vamos simplemente a incrementar/decrementar los caracteres que nosotros necesitemos. Mostraremos como obtener la letra "B" primero.

$_=""; // nosotros necesitamos una cadena en blanco para comenzar
$_[+$_]++; // Accedemos a la parte de la cadena y lo convertimos en una matriz
$_=$_.""; // Convertimos la matriz en una cadena "Array"
$_=$_[+""]; // Accedemos a el índice 0 de nuestra cadena "Array" que es "A"
echo ++$_; // Incrementamos "A" a "B"

Esto es lo básico de como funciona, nosotros necesitamos crear una una cadena que llame a una función tal como "chr" o genere caracteres manualmente y entonces una función basada en eval para llamar a nuestro código. El post original usaba GET pero desde que ya esta documentado te mostrare como generar código diferente. Nosotros usaremos la función "assert" de PHP, ya que evalúa código y se le permite ser llamado usando referencias de cadenas de su nombre. Por ejemplo:

$_="assert";
$_("print 1+1"); // Output 2

Por lo tanto necesitamos generar "assert" y nuestro código llamado. Usando el ejemplo de antes que nosotros generamos "Array" nosotros simplemente creamos nuevas referencias y incrementamos los caracteres que necesitemos.


$_="";// Nosotros necesitamos una cadena en blanco para comenzar
$_[+$_]++;// Accedemos a la parte de la cadena para convertirla en una matriz(Array)
$_=$_."";// Convertimos la matriz en una cadena "Array"
$__=+"";// Creamos 0
$__++;// Incrementamos a 1
$___=$_[+""];// Accedemos al índice 0 de la cadena "Array" que es "A"
$____=$____=$_[$__];// Accedemos al índice 1 de la cadena "Array" que es "r"
$_____=$____;// Asignamos "r" para una nueva variable
$_____++;// Incrementamos a "s"
$______=$___;// Nueva variable para "E"
$______++;$______++;$______++;$______++;//Incrementamos para "E"
$_=$___.$_____.$_____.$______.$____.++$_____;//Concatemos las cadenas para formar "AssErt"
$_("p".$____."in".$_____." $__+$__");//Llamamos "print 1+1"

Usted notara que faltan caracteres al final "p","i" y "n" son alfanuméricos esos son para que pueda generar el uso de las técnicas descritas. Hay retos distintos que hacer después de eso, por ejemplo, una pregunta que debe hacerse es "¿Cuantos caracteres son el mínimo necesario para generar código no alfanumérico?" Otro reto es "¿Cual es la cantidad mínima de caracteres para crear un generador de código no alfanumérico?". Espero que hayan disfrutado de esta escritura y disfrutado creando y buscando nuevas cosas con no alfanuméricos en PHP!

Retos:

1.- Completa el código "print 1+1" al final del ultimo ejemplo (Básico)
2.- Busca el mínimo de caracteres requeridos para generar código no alfanumérico, ejemplo: usando solo $_ + etc (Difícil)
3.- Crea un generador no alfanumérico en PHP la mas pequeña cantidad de código posible como este: The HackVertor Non-Alpha tag (https://hackvertor.co.uk/hvurl/3v) (Difícil)

Lideres del reto:
1.- @insertScript
Reto 1 - Hecho
Reto 2 - Hecho (usando $_()[]+=.;)

No hay comentarios:

Publicar un comentario