PHP en la consola: Lo que necesitas saber para hacer scripts

PHP es unos de los lenguajes de programación más utilizados en el mundo, el más utilizado hasta el momento en el ámbito web del lado del servidor. Para scripts CLI (línea de comandos) es más bien poco conocido, aunque cuenta con todas las posibilidades para hacerlo sus homólogos Python, Perl, Ruby y naturalmente Bash tienen una mayor popularidad. En este artículo veremos algunas características que deberías conocer si ya usas PHP en la web y quieres adentrarte en el mundo “juackeroso” de los scripts sin necesidad de aprender un nuevo lenguaje de programación.

También puedes hacer aplicaciones gráficas para escritorio con PHP-GTK y PHP-QT, pero siendo sincero no los recomiendo.

¿Qué puedo hacer con PHP desde la consola?

Todo lo que puedes hacer con PHP para la web lo puedes hacer en la consola, con algunas excepciones claro está, no deberías esperar que cosas hechas exclusivamente para la web funcionen en la consola, lo que sí puedes esperar es un mejor rendimiento, ejecutar scripts pesados en el navegador ocasionalmente los puede hacer malfuncionar y no me hables del tiempo limite de ejecución y recursos, cosas que no “molan”.

Empezando con PHP para la consola

Si usas Linux y similares ya deberías tener PHP funcionando en la terminal. Para Windows debes descargarlo y como recomendación agregarlo al PATH para usarlo de forma más fácil.

Consola interactiva

Eso que tanto gusta de Python, PHP incluye una consola interactiva para escribir código directamente desde ella:

php -a
Interactive shell
php > echo 5+5;
10
php > echo 10*10;
100
php > echo "Cualquier cosa";
Cualquier cosa

También es posible ejecutar código PHP pasándolo como argumento, usando -r:

php -r "echo base64_encode('hola');"
aG9sYQ==

Útil para usarlo junto a scripts de Bash por poner un ejemplo y usar alguna que otra función que nos provee PHP.

Pasar argumentos

Se le pueden pasar argumentos a un archivo PHP, la variable $argv se encargará de almacenarlos en un array y junto a $argc se puede conocer el número de parámetros pasados al script. Es importante no enviar argumentos con un guión (-) porque PHP los usa para sus propios parámetros de consola, para estos casos se debe usar doble guión.

<!--?php echo $argc; print_r($argv); ?-->

 

php pruebas.php un argumento que pasa por aqui
7 Array
(
[0] => pruebas.php
[1] => un
[2] => argumento
[3] => que
[4] => pasa
[5] => por
[6] => aqui
)

Leer datos de entrada

Como no es posible leer datos enviados por Post o Get hay una forma de leer datos de entrada en tiempo de ejecución (diferente a los parámetros):

<!--?php echo "Escribe tu nombre: "; $nombre = trim(fgets(STDIN)); echo "Hola " .$nombre; ?-->

 

<!--?php pruebas.php<br ?-->Escribe tu nombre: Urban
Hola Urban

Colorear consola

Es habitual poner un poco de color a nuestros scripts, en PHP es posible de una forma un tanto engorrosa, se debe usar secuencias de escape para ello:

<!--?php echo "\033[31mHola\033[37m"; echo "\033[32m desde RedInfoCol\033[37m"; ?-->

color-consola-php

Utilidades

  • Podemos encontrar más cosas interesantes, por ejemplo cuando un script va creciendo y creciendo van apareciendo nuevos ficheros, PHP nos provee para ello una solución, empaquetar estos archivos en uno solo con extensión .phar.
  • Podemos crear un servidor web para ejecutar los archivos PHP sin depender de Apache o similares, simplemente usando:
    php -S localhost:puerto
  • Usando un if (defined(‘STDIN’)) podemos comprobar si el script se está ejecutando desde la consola y en caso de que no mostrarle un mensaje al usuario para que lo haga.
  • Existen librerías para añadir a nuestro PHP y sacarle un mayor provecho a la hora de crear scripts.

Ingeniería inversa básica en Android

Los siguientes documentos son una introducción a la ingeniería inversa de aplicaciones hechas para Android (ejecutables con extensión .APK) escritos por mi amigo Ghost, en los que se describe el funcionamiento del Android SDK y también se explica como decompilar dichos ejecutables para modificarlos y luego volver a “recompilarlos” con algunas herramientas  existentes. Por el momento solo son dos papers, estaré informando la publicación de los próximos.

TOMO I

Aplicaciones necesarias:

Dex2Jar: Es la aplicación que vamos a usar para convertir nuestro fichero .dex a .Jar, es posible usarlo individualmente o podemos configurarlo en eclipse, que es lo que se explica en la guía.
JD-GUI: Una belleza de aplicación que nos deja “ver” el código fuente de los ficheros .class.

Descargar PDF “ingeniería inversa básica en Android [TOMO I]”

Descargar CrackME para pruebas

TOMO II

Las herramientas utilizadas son:
– Smali/Baksmali (Ensamblador/desensamblador).
– APKTool (Contiene las anteriores herramientas más opciones para modificiar APKs).
– Testsign.jar (para firmar aplicaciones Android.).
– zipalign (optimizar aplicaciones aptas para Android).
– Notepad++ o cualquier editor de texto avanzado.

