[PHP]Libreria cURL MiniTutoriales

Iniciado por arthusu, Julio 10, 2014, 03:30:07 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

 [Parte 1] CURL en PHP     

Instalacion Lo primero que debemos hacer para comenzar a utilizar cURL es instarlo, para ello puedes descargarlo desde: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

La guia para la instalacion de cURL compilandolo esta aqui: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En este caso no veremos en detalle esto ya que pues vienen los pasos muy detallados en la pagina de la documentacion de cURL, por lo cual veremos solamente como instarlo en la distribucion de ubuntu usando un solo comando:
  Instalar cURL con un solo comando desde la terminal:
 
sudo apt-get install php5-curl
Reiniciar el servidor apache para que funcione cURL:

  sudo /etc/init.d/apache2 restart
Como ves es demasiado facil, y de hecho ya existen muchos paquetes que te incluyen un servidor apache,mysql,php tal como puede ser XAMPP, AppServ... los cuales pueden descagar desde su web oficial y son faciles de instalar y casi siempre ya traen soporte para cURL:

XAMPP: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
AppServ: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Para saber si nuestro servidor soporta cURL solamente creamos un archivo como el siguiente info.php:

1<?php phpinfo(); ?>
Entramos al archivo y veremos algo como lo siguiente:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
  ¿Que es cURL? cURL es una herramienta para usar en un interprete de comandos para transferir archivos con sintaxis URL, soporta FTP, FTPS, HTTP, HTTPS, TFTP, SCP, Telnet, DICT, FILE, y LDAP. cURL soporta certificados HTTPS,HTTP POST, HTTP PUT,Subidas FTP, Kerberos, Subidas mediante formulario HTTP, proxies, cookies, autenticacion mediante usuario+contraseña (Basic, Digest, NTLM y Negotiate para HTTP y Kerberos4 para FTP), continuacion de transferencia de archivos, tunneling de proxy http y muchas otras prestaciones. cURL es opensource/software libre distribuido bajo la licencia MIT. El proposito y uso para cURL es automatizar transferencia de archivos o secuencia de operaciones no supervisadas. Es por ejemplo una buena herramienta para simular las acciones de un usuario en un navegador web. Libcurl es la biblioteca/API correspondiente que los usuarios pueden incorporar en sus programas, cURL actua como un envoltorio (wrapper) aislado para la biblioteca libcurl. libcurl se usa para proveer capacidades de transferencia de URL a numerosas aplicaciones, tanto libres y open source como asi tambien privativas. La biblioteca "libcurl" se puede usar desde mas de 30 lenguajes distintos.


  HTTP Hypertext transfer protocol o http (en español protocolo de transferencia de hipertexto) es el protocolo usado en cada transaccion de la world wide web. Es un protocolo orientado a transacciones y sigue el esquema peticion-respuesta entre cliente y un servidor. Al cliente que efectua la peticion (un navegador o un spider) se conoce como "user-agent" (agente del usuario). A la informacion transmitida se le llama recurso y se la identifica mediante un localizador uniforme de recursos (URL). Los recursos pueden ser archivos, el resultado de la ejecucion de un programa, una consulta a una base de datos,la traduccion automatica de un documento, etc. HTTP es un protocolo sin estado, es decir, no guarda ninguna informacion sobre conexiones anteriores. El desarrollo de aplicaciones web necesita frecuentemente mantener el estado. Para eso se usan las cookies, que es informacion que un servidor puede almacenar en el sistema cliente. Esto permite a las aplicaciones web instruir la nocion de "sesion", y tambien permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado.
 
  Uso simple de cURL La operacion mas comun es obtener una URL. Podriamos hacer referencia a una pagina, imagen o archivo. El cliente hace una peticion GET y recibe el documento que pidio.
  curl_init() - esta funcion inicializa una sesion cURL y retorna un manejador cURL.
  curl_exec($ch) -  esta funcion deberia ser llamada despues de inicializar una sesion cURL y todas las opciones establecidas en la sesion. Su proposito es simple, ejecutar la sesion CURL predefinida, dada por $ch.
  curl_setopt($ch, opcion, valor) - establece una opcion para la sesion de CURL identificada por el parametro $ch, opcion especifica la opcion que se desea establecer, y valor especifica el valor dada la opcion.
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1) - Retorna el contenido de la pagina. Si se establece en 0 no se retornara ninguna salida.
 
curl_setopt($ch,CURLOPT_URL, $url) - Pasa la url como parametro. Este el el sitio objetivo la direccion url. Esta es la url que vas a obtener desde internet.

  curl_exec($ch) - Graba la url y la pasa para la variable a mostrar.

curl_close($ch) -  cierra un recurso curl, libera los recursos del sistema.


01<?php
02 // Ejemplo 1
03 // Obtener una pagina simple
04
05 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
06 $ch = curl_init();
07 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  // Retorna el contenido de la pagina
08 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // sigue las redirecciones
09 curl_setopt($ch, CURLOPT_URL, $url); // Pasa la url como parametro
10 $resultado = curl_exec($ch); // graba la url y la pasa para una variable
11 curl_close($ch); // cierra el recurso y libera recursos para el sistema
12
13 echo $resultado; // Imprime el contenido de la pagina
14?>

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Pentest - Hacking & Security Services

Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

 [Parte 2] CURL en PHP     

