martes, 2 de junio de 2015

cURL como

[cURL Howto]


Puedes utilizar la librería cURL y el comando curl para diseñar tu propia Petición y explorar la Respuesta. Hay muchos usos posibles, como por ejemplo, una API de depuración, para realizar web hacking o pen testing, entre los usos más creativos.

curl es una herramienta para transferir datos desde o hacia un servidor, utilizando uno de los protocolos soportados (por ejemplo, FTP, GOPHER, HTTP, HTTPS, IMAP, LDAP, POP3, RTMP, SCP, SFTP, SMTP, TELNET). El comando está diseñado para funcionar sin interacción por parte del usuario.

curl ofrece una amplia cantidad de trucos útiles tales como soporte de proxy, autenticación de usuario, subida a FTP, anunciar peticiones HTTP, conexiones SSL, cookies, continuar o resumir transferencia de ficheros, Metalink, y mucho mas. Como podrás ver abajo, el número de características hará que te de vueltas la cabeza!

Por lo tanto, curl es verdaderamente un comando poderoso, sin embargo esto lo hace a un costo de complejidad. Aquí mostraré algunos de los casos de uso del mundo real.

 

La URL

La sintaxis de la URL es independiente del protocolo. Si especificas una URL sin el prefijo del protocolo ( protocolo:// ), curl intentará adivinar cual es el protocolo que quieres utilizar. Intentará utilizar el protocolo determinado HTTP pero también intentará en otros protocolos basados en prefijos de nombres usados frecuentemente. Por ejemplo, para un host que el nombre inicie con “ftp.”  curl asumirá que quieres hablar el lenguaje usado en FTP.

Puedes especificar multiples URLs o parte de ellas escribiendo unas partes de ellas dentro de llaves, como por ejemplo:
curl en.wikipedia.org/wiki/{FTP,SCP,TELNET}

Tambien puedes establecer seuencias de series alfanuméricas utilizando corchetes [ ] como en estos ejemplos:
curl forums.example.com/showthread.php?t=[1758900-1758913]

curl numeros.com/file[1-100].txt
curl numeros.com/file[001-100].txt
curl letras.com/file[a-z].txt

No se soportan secuencias anidadas, pero puede utilizar cuantas quieras una después de otra:
curl cualquiersitio.org/file[2010-2015]/vol[1-5]/parte{a,b,c}.html

Se puede especificar cualquier cantidad de URLs en la línea de comandos. Éstas serán ejecutadas en una manera secuencial en el orden especificado.

Se puede espedificar un contador de pasos de avance para los rangos para obtener cada Nth posiciones de números o letras:
curl numeros.com/file[1-100:10].txt
curl letras.com/file[a-z:2].txt

Rastrear el volcado [Trace Dump]

Para analizar en profundidad qué es lo que enviamos y qué es lo que recibimos, podríamos guardar absolutamente todo en un fichero, esto es tan facil como digitar en la línea de comandos:
curl --trace-ascii VolcadoDeDepuracion.txt URL

 Guardar a Disco

Si se quiere guardar las Respuestas al disco se puede utlizar la opción -o <fichero>. Si se están utilizando {} or [] para ejecutar múltiples documentos, se puede utlizar ‘#‘ seguido por un número en el especificador. Esa variable será reemplazada con la cadena actual para la URL que esté siendo ejecutada en ese instante. Recuerda proteger la URL en la línea de comandos añadiendo comillas dobles si se recibe el mensaje de error:
internal error: invalid pattern type (0).

Ejemplos:
curl 'es.wikipedia.org/{FTP,TFTP,SFTP}' -o "#1.html"
curl arxiv.org/pdf/13[01-11].36[00-75].pdf -o "arXiv13#1.36#2.pdf"

La opción -O escribe la salida a un fichero local llamado como el fichero remoto que queremos obtener (solamente se utiliza la parte del nombre del fichero remoto, la parte de la ruta del fichero es eliminada). Se usa solamente el nombre del fichero remoto para guardar lo que se ha extraído de la URL proporcionada, nada mas.

Consecuentemente, el fichero será guardado en el directorio actual en el que se está trabajando (desde donde decidió ejecutar curl en la línea de comandos. Si se quiere guardar el fichero en un directorio distinto, asegúrese de cambiarse al directorio adecuado antes de invocar curl :
curl -O arxiv.org/pdf/1301.3600.pdf

Solamente la parte del fichero remoto es utilizado, por lo tanto, el fichero será guardado como 1301.3600.pdf.

Establecer el método de Petición HTTP

El método HTTP predeterminado de  curl, GET, puede ser establecido a cualquier método que se necesite utilizando la opción -X <command>. Las figuras principales en esto, POST, PUT, DELETE, y aún los métodos personalizados, pueden ser especificados:
curl -X POST echo.httpkit.com

Normalmente no se necesitará esta opción. Todos los tipos de peticiones como GET, HEAD, POST y PUT más bien son invocados mediante el uso de las opciones de la línea de comandos.

Formularios

Los formularios son como un sitio web presenta una página HTML con campos para que el usuario ingrese datos en ellos, y de alguna manera presione sobre algo que diga ‘enviar’ con forma de botón para obtener esos datos y eviarlos al servidor.

Típicamente, el servidor usa los datos enviados para decidir qué hacer. Como utilizar las palabras que se han ingresado y buscar en una base de datos, o para añadir esta información en un sistema de rastreo/seguimiento de errores, mostrar la dirección ingresada sobre un mapa o utilizar la información como un indicador de registro verificando que el usuario le está permitido ver lo que debe autorizado para ver.

Utilizando la opción -d se puede especificar nombres y valores codificados en la URL:
curl -d "prefisso=051" -d "numero=806060" -d "Prosegui=Verifica" -d "form_name=verifica_copertura_ehiveco" http://www.ovus.it/verifica_copertura_ehiveco.php

Un camino muy común para las aplicaciones basadas en HTML para pasar el estado de la información entre las páginas, es añadir campos ocultos en los formularios. Los campos ocultos ya están completados con información, y ellos no pueden ser mostrados al usuario y tienen que ser pasados de largo tal como el resto de los otros campos. Para curl no hay diferencia entre ellos, sólo necesitas en la línea de comandos.

Establecer Peticiones de Cabecera [Set Request Headers]

Las Peticiones de Cabeceras o "Request headers" permite a los clientes proveer a los servidores con meta información sobre cosas tal como Autorización, capacidades, y tipo de contenido en el cuerpo de la página. OAuth2 utiliza una cabecera Authorization para pasar señales de acceso, por ejemplo.

Las cabeceras personalizadas se pueden establecer en curl utilizando la opción -H :
curl -H "Authorization: OAuth 2c4419d1aabeec" http://echo.httpkit.com
curl -H "Accept: application/json" -H "Authorization: OAuth 2c3455d1aeffc" http://echo.httpkit.com

Hay que notar que si se debería añadir una cabecera personalizada que tiene el mismo nombre de una cabecera interna curl utilizará la cabecera establecida de forma externa en lugar de la interna. No se deberían reemplazar cabeceras que son establecidas de forma interna sin saber perfectamente bien qué es lo que se está haciendo. Eliminar una cabecera interna dando un reemplazo sin contenido en el lado derecho de los dos puntos, como en: -H "Host:".

Si se envía la cabecera personalizada sin valor alguno, entonces esta cabecera debe ser finalizada con punto y coma, tal como: -H "X-Custom-Header;" para enviar "X-Custom-Header:".

curl asegurará que cada cabecera que se añada o se elimine sea enviada con el marcador apropiado de "fin-de-línea", por lo tanto, no se debería añadir esto como parte del contenido de la cabecera: saltos de línea o retornos de carro, lo único que harán es estropearte las cosas.

Referer

Una petición HTTP podría incluir un campo referer, el cual puede ser usado para decir desde cual URL el cliente obtuvo un recurso en particular. Algunos programas/scripts revisan el campo referer de las peticiones para verificar que este no está llegando de un sitio externo o de una página desconocida. Mientras que esto es una forma estúpida de verificar algo y que puede ser fácilmente forzado, muchos scripts todavía lo hacen de esta forma.

Esto puede ser establecido con el indicador -H, --header por supuesto. Cuando se utiliza con -L, --location se puede añadir ";auto" al indicador --referer de la URL para hacer que automáticamente curl establezca la URL previa cuando de seguimiento a una cabecera Location: .

La cadena ";auto" puede ser utilizada ella sola, aún si no se estableció un --referer inicial.
curl -e google.com http://echo.httpkit.com

User Agent

Para especificar la cadena User-Agent y envarla al servidor HTTP se puede utilizar el modificador --user-agent. Para codificar espacios en blanco en la cadena, hay que encerrar la cadena entre comillas simples. Por supuesto, esto también puede ser establecido con la opción -H, --header.

Muchas aplicaciones utilizan esta información para decidir como mostrar las páginas. A veces, notarás que obtener una página con curl no devolverá la misma página que puedes obtener si accedes o la visualizas con tu navegador favorito. Es allí cuando sabes que es tiempo de establecer el campo User Agent para engañar al servidor y hacerlo creer que tú eres uno de esos navegadores:
curl -A "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5" http://echo.httpkit.com

Cookies

La forma en que los navegadores web hacen “control de estado en el lado del cliente” es utilizando Cookies. Las cookies son solamente nombres con contenidos asociados. Las cookies son enviadas al cliente por el servidor. El servidor le dice al cliente por qué ruta y nombre de host éste quiere que la cookie sea enviada de regreso, así también en ella envía información de la fecha de caducidad y unas cuantas propiedades mas.

Cuando un cliente se comunica con un servidor por medio de un nombre y una ruta que se ha establecido previamente en una cookie que se ha recibido, el cliente envía de regreso las cookies y sus contenidos al servidor, a menos que esta ya haya caducado.

Muchas aplicaciones y servidores utilizan este método para conectar una serie de peticiones dentro de una sola sesión lógica. Para poder utilizar curl en tales situaciones, debemos poder grabar y enviar de regreso las cookies en la forma que el servidor web las espera. De la misma manera que los navegadores interactúan con ellas.
De una forma supuesta, la data recivida previamente del servidor se encuentra en una línea "Set-Cookie:". La data debería estar en el formato "NAME1=VALUE1; NAME2=VALUE2".

Sino se utiliza el símbolo igual ( = ) en la línea, es tratado como un nombre de fichero de donde se suele leer las líenas almacenadas previamente en la cookie, el cual debería ser utilizado en esta sesión si ellos se emparentan.

Al utilizar este métido también se actuva el "analizador de cookies" el cual hará que curl grabe las cookies entrantes, lo cual podría ser manipulable si se está utilizando en combinación con la opción -L, --location.

El formato de archivo de donde se leen las cookies deberían ser cabeceras planas HTTP o en el formato de archivo de cookie de Netscape/Mozilla. NOTE que el fichero especificado con la opción -b, --cookie es solamente utilizado como entrada. Las cookies no serán almacenadas en el fichero. Para almacenar cookies, hay que utilizar las opciones -c, --cookie-jar o también se pueden cabeceras HTTP a un fichero utilizando el modificador -D, --dump-header:
curl --cookie "name=whitehatty" http://echo.httpkit.com
curl -c cookies.txt http://www.facebook.com
sed -i '' s/#HttpOnly_\.facebook\.com/echo\.httpkit\.com/g cookies.txt
curl --cookie cookies.txt http://echo.httpkit.com
curl -b cookies.txt --cookie-jar newcookies.txt http://echo.httpkit.com
curl --dump-header headers_and_cookies http://www.facebook.com

Trabajo en progreso…

Hay muchas más opciones, pero hay que hacer una pausa por ahora. Poco a poco se irán añadiendo más ejemplos de característica en el futuro, así que pendientes a las actualizaciones...

0 comentarios:

 

Copyright © El igloo de Tux Design by O Pregador | Blogger Theme by Blogger Template de luxo | Powered by Blogger