Descargar PDF “Ingeniería inversa básica en Android [TOMO II]”

Comparar dos imágenes pixel a pixel

Un sencillo método a tener en cuenta para retos de esteganografía:

<?php
$original = imagecreatefromjpeg('1.jpg');
$modified = imagecreatefrompng('2.png');
$size = getimagesize('1.jpg');
$output = imagecreate($size[0], $size[1]);
imagecolorallocate($output, 255, 255, 255);
$cblack = imagecolorexact($output, 0, 0, 0);
for ($a = 0; $a < $size[0]; $a++) {
for ($b = 0; $b < $size[1]; $b++) {
$colororiginal = imagecolorat($original, $a, $b);
$colormodified = imagecolorat($modified, $a, $b);
if ($colororiginal != $colormodified)
imagesetpixel($output, $a, $b, $cblack);
}
}
imagepng($output, 'resultado.png');
?>
Cracking hash with PHP

PHPCracker: Crackear diferentes tipos de hash con PHP

Últimamente resolviendo algunos retos me ha tocado crackear diferentes hash y aunque existen muchos programas para esa labor (como Cain) estos no ofrecen soporte para realizar fuerza bruta a algunos tipos de hash. Por esta razón hice PHPCracker, un sencillo script que permite realizar ataques por fuerza bruta y ataques por diccionario usando PHP.

<?php

if (defined('STDIN')) {
        if (count($argv) < 2) {
            echo "#########################################################################\n" .
            "#           PHPCracker UrbaN77 www.RedInfoCol.org  - www.BrianUR.info   #\n" .
            "#########################################################################\n" .
            "# Uso: php phpcracker.php [Modo] [Nombre del hash] [Hash] [Opciones]    #\n" .
            "# --------------------------------------------------------------------- #\n" .
            "# Modo: usa -b hacer un brute force o -d para un ataque por diccionario.#\n" .
            "# Nombre del hash: Por ejemplo md5, sha1 o cual sea el nombre.          #\n" .
            "# Hash: Hash a crackear.                                                #\n" .
            "# Opciones: Estas dependen del modo elegido.                            #\n" .
            "#  - Charset: min para minusculas, may para mayusculas   o all para las #\n" .
            "#             anteriores con numeros y simbolos (Solo para el modo -b). #\n" .
            "#  - Diccionario: nombre del fichero de tu wordlist (Solo para modo -d).#\n" .
            "#########################################################################";
            exit;
        }
        $modo = $argv[1];
        $tipoHash = $argv[2];
        $hash = $argv[3];

        function crackear($hash, $tipoHash, $charset) {
            if ($charset == "min") {
                $desde = 97;
                $hasta = 122;
            } elseif ($charset == "may") {
                $desde = 65;
                $hasta = 90;
            } elseif ($charset == "all") {
                $desde = 33;
                $hasta = 126;
            } else {
                echo "Necesitas especificar el Charset: min, may o all.";
                exit;
            }
			echo "Crackeando...\n";
            for ($i = $desde; $i <= $hasta; $i++) {
                for ($j = $desde; $j <= $hasta; $j++) {
                    for ($k = $desde; $k <= $hasta; $k++) {
                        for ($l = $desde; $l <= $hasta; $l++) {
                            $salida = hash($tipoHash, chr($i) . chr($j) . chr($k) . chr($l));
                            if ($hash == $salida) {
                                echo "Password encontrado: " . chr($i) . chr($j) . chr($k) . chr($l)."\n";
                                exit;
                            }
                        }
                    }
                }
            }
        }

        if ($modo == "-d") {
            $wordlist = $argv[4];
            if (file_exists($wordlist)) {
                $diccionario = file($wordlist);
				echo "Crackeando...\n";
                foreach ($diccionario as $rel) {
                    $salida = hash($tipoHash, $rel);
                    if ($salida == $hash) {
                        echo "El password es: " . $rel;
                        exit;
                    }
                }
            } else {
                echo "El archivo " . $wordlist . " no existe.";
                exit;
            }
        } elseif ($modo == "-b") {
            $charset = $argv[4];
            crackear($hash, $tipoHash, $charset);
        }
        echo "Password no encontrado :/ intenta probando con otro tipo de hash, otro charset o diccionario.";
} else {
    echo("Necesitas correr este script desde la consola.");
}
?>

Continuar leyendo…

Enviar datos vía post y get usando cURL y PHP

Continuando con el uso de cURL y PHP veremos la forma de enviar datos ya sea por Post o Get, útil en caso de querer por ejemplo rellenar un formulario de forma automatizada, hay scripts que usan este método para saltar captchas así que las funcionalidades son bastantes.

Enviar datos por Post

Para el envío por de datos por Post se hace uso de CURLOPT_POST y CURLOPT_POSTFIELDS para enviar los parámetros que se quieran, en caso de que dichos parámetros usen espacios se recomienda el uso de urlencode. Manos al código:

//Iniciamos cURL.
$ch = curl_init();
//Accedemos a la URL
curl_setopt($ch, CURLOPT_URL, "http://web.com/for.php");
//Indicamos que vamos a enviar datos por Post.
curl_setopt ($ch, CURLOPT_POST, true);
//Iniciamos una sesion
curl_setopt($ch, CURLOPT_COOKIE, 'COOKIE O SESION');
//Indicamos que queremos imprimir el resultado
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
//Hacemos uso de un User Agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows
NT 6.1; es-ES; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");
//Enviamos los datos por post
curl_setopt ($ch, CURLOPT_POSTFIELDS, "codigo=".urlencode($datos));
//Ejecutamos e imprimimos el resultado
echo curl_exec($ch);

Continuar leyendo…

Uso de cURL en PHP


cURL es una herramienta para usar en un intérprete de comandos para transferir archivos con sintaxis URL, soporta FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP. cURL soporta certificados HTTPS, HTTP POST, HTTP PUT, subidas FTP, Kerberos, subidas mediante formulario HTTP, proxies, cookies, autenticación mediante usuario+contraseña (Basic, DIgest, NTLM y Negotiate para HTTP y kerberos4 para FTP), continuación de transferencia de archivos, tunneling de proxy http y muchas otras prestaciones. De Wikipedia

cURL ofrece miles de usos, normalmente en el ámbito de desarrollo web se usa para trabajar con APIs, extraer información concreta en webs, etc. Manos al código:

//Iniciamos cURL
$ch = curl_init();
//Especificamos en la variable url el sitio al cual nos vamos a conectar
$url = "https://www.brianur.info";
//Accedemos al sitio
curl_setopt($ch,CURLOPT_URL,$url);
/*CURLOPT_RETURNTRANSFER se usa para almacenar el valor de curl_exec
en una variable, en este caso es false porque queremos que se imprima
el resultado en pantalla en vez de almacenarlo en la variable*/
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
/*Opcionalmente en caso de que la web requiera iniciar sesion, se puede
hacer uso de CURLOPT_COOKIE*/
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=cookie;');
//Como opción podemos indicar un Usear Agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows
 NT 6.1; es-ES; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");
//Ejecutamos y imprimimos
echo curl_exec($ch);
//Opcionalmente cerramos la conexión.
curl_close($ch);

Continuar leyendo…

[Codiguillo] Invertir contenido de un archivo con PHP

<?php
$archivo = file_get_contents("archivo.BMP"); // Se obtiene el contenido de "archivo.BMP".
$voltear=strrev($archivo); // Se hace uso de la funcion strrev para invertir el archivo.
echo $voltear; // Se imprime el contenido del archivo inverso, esta linea se puede omitir.
$archivo = fopen ("tal.bmp", "w+"); // Se abre el archivo tal.bmp.
fwrite($archivo, $voltear); // Se escribe en el archivo tal.bmp el contenido invertido.
fclose($archivo); // Se cierra el archivo.
?>

Crear una aplicación de Frases para Facebook: Invitar amigos a usar la aplicación

Este articulo hace parte de la vieja API de Facebook, para más información sobre la nueva API te recomiendo leer Funcionamiento de la Graph API de Facebook.

Continuando con el Tutorial para crear una aplicación de frases, veremos algo muy importante para hacer crecer nuestra aplicación: Invitar amigos.

Para hacer esto necesitamos hacer uso de las siguientes etiquetas FBML:

<fb:request-form
 action="index.php?accion=amigos"
 method="POST"
 invite="true"
 type="Tu aplicacion!"
 content="Hola! encontre esta aplicacion y pense que te podria gustar. Descripcion de la aplicacion
 <fb:req-choice url='http://www.facebook.com/login.php?api_key=<c:out value='${apiKey}' />'
 label='Ir a la aplicacion!' />">

 <fb:multi-friend-selector
 showborder="false"
 actiontext="Invita a tus amigos a usar esta aplicacion."
 exclude_ids="<c:out value='${appUserFriends}' />"
 max="20" />
</fb:request-form>

El resultado:

Pueden ver el ejemplo funcionando aquí.

Función en PHP para recuperar registros a una etiqueta select

Ya he visto en varios foros a personas preguntando como poder recuperar registros de una base de datos MySQL a un campo de selección (<SELECT>), con esto lo que podemos hacer es por ejemplo desde en un formulario de registro, permitir a el usuario seleccionar su ciudad:

<?php
//Brian Urban - https://www.brianur.info
function genera_select($nombre,$id,$tabla,$campo_visual,$campo_valor,$default=0){
 $sql="select $campo_valor, $campo_visual from $tabla order by $campo_visual";
 $result= mysql_query($sql);
 echo "<select name='$nombre' id='$id'>";
 echo "<option value='0'>Seleccione opcion</option>";
 while ($row=mysql_fetch_assoc($result)){
 $id= $row[$campo_valor];
 $texto= $row[$campo_visual];
 $sel="";
 if ($default==$id){
 $sel="Selected";
 }
 echo "\n <option value='$id' $sel>$texto</option>";
 }
 echo "</select>";
}
?>

Continuar leyendo…