Formularios Los formularios son generalmente presentados como campos donde el usuario puede meter datos, y al presionar Ok o Submit estos son enviados al servidor para ser procesados. El servidor procesa datos tipicamente como por ejemplo: una busqueda a la base de datos, un inicio de sesion, etc.
  GET y POST En el metodo GET todos los campos se ven mostrados en la URL. Esto generalmente suele ser una ventaja para sistemas de modulacion, pero una desventaja en si, ya que muchos atacantes lo primero que verifican es este tipo de URLs. El protocolo HTTP ofrecere otro metodo que es POST el cual envia los campos ocultos separados de la URL los cuales son enviados por las cabeceras HTTP.

Una buena practica seria enviar en una pagina donde los datos son enviados por el metodo POST y darle nuestros valores... En el metodo post se usa el content-type: application/x-www-form-urlencoded por lo cual es necesario encodear a urlencode nuestros datos que vamos a enviar, por ejemplo: si tiene un espacio pondriamos %20, pero para no hacerlo tan pesado podriamos hacer uso de la funcion urlencode().
  Vamos a ver como ejemplo la API de anonscanner que me paso ZanGetsu:
 
01<?php
02    /*
03    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta API sample PHP code.
04    You must edit the $uid, $api_key and $file variables to make this work.
05    */
06     
07    $url     = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
08    $uid     = "YOUR_USER_ID"; //Your user id, from the home page.
09    $api_key = "YOUR_API_KEY"; //Your API key from the home page.
10    $file    = $_FILES['file'];
11     
12    $ch      = curl_init();
13    curl_setopt($ch, CURLOPT_HEADER, 0);
14    curl_setopt($ch, CURLOPT_VERBOSE, 1);
15    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
16    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
17    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
18    curl_setopt($ch, CURLOPT_URL, $url);
19    curl_setopt($ch, CURLOPT_POST, true);
20    $post    = array(
21        "uid"     => $uid,
22        "api_key" => $api_key,
23        "file"    => "@".$_SERVER['DOCUMENT_ROOT']."/".$file,
24        "return"  => "link" //"link", "image" or "all". Leave empty for default(all).
25        );
26    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
27    $response = curl_exec($ch);
28    $response = json_decode($response,true);
29     
30    print_r($response); //JSON output
31?>
En este caso esta pequeña API lo que hace es devolvernos los resultados de los antivirus, para ello envia un archivo por medio de POST, nuestro iud, nuestra api,y el modo en que devolveremos los resultados.
 
Lo unico nuevo y que voy a explicar aqui es CURLOPT_POST, CURLOPT_POSTFIELDS.

CURLOPT_POST - TRUE para hacer un HTTP POST normal. Este post del tipo application/x-www-form-urlencoded, el mas comun en los formularios HTML.

CURLOPT_POSTFIELDS - Todos los datos para enviar via HTTP "POST". Para enviar un fichero, prefija el nombre de fichero con @ y utiliza la ruta completa. Se puede especificar explicitamente el tipo de fichero añadiendo el tipo al nombre del fichero, en el formato ';type=mimetype'. Se puede enviar una cadena urlencoded como 'para1=val1&para2=val2&...' o tambien como un array con el nombre del campo como key y los datos como value. Si value es un array, el encabezado Content-Type sera definido como multipart/form-data. Apartir de PHP 5.2.0, value debe ser un array si los archivos son pasados a esta con la opcion con el prefijo @. Apartir de PHP 5.5.0, el prefijo @ esta obsoleto, por lo que los ficheros se pueden enviar usando CURLFile.
  Nota: Para los campos ocultos de un formulario podemos usar lo mismo, solamente que como estos no se ven nosotros tendriamos que aplicarlos.
 
  Descagar una imagen (Archivo Binario) Tu puedes descargar archivos como imagenes, pdfs, psd, docs, zip usando curl. Google usa esta tecnica para mostrar sus imagenes.
 
01<?php
02 // Ejemplo 3
03 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
04 $ch = curl_init();
05 curl_setopt($ch, CURLOPT_URL, $url); // URL para descargar la imagen
06 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido
07 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0"); // especificamos el navegador que usamos
08 curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // retorna esta transferencia, como contenido binario
09 $data = curl_exec($ch); // graba la imagen jpg y lo guarda en la variable $data
10 curl_close($ch); // cierra el recurso, y libera memoria del sistema
11 header("Content-type: image/jpeg"); // le indicamos en la cabecera lo que se muestra contiene imagenes
12 echo $data; // muestra el contenido
13?>
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
  Autentificacion La autentificacion es capaz de verificar si tienes permiso a acceder a un recurso. La autentificacion basica usada en HTTP es basada en texto plano es decir usuario y contraseña ligeramente ofuscados, pero puede ser leido si te olfatean la red.

Para usar la autenticacion en una caja de dialogo, que nos pide usuario y contraseña:



 
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
01<?php
02 // Ejemplo 4
03 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
04 $post_fields = 'arthusu:test';
05 $ch = curl_init();
06 curl_setopt($ch, CURLOPT_URL, $url); // URL para descargar la imagen
07 curl_setopt($ch, CURLOPT_USERPWD, $post_fields); // la caja de dialogo
08 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido
09 $results = curl_exec($ch); // graba la imagen jpg y lo guarda en la variable $data
10 curl_close($ch); // cierra el recurso, y libera memoria del sistema
11 
12 echo $results;
13?>
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
CURLOPT_USERPWD - Nombre de usuario y contraseña siguiendo el formato "[username]:[password]" para ser usado en la conexion.
 
  Referer Muchas paginas chequean desde donde llega el cliente, mas que nada que pagina anterior uso, para llegar a la suya, esto puede ser muy util para muchas cosas, pero esto se puede engañar facilmente modificando la cabecera 'referer'.
   
01<?php
02 // ejemplo 5
03 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"; // URL
04 $referer = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"; // Sitio referido
05
06 $ch = curl_init(); // inicia una sesion curl
07 curl_setopt($ch, CURLOPT_URL, $url); // pasa la url como parametro
08 curl_setopt($ch, CURLOPT_REFERER, $referer); // establece el sitio referido
09 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina
10
11 $result = curl_exec($ch); // graba la url pasada y la mete en la variable result
12 curl_close($ch); // cierra la url, y libera recursos del sistema
13
14 echo $result; // muestra el contenido de la pagina
15?>
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
   
  User Agent La cabecera User-Agent contiene datos importantes como son el navegador que esta usando el cliente y su sistema operativo, tambien indica si esta entrando desde un dispositivo Ipad, Iphone, etc.
  Muchas paginas dejan entrar al Bot de google solo por que ven su cabecera, una buena practica que podriamos hacer es intentar entrar a varias paginas con acceso restringido en algunas zonas y ver como con el User-Agent de google tenemos mas privilegios.
  O simplemente, si intentas hacer una peticion No tienes permitido ver los links. Registrarse o Entrar a mi cuenta por medio de cURL te arrojara cloudflare con un error detectando que estas usando cURL por lo cual puedes usar esta cabecera User-Agent evitando que te salga ese error.

01<?php
02 // ejemplo 6
03 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"; // es la url que veremos
04 $agent = " Googlebot/2.1 (+No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)"; // es el navegador que usaremos
05
06 $ch = curl_init();
07 curl_setopt($ch, CURLOPT_URL, $url); // inicia una sesion curl
08 curl_setopt($ch, CURLOPT_USERAGENT, $agent); // establece el navegador
09 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina
10
11 $result = curl_exec($ch); // guarda el contenido de la pagina en $result
12 curl_close($ch); // cierra la sesion curl
13
14 echo $result; // muestra la pagina
15?>
 
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
  Redirecciones Cuando pides una pagina web, muchas veces te envia un mensaje de error 301 el cual dice que el objeto se ha movido, esto pasa que cuando tu lo pides con cURL no sigue el objeto que se movio, entonces para poder retornar o ver la pagina necesitamos seguir ese recurso...
Este tipo de recursos se ven reflejados en la cabecera Location.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Esto nos pasa cuando no seguimos la cabecera Location en el caso de google y si lo activamos.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Siguiendo la cabecera Location.


01<?php
02 // ejemplo 7
03 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"; // es la url que veremos
04
05 $ch = curl_init();
06 curl_setopt($ch, CURLOPT_URL, $url); // inicia una sesion curl
07 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // redirige a la pagina, en caso de un login te redirige a la pagina de entrada
08 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina
09
10 $result = curl_exec($ch); // guarda el contenido de la pagina en $result
11 curl_close($ch); // cierra la sesion curl
12
13 echo $result; // muestra la pagina
14?>
Hasta aqui terminamos la parte 2.
Pentest - Hacking & Security Services

Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

 [Parte 3] CURL en PHP   
Cookies El medio por el cual los navegadores web hacen "client side state control (control del estado del lado del cliente)" es por medio de cookies. Las cookies solo son nombres asociadas con contenido. Las cookies son enviadas desde el cliente al servidor. El servidor llama al cliente para saber que ruta y hostname quiere el cliente, devolviendoles asi una fecha de expiracion y unas propiedades mas.

Cuando el cliente se comunica con el servidor con el nombre y ruta previamente especificado y recibido en la cookie, el cliente envia de regreso las cookies y su contenido para el servidor, a menos que claro estas hayan expirado.

Muchas aplicaciones y servidores usan este metodo para conectar una serie de peticiones dentro de una sola sesion. Para ser capaces de usar curl en tales ocasiones, nosotros deberiamos ser capaces de guardar y enviar de regreso las cookies a la aplicacion web.

Esto es muy importante para script en cURL para verificacion de inicios de sesion o paginas con una seccion segura en el sitio web. Estas son 3 cosas que requerimos implementar:

1.- La ruta del archivo para la cookie en tu servidor:


1<?php
2 $cookie_file_path = "C:/xampp/htdocs/cookie/cook"; // Este archivo debe tener permisos chmod 777 (leer / escribir)
3?>
2.- Las funciones cURL:


1<?php
2 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); // el nombre del archivo contiene los datos de la cookie. La cookie puede ser en formato netscape, o solo texto plano http-style con las cabeceras puestas dentro del archivo
3 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); // el nombre del archivo guarda todas las cookies internas para cuando la conexion cierra.
4?>
Por favor realice lo siguiente:

1.- Suba este archivo prueba.php a su servidor con el siguiente codigo:

1<?php
2 print realpath('prueba.php');
3?>
2.-  Accede al archivo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y copia la ruta que arroja, en este ejemplo:

/home/a8131XXX/public_html/prueba.php 
  3.- Crea un archivo .txt y ponle de nombre cookie.txt y subelo a tu servidor
  4- Dale permisos CHMOD 777. En windows no es necesario realizar esto.

5.- Ahora simplemente formas una cadena con lo que salio en el paso 2 y con el archivo del paso 3, quedando de la siguiente forma:


/home/a8131XXX/public_html/cookie.txt


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
01<?php
02 // ejemplo 8
03 $user = "tusuario";
04 $pass = "tucontraseña";
05 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
06 $post_fields = 'lsd=AVolpnen&email='.$user.'&pass='.$pass.'&default_persistent=0&timezone=360&lgnrnd=222458_oW23&lgnjs=1397971500&locale=es_LA';
07 $referer = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
08 $agent = "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0";
09 $cookie_file_path = "C:/xampp/htdocs/cookie.txt";
10
11 $ch = curl_init();
12 curl_setopt($ch, CURLOPT_URL, $url);
13 curl_setopt($ch, CURLOPT_USERAGENT, $agent);
14 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
15 curl_setopt($ch, CURLOPT_POST, 1);
16 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
17 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
18 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
19 curl_setopt($ch, CURLOPT_REFERER, $referer);
20 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
21 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
22
23 $result = curl_exec($ch);
24 curl_close($ch);
25
26 echo $result;
27?>
CURLOPT_COOKIEFILE - Nombre del fichero que contiene datos de las cookies. El fichero de las cookies puede estar en formato Netscape, o simplemente tipo HTTP plano dentro de un fichero. Si el nombre es una cadena vacia, no se cargaran cookies, aunque el manejo de cookies aun esta habilitado.
  CURLOPT_COOKIEJAR - Nombre del fichero donde guardar cookies internas cuando se cierra se cierra, por ejemplo: despues de llamar a curl_close().
   HTTPS (SSL) Hay varias formas de realizar transferencias HTTP seguras. A lo lejos el protocolo mas comun que realiza esto es conocido como HTTPS, HTTP encima de SSL. SSL encripta todos los datos que son enviados y recibidos atraves de la red, asi hace mas dificil que los atacantes espien la informacion sensitiva.

SSL (o TLS como la ultima version del estandar es llamada) ofrece un camino para caracteristicas avanzadas para permitir estas encriptaciones y claves de mecanismos de infraestructura para encriptar HTTP como es requerido.
  cURL soporta recuperaciones encriptadas gracias a las librerias OpenSSL.
  En el ejemplo anterior de la peticion con cURL a facebook, usamos esto que eran las opciones CURLOPT_SSL_VERIFYPEER y CURLOPT_SSL_VERIFYHOST.
  CURLOPT_SSL_VERIFYPEER - FALSE para que cURL no verifique el PEER del certificado. Para usar diferentes certificados para la verificacion se puede especificar con la opcion CURLOPT_CAINFO o se puede especificar el directorio donde se encuentra el certificado con la opcion CURLOPT_CAPATH. TRUE por omision desde cURL 7.10. Paquete instalado por defecto en la version de CURL 7.10.
 
CURLOPT_SSL_VERIFYHOST - 1 para comprobar que existe un nombre comun en el peer del certificado SSL.  2 para comprobar que existe un nombre comun y tambien para verificar que el hostname coincide con el proporcionado. En entornos de produccion el valor de esta opcion debe de mantenerse en 2 (valor por omision).
   Depuracion Muchas veces cuando corremos curl en un sitio, tienes un aviso de que el sitio no se muestra, para responder de la misma forma las peticiones curl tu debes hacer como el navegador.

Entonces tu necesitas empezar a crear tus peticiones mas similar a tus peticiones del navegador:

- Estar seguro que checa las cookies cuando son necesarias
- Establecer User-Agent de los navegadores mas actuales y populares
- Establecer el Referer como esta establecido en el navegador
- Si contiene datos POST, debes acomodarlos de la misma manera que lo hace el navegador.
  CURLOPT_HEADER - TRUE para incluir el header (encabezado) en la salida
CURLOPT_VERBOSE - TRUE para mostrar informacion verbose. Escribe la salida en STDERR, o el fichero especificado usando CURLOPT_STDERR.
Pentest - Hacking & Security Services

Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

 [Parte 4] CURL en PHP



    Cabecera post personalizada a un host remoto Esto sucede cuando solo podemos ver ciertas partes de un sitio web, el sitio necesita unas cabeceras especiales, que tendriamos que olfatear con algun intermediario tal como puede ser: Live HTTP HEADERS, HTTPFox, Burp Suite, Tamper Data...

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
En este ejemplo estoy olfateando las cabeceras HTTP usando de intermediario HTTPFox (Complemento de firefox).

En este caso nosotros usaremos la opcion CURLOPT_HTTPHEADER.

CURLOPT_HTTPHEADER - Un array de campos a configurar para el Header HTTP, en el formato: array('Content-Type: text/plain','Content-length: 100');

CURLOPT_HEADER - TRUE para incluir el header en el OUTPUT.

01<?php
02
03 $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
04 $referer = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
05
06 $ch = curl_init(); // iniciamos curl
07 curl_setopt($ch, CURLOPT_URL, $url); // establecemos la url
08 curl_setopt($ch, CURLOPT_VERBOSE, 1); // muestra como pasa todo
09 curl_setopt($ch, CURLOPT_HEADER, 1); // muestra las cabeceras que el servidor nos devuelve
10 curl_setopt($ch, CURLOPT_STDERR, fopen('log_curl.txt','a+')); // en este archivo se guarda lo de verbose
11 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/plain')); //modificamos nuestra cabecera
12 curl_setopt($ch, CURLOPT_REFERER, $referer); // ponemos desde donde venimos
13 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devolvemos el contenido de la pagina
14 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // quitamos la verificacion del certificado
15 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // seguimos cualquier redireccion
16 curl_setopt($ch, CURLOPT_COOKIEFILE, fopen('cookies.txt','a+')); // le decimos donde van las cookies
17 curl_setopt($ch, CURLOPT_COOKIEJAR, fopen('cookies.txt','a+')); // le decimos que escriba las cookies aqui
18
19 $result = curl_exec($ch); // ejecutamos y guardamos
20 
21  curl_close($ch); // cerramos curl, liberamos memoria
22
23 print $result; // mostramos el resultado
24
25?>
  Subir un archivo a un sitio remoto usando un formulario HTML Tu debes usar un formulario utilizando el metodo POST pero con algunos cambios. En este ejemplo, donde el formulario contiene enctype='multipart/form-data'. Usamos el array superglobal $_FILE para leer el archivo y pasarlo por los campos post con el signo @. Tal como lo siguiente:

1curl_setopt($ch, CURLOPT_POSTFIELDS, array("$field_name"=>"@".$_FILES['file']['tmp_name']));
En este ejemplo les muestro como subimos un archivo remotamente a la pagina No tienes permitido ver los links. Registrarse o Entrar a mi cuenta:

01<?php
02   set_time_limit(0);
03   $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
04   $user_agent = "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0";
05   $referer = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
06   $directory=dirname(__FILE__).'\files/';
07   if(isset($_FILES['f1'])){
08      move_uploaded_file($_FILES['f1']['tmp_name'],"files/".$_FILES['f1']['name']);
09      $ch = curl_init();
10      curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
11      curl_setopt($ch, CURLOPT_REFERER, $referer);
12      curl_setopt($ch, CURLOPT_URL, $url);
13      curl_setopt($ch, CURLOPT_POSTFIELDS, array("F1"=>"@".$directory.$_FILES['f1']['name']));
14      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
15      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
16      $result = curl_exec($ch);
17      if(curl_errno($ch))
18  {
19      echo 'Curl error: ' . curl_error($ch);
20  }
21      curl_close($ch);
22      unlink($directory.$_FILES['f1']['name']);
23      //echo $result;
24      preg_match_all('/<input type="text" name="t1" size="90" class="inp" value="(.*?)" onclick="highlight\(this\);" \/>/', $result, $matches);
25      //echo '<p><img src="'.$matches[1][0].'" alt="img" /></p>';
26      echo '<p><b>Link: <a href="'.$matches[1][0].'" target="_blank">Archive Link</a></p>';
27      //print_r($matches);
28   }else{
29      echo '
30         <form action="upload_curl.php" method="post" enctype="multipart/form-data">
31            <label for="f1">Filename:</label>
32            <input type="file" name="f1" id="f1">
33
34            <input type="submit" name="submit" value="Submit">
35         </form>
36
37      ';   
38   }
39?>

En este caso tenemos un uploader y una carpeta llamada files/ en la cual se sube el fihcero luego envia una peticion subiendo el fichero y por ultimo nos envia el enlace, una cosa importante aqui es que agregamos la funcion curl_error($ch) que nos muestra si ocurre un error en cURL. Con la funcion curl_errno($ch) nos arroja un numero el cual tiene un mensaje especifico de error.

Nota: Recuerda que siempre que hago referencia a $ch es por que ahi se almacena la sesion de cURL.
  Subir un archivo por FTP Tu tienes la opcion en cURL de usar todos los comandos FTP. Por ejemplo, si quieres subir un archivo:

01<?php
02if(isset($_POST['enviar'])){
03    $ftp_user = "tuusuario";
04    $ftp_pass = "tucontraseña";
05    $url = "tuurloipdetuweb";
06    $ftp_server = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta". $ftp_user . ":" . $ftp_pass . "@" . $url;
07    $archivo_a_subir = realpath($_FILES['userfile']['tmp_name']);
08    $tamaño_del_archivo = filesize($archivo_a_subir);
09    $fp = fopen($archivo_a_subir, 'rb');
10    $ch = curl_init();
11    curl_setopt($ch, CURLOPT_URL, $ftp_server . $_FILES['userfile']['name']);
12    curl_setopt($ch, CURLOPT_VERBOSE, 1);
13    curl_setopt($ch, CURLOPT_UPLOAD, 1);
14    curl_setopt($ch, CURLOPT_INFILE, $fp);
15    curl_setopt($ch, CURLOPT_INFILESIZE, $tamaño_del_archivo);
16    if(curl_errno($ch)){
17        echo "Ha ocurrido un error: " . curl_error($ch);
18    }
19    $result = curl_exec($ch);
20    curl_close($ch);
21    echo "Archivo subido correctamente
22";
23    print $result;
24}else{
25    echo '
26        <form action="" method="post" enctype="multipart/form-data">
27            <p><input type="file" name="userfile" /></p>
28            <p><input type="submit" name="enviar" value="Subir!" /></p>
29        </form>
30    ';
31}
32?>
CURLOPT_INFILE - El fichero que el proceso de transferencia debe leer a la hora de subir el archivo.

CURLOPT_INFILESIZE - El tamaño esperado en bytes, del fichero cuando se esta subiendo un fichero al sitio remoto. Tenganse en cuenta que el uso de esta opcion no detendra a libcurl a la hora de enviar mas datos, exactamente lo que se envia depende de CURLOPT_READFUNCTION.

  Eliminar un archivo y mostrarlos por FTP Tu tienes la opcion de usar comandos FTP con cURL. Alguna lista de comandos puedes encontrarla en: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Veamos un ejemplo de Eliminar un archivo y como mostrar los archivos tambien de una carpeta.

01<!DOCTYPE html>
02<html>
03<head>
04 <title>ELIMINAR ARCHIVOS FTP</title>
05 <meta charset="utf8">
06</head>
07<body>
08<h1>Eliminar archivo</h1>
09<form action="" method="post">
10 <p><b>Nombre de la carpeta: </b><input type="text" name="carpeta" placeholder="tucarpeta/" /><small>No es necesario especificarla</small></p>
11 <p><b>Nombre del archivo: </b><input type="text" name="archivo" placeholder="archivo.jpg" /></p>
12 <input type="submit" name="enviar" />
13</form>
14<h1>Mostrar archivos de la carpeta</h1>
15<form action="" method="post">
16 <p><b>Nombre de la carpeta: </b><input type="text" name="directorio" placeholder="tucarpeta/" /><small>Es necesario especificarla para mostrar el contenido del directorio</small></p>
17 <input type="submit" name="enviar2" />
18</form>
19<?php
20 /* Variables para el FTP */
21 $ftp_user = "tuusuario";
22    $ftp_pass = "tucontraseña";
23    $url = "tuhost.com/";
24
25    $ftp_server = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta". $ftp_user . ":" . $ftp_pass . "@" . $url;
26
27    /* Funcion para eliminar el archivo */
28    if(isset($_POST['enviar'])){
29    function delete($carpeta = null , $archivo){
30     global $ftp_user, $ftp_pass, $url, $ftp_server;
31  if($carpeta == null){
32   $carpeta = "public_html/";
33  }
34  $postfields[] = "CWD ". $carpeta;
35  $postfields[] = "DELE " . $archivo;
36
37  $ch = curl_init();
38  curl_setopt($ch, CURLOPT_URL, $ftp_server);
39  curl_setopt($ch, CURLOPT_POSTQUOTE, $postfields);
40  $result = curl_exec($ch);
41  if(curl_errno($ch)){
42   echo curl_error($ch);
43  }
44  curl_close($ch);
45
46  print $result;
47 }
48    $carpeta = $_POST['carpeta'];
49    $archivo = $_POST['archivo'];
50    delete($carpeta,$archivo);
51
52 }
53 /* Listar directorio */
54 if(isset($_POST['enviar2'])){
55  function listar_dir($directorio){
56   global $ftp_user, $ftp_pass;
57   $url = "tuhost.com/".$directorio;
58   $ftp_server = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta". $ftp_user . ":" . $ftp_pass . "@" . $url;
59   $ch = curl_init();
60   curl_setopt($ch, CURLOPT_URL, $ftp_server);
61   curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
62   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
63   $output = curl_exec($ch);
64   if(curl_errno($ch)){
65     echo curl_error($ch);
66    }
67   curl_close($ch);
68   $files = explode("\n", $output);
69   print_r($files);
70  }
71  $directorio = $_POST['directorio'];
72  listar_dir($directorio);
73 }
74?>
75</body>
76</html>
CURLOPT_POSTQUOTE - Un array de comandos FTP a ejecutar en el servidor despues de que se realice la peticion FTP.

CURLOPT_FTPLISTONLY - TRUE para solo listar nombres de un directorio FTP.


  Opciones LibcURL Podemos ver una lista de opciones sobre la libreria cURL en: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

  Rastrear peticiones Rastrear las peticiones o ver sus cabeceras, es una manera de saber si estamos haciendo bien algo en cURL, existen muchas herramientas las cuales podemos utilizar como intermediario para poder ver las peticiones, como vimos arriba usabamos HTTP FOX.
Y como comentabamos esta disponible tambien Burp Suite, Live HTTP Headers, Tamper Data, etc.


Hasta aqui la parte de este tutorial, nos vemos en la proxima parte que espero sea la ultima :).
 
Pentest - Hacking & Security Services

Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

 [Parte 5] CURL en PHP



    Funciones interesantes  curl_multi_init    Una de las extensiones mas usadas en PHP es cURL, y es genial para devolver documentos remotos. Para situaciones donde necesitas devolver multiples documentos se usa curl_multi_init y curl_multi_exec trabajan mejor con multiples documentos.    La funcion curl_multi_exec es muy poderosa, pero en la documentacion de PHP la hacen ver mas dificil de lo que realmente es. Aqui una demostracion usando Google, Bing y Facebook todos devueltos:   
1$urls = array('No tienes permitido ver los links. Registrarse o Entrar a mi cuenta', 'No tienes permitido ver los links. Registrarse o Entrar a mi cuenta', 'No tienes permitido ver los links. Registrarse o Entrar a mi cuenta');
2$url_count = count($urls); // cuenta el numero de urls
3
4$curl_array = array(); // creamos un array llamado curl_array
5$ch = curl_multi_init(); // iniciamos un multirecurso curl
6// para las urls hay una clave que contiene su url
7foreach($urls as $count => $url) {
1$curl_array[$count] = curl_init($url); // establecemos la url en una sesion curl refiriendonos a cada 1 con su clave
2 curl_setopt($curl_array[$count], CURLOPT_FOLLOWLOCATION, 1); // le damos una opcion de seguir el header location
3 curl_setopt($curl_array[$count], CURLOPT_RETURNTRANSFER, 1); // devolvemos el contenido
4 curl_multi_add_handle($ch, $curl_array[$count]); // añadimos a cada url con sus opciones en el multirecurso
5}
6// mientras se esten ejecutando las urls realiza lo siguiente
7do {
8 curl_multi_exec($ch, $exec);
9} while($exec > 0);
En este ejemplo hay 3 urls establecidas para devolverse al mismo tiempo.
 
  curl_multi_getcontent Para leer el contenido de las peticiones que hicimos anteriormente podriamos usar la funcion curl_multi_getcontent. Vamos a ver como podemos hacerlo... (el codigo siguiente se puede añadir al anterior):
 
1//para cada url devolvemos el contenido junto con la url
1foreach($urls as $count => $url) {
2 $returned = curl_multi_getcontent($curl_array[$count]);
3 echo "$url - $returned";
4}
  Cerrar el manejador de cURL
Algunos programadores prefieren usar curl_close() despues de haberlo usado. Usted en lugar de utilizar curl_close() deberia utilizar curl_multi_close(), y curl_multi_remove_handle() despues de que el contenido se haya devuelto. Veamos un ejemplo:
   
1//para cada url eliminamos el manejador, cerramos la peticion multi recurso y cada peticion de una sesion curl la cerramos
1foreach($urls as $count => $url) {
2 curl_multi_remove_handle($ch, $curl_array[$count]);
3}
4
5curl_multi_close($ch);
6
7foreach($urls as $count => $url) {
8 curl_close($curl_array[$count]);
9}
Como anteriormente dijimos el codigo anterior puede añadirse a lo que habiamos puesto antes... de esta manera todo el codigo quedaria asi:
 
01<?php
02$urls = array('No tienes permitido ver los links. Registrarse o Entrar a mi cuenta', 'No tienes permitido ver los links. Registrarse o Entrar a mi cuenta', 'No tienes permitido ver los links. Registrarse o Entrar a mi cuenta');
03$url_count = count($urls);
04
05$curl_array = array();
06$ch = curl_multi_init();
07
08foreach($urls as $count => $url) {
09 $curl_array[$count] = curl_init($url);
10 curl_setopt($curl_array[$count], CURLOPT_FOLLOWLOCATION, 1);
11 curl_setopt($curl_array[$count], CURLOPT_RETURNTRANSFER, 1);
12 curl_multi_add_handle($ch, $curl_array[$count]);
13}
14
15do {
16 curl_multi_exec($ch, $exec);
17} while($exec > 0);
18foreach($urls as $count => $url) {
19 $returned = curl_multi_getcontent($curl_array[$count]);
20 echo "$url - $returned";
21}
22foreach($urls as $count => $url) {
23 curl_multi_remove_handle($ch, $curl_array[$count]);
24}
25
26curl_multi_close($ch);
27
28foreach($urls as $count => $url) {
29 curl_close($curl_array[$count]);
30}
31?>
Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
   
  curl_setopt_array()  Con esta funcion podemos configurar multiples opciones para una transferencia cURL. Veamos un ejemplo:
   
01<?php
02 // creamos un nuevo recurso curl
03 $ch = curl_init();
04 // establecemos las opciones apropiadas para la url
05 $options = array(
06  CURLOPT_URL => 'No tienes permitido ver los links. Registrarse o Entrar a mi cuenta',
07  CURLOPT_FOLLOWLOCATION => true,
08  CURLOPT_USERAGENT => 'Googlebot/2.1 (+No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)',
09  CURLOPT_RETURNTRANSFER => true
10  );
11 curl_setopt_array($ch, $options);
12 $output = curl_exec($ch);
13 curl_close($ch);
14 echo $output;
15?>
  curl_getinfo()
Esta funcion obtiene informacion relativa a una transferencia especifica. Los valores que devuelve son los siguientes:
<blockquote> 
    • "url"
    • [/size]
    • "content_type"
    • [/size]
    • "http_code"
    • [/size]
    • "header_size"
    • [/size]
    • "request_size"
    • [/size]
    • "filetime"
    • [/size]
    • "ssl_verify_result"
    • [/size]
    • "redirect_count"
    • [/size]
    • "total_time"
    • [/size]
    • "namelookup_time"
    • [/size]
    • "connect_time"
    • [/size]
    • "pretransfer_time"
    • [/size]
    • "size_upload"
    • [/size]
    • "size_download"
    • [/size]
    • "speed_download"
    • [/size]
    • "speed_upload"
    • [/size]
    • "download_content_length"
    • [/size]
    • "upload_content_length"
    • [/size]
    • "starttransfer_time"
    • [/size]
    • "redirect_time"
    • [/size]
    • "certinfo"
    • [/size]
    • "request_header"
    • </blockquote> 
      No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
        curl_version() Obtiene la informacion de la version de cURL
       
      No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
        cURL File Como veíamos en la No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, subiamos un archivo con el uso de @, pero apartir de PHP 5.5.0 ese prefijo esta obsoleto, por lo que se recomienda utilizar esta funcion.
        CURLFile::__Construct--curl_file_create - Crea un objeto CURLFile
        Estilo orientado a objetos:
       
      <blockquote> [/size]public[/size] [/size]CURLFile::__construct[/size][/font][/size] ( [/size]string [/size][size=1rem]$filename[/size][/size][/font][/size] [, [/size]string [/size][size=1rem]$mimetype[/size][/size][/font][/size] [, [/size]string [/size][size=1rem]$postname[/size][/size][/font][/size] ]] )</blockquote>  Estilo orientado a procedimientos:
       
      <blockquote> [/size]No tienes permitido ver los links. Registrarse o Entrar a mi cuenta[/size] [/size]curl_file_create[/size][/font][/size] ( [/size]string [/size][size=1rem]$filename[/size][/size][/font][/size] [, [/size]string [/size][size=1rem]$mimetype[/size][/size][/font][/size] [, [/size]string [/size][size=1rem]$postname[/size][/size][/font][/size] ]] )</blockquote>
      Crea un objeto CurlFile, utilizado para transferir (upload) un fichero con CURLOPT_POSTFIELDS.
        filename - indica la ruta de acceso al fichero a ser transferido
      mimetype - Tipo mime del fichero
      postname - nombre del fichero
        Ejemplo, estilo orientado a objetos:
         
      01<?php
      02/* No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
      03<?php var_dump($_FILES); ?>
      04*/
      05
      06// Crea un gestor cURL
      07$ch = curl_init('No tienes permitido ver los links. Registrarse o Entrar a mi cuenta');
      08
      09// Crea un objeto CURLFile
      10$cfile = new CURLFile('cats.jpg','image/jpeg','test_name');
      11
      12// Asigna los datos POST
      13$data = array('test_file' => $cfile);
      14curl_setopt($ch, CURLOPT_POST,1);
      15curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      16
      17// Ejecuta el gestor
      18curl_exec($ch);
      19?>
      Estilo por procedimientos:
         
      01<?php
      02/* No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
      03<?php var_dump($_FILES); ?>
      04*/
      05
      06// Crea un gestor cURL
      07$ch = curl_init('No tienes permitido ver los links. Registrarse o Entrar a mi cuenta');
      08
      09// Crea un objeto CURLFile
      10$cfile = curl_file_create('cats.jpg','image/jpeg','test_name');
      11
      12// Asigna los datos POST
      13$data = array('test_file' => $cfile);
      14curl_setopt($ch, CURLOPT_POST,1);
      15curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      16
      17// Ejecuta el gestor
      18curl_exec($ch);
      19?>
        Usar cURL con Expresiones regulares Como en ejemplos anteriores usabamos la funcion preg_match y preg_match_all para ver si se encontraba determinado texto o link para poder mostrar el resultado que necesitabamos, para mas informacion sobre expresiones regulares por favor consulte:
      No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
        Como en el ejemplo de subidas de archivos en la No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, veíamos un upload con el cual sacábamos los links usando expresiones regulares:
         
      01<?php
      02   set_time_limit(0);
      03   $url = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
      04   $user_agent = "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0";
      05   $referer = "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta";
      06   $directory=dirname(__FILE__).'\files/';
      07   if(isset($_FILES['f1'])){
      08      move_uploaded_file($_FILES['f1']['tmp_name'],"files/".$_FILES['f1']['name']);
      09      $ch = curl_init();
      10      curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
      11      curl_setopt($ch, CURLOPT_REFERER, $referer);
      12      curl_setopt($ch, CURLOPT_URL, $url);
      13      curl_setopt($ch, CURLOPT_POSTFIELDS, array("F1"=>"@".$directory.$_FILES['f1']['name']));
      14      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      15      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
      16      $result = curl_exec($ch);
      17      if(curl_errno($ch))
      18  {
      19      echo 'Curl error: ' . curl_error($ch);
      20  }
      21      curl_close($ch);
      22      unlink($directory.$_FILES['f1']['name']);
      23      //echo $result;
      24      preg_match_all('/<input type="text" name="t1" size="90" class="inp" value="(.*?)" onclick="highlight\(this\);" \/>/', $result, $matches);
      25      //echo '<p><img src="'.$matches[1][0].'" alt="img" /></p>';
      26      echo '<p><b>Link: <a href="'.$matches[1][0].'" target="_blank">Archive Link</a></p>';
      27      //print_r($matches);
      28   }else{
      29      echo '
      30         <form action="upload_curl.php" method="post" enctype="multipart/form-data">
      31            <label for="f1">Filename:</label>
      32            <input type="file" name="f1" id="f1">
      33
      34            <input type="submit" name="submit" value="Submit">
      35         </form>
      36
      37      ';   
      38   }
      39?>
       
    [/list]
    Pentest - Hacking & Security Services

    Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Un tutorial muy completo y muy bien explicado, gracias arthusu :)