Soft – Урок по cURL: основы использования и пара полезных трюков (часть первая) | Форум информационной безопасности –

Soft – урок по curl: основы использования и пара полезных трюков (часть первая)

Для чего нужна cURL

  • cURL отлично подходит для имитации действий пользователя в браузере.

Реальный практический пример: вам нужно перезагрузить роутер (модем) для смены IP адреса. Для этого нужно: авторизоваться в роутере, перейти к странице обслуживания и нажать кнопку «Перезагрузка». Если это действие нужно выполнить несколько раз, то процедуру нужно повторить. Согласитесь, делать каждый раз в ручную эту рутину не хочется. cURL позволяет автоматизировать всё это. Буквально несколькими командами cURL можно добиться авторизации и выполнения задания на роутере.

  • cURL удобен для получения данных с веб-сайтов в командной строке.

Ещё один практический пример: мы хотим реализовать показ общей статистики для нескольких сайтов. Если использовать cURL, то это становится вполне тривиальной задачей: с помощью cURL мы проходим аутентификацию на сервисе сбора статистики (если это требуется), затем (опять же командами cURL) получаем необходимые страницы, парсим нужные нам данные; процедура повторяется для всех наших сайтов, затем мы складываем и выводим конечный результат.

Т.е. случаи использования cURL вполне реальные, хотя, в большинстве, cURL нужна программистам, которые используют её для своих программ.

cURL поддерживает множество протоколов и способов авторизации, умеет передавать файлы, правильно работает с кукиз, поддерживает SSL сертификаты, прокси и очень многое другое.

cURL в PHP и командной строке

Мы можем использовать cURL двумя основными способами: в скриптах PHP и в командной строке.

Чтобы включить cURL в PHP на сервере, необходимо в файле php.ini раскомментировать строку

А затем перезагрузить сервер.

На Linux необходимо установить пакет curl.

На Debian, Ubuntu или Linux Mint:

На Fedora, CentOS или RHEL:

Чтобы наглядно было видно разницу в использовании в PHP и в командной строке, будем одни и те же задачи выполнять дважды: сначала в скрипте PHP, а затем в командной строке. Постараемся при этом не запутаться.

Получение данных при помощи cURL
Получение данных при помощи cURL в PHP

Пример на PHP:

Всё очень просто:

$target_url

— адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).

curl_init

— инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной

$ch

.

Затем мы выполняем запрос cURL функцией

curl_exec

, которой в качестве параметра передаётся дискриптор.

Всё очень логично, но при выполнении этого скрипта, на нашей странице отобразиться содержимое сайта. А что если мы не хотим отображать содержимое, а хотим записать его в переменную (для последующей обработки или парсинга).

Чуть дополним наш скрипт:

У нас появилась строчка

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

.

curl_setopt

— задаёт опции. Полный список опций можно найти на этой странице:

http://php.net/manual/ru/function.curl-setopt.php
$response_data = curl_exec($ch);

Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое.

Строчки

служат для отладки, на случай возникновения ошибок.

Получение данных при помощи cURL в командной строке

В командной строке достаточно набрать

где вместо

mi-al.ru

— адрес вашего сайта.

Если нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так:

При этом всё равно выводятся некие данные:

Чтобы они не выводились, добавляем ключ

-s

:

Можно посмотреть, что записалось:

Базовая аутентификация и аутентификация HTTP

Аутентификация, проще говоря, это введение имени пользователя и пароля.

Базовая аутентификация — это аутентификация средствами сервера. Для этого создаются два файла:

.htaccess

и

.htpasswd

Содержимое файла .htaccess примерно такое

Содержимое файла .htpasswd примерно такое:

Т.е. логин и хэш пароля.

При попытке получить доступ к запароленной папке, в браузере отобразиться примерно такое окно:

HTTP аутентификация — это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д.

Базовая аутентификация cURL (PHP)

Есть сайт

http://62.113.208.29/Update_FED_DAYS/

, который требует от нас авторизоваться:

Пробуем наш первоначальный скрипт:

Хотя скрипт и считает, что ошибки нет, но выводимый результат нам совсем не нравится:

Добавляем две строки:

Первой строкой мы задаём тип аутентификации — базовая. Вторая строка содержит имя и пароль через двоеточие (в нашем случае имя и пароль одинаковые — ru-board). Получилось так:

Я не забыл указать тип аутентификации, просто в cURL базовый тип аутентификации является дефолтным.

В командной строке всё получилось так быстро, что от расстройства я написал вот такую программу. Она подключается к сайту и скачивает самое последнее обновление:

Буквально ещё несколькими командами можно добавить:

  • распаковку архива в указанный каталог;
  • запуск обновлений КонсультантПлюс (это обновления для него);
  • можно реализовать проверку — было ли уже скачено последнее доступное обновление или появилось новое;
  • добавить это всё в Cron для ежедневных обновлений.

HTTP аутентификация cURL
HTTP аутентификация cURL в PHP

Нам нужно знать:

Иногда этих данных оказывается недостаточно. Давайте разберёмся.

Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например:

Мы смотрим на свойство

action

. Т.е. конечной страницей является

login.php

. Нам нужен полный адрес, например такой

http://188.35.8.64:8080/login.php

Здесь же мы находим и метод отправки:

method=”post”

Логин и пароль я тоже знаю: admin и qwerasdfzxcv

Т.е. на сервер из формы передаётся строка

LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv

методом POST. Теоретически, наш предыдущий скрипт, в которое мы добавили новую строчку, должен работать. Т.е. должна происходить аутентификация.

В скрипте новая строка

curl_setopt($ch, CURLOPT_POSTFIELDS, ‘LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv’);

Здесь

curl_setopt

— уже знакомая нам функция по установлению опций для cURL,

CURLOPT_POSTFIELDS

— эта имя опции, которую мы устанавливаем.

CURLOPT_POSTFIELDS

содержит все данные, которые передаются методом POST. Ну и сама строчка

LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv

— это те самые данные, которые мы передаём.

Если внимательно изучить форму, то можно увидеть, что она содержит также и скрытые поля. А ещё данные могут обрабатываться или дополняться JavaScript’ами. Можно заняться изучением всего этого, но я предпочитаю более простой способ.

Я использую Wireshark. Эта программа предназначена для снифинга (перехвата) трафика. И именно в ней очень удобно смотреть, что же именно передаётся на сайт.

Посмотрите это крошечное видео:

Т.е. с адресом, куда передаются данные, я угадал. А вот передаваемая строка оказалась намного сложнее.

Я вписал верный параметр, а также чуть доработал скрипт, чтобы он не просто авторизовался, но и кое-что получал из роутера:

PHP:

<?php
        $target_url = "http://188.35.8.64:8080/login.php";
        $ch = curl_init($target_url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 'ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log In &VER_CODE=');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $response_data = curl_exec($ch);
        if (curl_errno($ch) > 0) {
            echo 'Ошибка curl: ' . curl_error($ch);
        } else {
            $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php";
            $ch2 = curl_init($target_url2);
            curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
            $response_data2 = curl_exec($ch2);
            preg_match('|f.ssid.value = "(.*)";|', $response_data2, $results2);
            $results2[0] = str_replace('f.ssid.value = "', '', $results2[0]);
            $results2[0] = str_replace('";', '', $results2[0]);
            echo "Имя wi-fi сети: <b>$results2[0]</b><br />";
            preg_match('|f_wpa.wpapsk1.value(.*)";|', $response_data2, $results3);
            $results3[0] = str_replace('f_wpa.wpapsk1.value', '', $results3[0]);
            $results3[0] = str_replace('="', '', $results3[0]);
            $results3[0] = str_replace('";', '', $results3[0]);
            echo "Пароль wi-fi сети: <b>$results3[0]</b>";
        }
        curl_close($ch);
        ?>

Кстати, если владелец обновит пароль (но не обновит прошивку), то новый пароль всегда можно посмотреть по адресу http://188.35.8.64:8080/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd

(Это общеизвестная уязвимость роутеров D-Link DIR-300, D-Link DIR-320, и D-Link DAP-1353).

HTTP аутентификация cURL в командной строке

Полный адрес, а также строку, которую нужно передать, мы уже знаем. Поэтому всё просто:

Думаю, всё и так понятно, т. к. эти сроки мы уже рассмотрели. Если кому-то непонятно — спрашивайте в комментариях.

Примером использования cURL для получения и парсинга данных может стать следующий набор команд:

Сложные случаи авторизации: AJAX, JQuery, JavaScript и т.п.

Данные заголовок правильнее было бы написать так: «Сложные» случаи авторизации. Т.е. слово «сложные» взять в кавычки. Сложными они видятся только на первый взгляд, когда непонятно: куда происходит отправка, какие имена полей, что именно отправляется и т. д.

Но, на самом деле, все они сводятся к методам POST или GET. Чтобы понять, что именно отправляется, можно сохранить страницу с формой себе на диск и на кнопку отправки повесить функцию показа сформированных для отправки данных. Или ещё проще — как я, Wireshark’ом.

Если данные правильные, а аутентификация не происходит, то нужно копать в следующих направлениях:

  • задать верную строку реферера
  • задать «правильную» строку пользовательского агента.

Всё это можно сделать базовыми методами cURL, но я не буду на этом останавливаться. Урок получился и без того большим, а ведь я ещё хотел показать пару трюков с cURL.

Типсы и триксы cURL
cURL и получение кукиз помимо CURLOPT_COOKIEJAR

Думаю, уже стало понятно, что cURL правильно обрабатывает куки — сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк.

Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы:

1) Не используем CURLOPT_FOLLOWLOCATION

2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)

3) Собираем кукизы из заголовка header примерно так:

4) Задаём их используя curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Второй совет. Из атакующих мы можем превратиться в жертву. Чтобы не стать жертвой атаки человек-по-середине, делаем так.

Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер:

http://curl.haxx.se/docs/caextract.html

Затем задайте путь в вашем файле php.ini file, например, на Windows:

Отключение CURLOPT_SSL_VERIFYPEER позволяет осуществить атаку человек-по-середине (MITM), а это нам не надо!

Ну и последняя на сегодня подсказка. Знаете ли вы, что возможно большое количество асинхронных запросов curl?

Для этого можно использовать

curl_multi_init

. Подробности и пример кода в официальной документации

http://php.net/manual/ru/function.curl-multi-init.php
Что ещё почитать про cURL

О cURL в PHP я бы рекомендовал официальную документацию — написано просто и много примеров.

http://php.net/manual/ru/ref.curl.php

Про cURL в командной строке

или

http://curl.haxx.se/docs/manual.html
Для чтения на русском языке также подготовлена вторая часть урока cURL: “Примеры команд cURL“.

RSERSH
13.03.2022 в 18:41

И всё-же, до меня что-то не доходит, зачем испльзовать именно php? Может дело втом, что я этот язык не знаю))? По этой причине, не совсем всё понимаю. Например: скриншот сделанный при неудачной попытке авторизации, сделан в браузере, но почему ошибка выводится в браузере, а не в консоли или ещё где-то? Я лично пытался всё через терминал сделать, которую хоть как-то знаю в отличие от php, в итоге ничерта не получилось. Может в этом проблема или это можно сделать и средствами терминала линукса, если да, то подскажите как?

Пытаюсьпримитивного бота собратьдля вк, но пока застрял на этом

cd Desktop;

curl -A “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30”

https://vk.com

-o test.txt Не я не прошу за меня всё делать, просто пните в направлении, в котором нужно двигаться.

Авторизация с помощью curl

Всем привет!

Пытаюсь произвести авторизацию на сайте https://monitor.masterfolio.ru/auth/login в два шага: 1) получение исходного кода, 2) Вход на сайт :

$url = "https://monitor.masterfolio.ru/auth/login";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$c = curl_exec($ch);

$c = mb_substr($c, mb_strpos($c,'login_csrf'), 70);
$c = mb_substr($c, mb_strpos($c,"=") 2);
$c = mb_substr($c, 0, mb_strpos($c,'"'));

curl_setopt($ch, CURLOPT_COOKIEJAR,  'http://site.loc/wordpress/cookie.txt'); // сохранять куки в файл 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'http://site.loc/wordpress/cookie.txt');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "[email protected]&password=test123&remember=1&login_csrf=".$c."&submit=1&formid=login");

$c = curl_exec($ch);
curl_close($ch);
echo $c;

Проблема вся в том, что в форме отправки запроса присутствует некое скрытое поле с динамическим хэшем, которое и мешает произвести отправку формы… Помогите мне, пожалуйста)

Авторизация с помощью curl в php | блог о веб-разработке vhod-v-lichnyj-kabinet.ru

php-authНемало полезных возможностей дает расширение cURL, которые можно использовать для реализации различных сетевых инструментов и не только. Сегодня cURL используют все по разному, для добрых и не очень дел. Всё дело в его удобстве, и возможности использования его в различных ситуациях, где нужно каким-либо образом отправлять и получать данные удаленно, без ручного участия пользователя. Рассмотрим простой пример, как можно сделать авторизацию на сайте.

Изначально, перед тем как что-то программировать нам нужно кое-что уточнить.
1. Узнать ссылку к скрипту авторизации, который будет отвечать на запросы.
2. Узнать имена полей, отправляемые скрипту, традиционно это поля логина и пароля.
3. Ваш рабочий логин, и пароль.

Затем приступаем к примеру:

// URL скрипта авторизации
$login_url = 'http://exampe.com/login.php';
 
// параметры для отправки запроса - логин и пароль
$post_data = 'login=ваш_логин&password=ваш_пароль';
 
// создание объекта curl
$ch = curl_init();
 
// используем User Agent браузера
$agent = $_SERVER["HTTP_USER_AGENT"];
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
 
// задаем URL
curl_setopt($ch, CURLOPT_URL, $login_url );
 
// указываем что это POST запрос
curl_setopt($ch, CURLOPT_POST, 1 );
 
// задаем параметры запроса
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
 
// указываем, чтобы нам вернулось содержимое после запроса
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
// в случае необходимости, следовать по перенаправлени¤м
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 
/*
	Задаем параметры сохранени¤ cookie
	как правило Cookie необходимы для дальнейшей работы с авторизацией
*/
 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
 
// выполняем запрос для авторизации
$postResult = curl_exec($ch);

После выполнения функции curl_exec будет выполнен запрос с параметрами авторизации, содержимое страницы ответа будет находиться в переменной $postResult.
Опция CURLOPT_COOKIEFILE указывает файл, в котором будут храниться данные cookies полученные после успешного выполнения запроса авторизации. Так же следует убедиться в наличии прав PHP для создания и записи файла.

Все последующие запросы после успешной авторизации могут выполняться с помощью этих функций:

curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);

Кстати, для отладки удобно использовать консоль браузера, в Firefox и Chrome для открытия служит клавиша F12. Открыв вкладку «сеть» можно просмотреть параметры, отправляемые на заданный URL и ответ сервера.

Загрузка файлов

— самый распространенный инструмент для загрузки файлов посредством командной строки. Он входит в комплект большинства диструбутивов Linux. Однако в OSX его нет.

Команда wget url аналогична команде curl -OL url. Опция -О — это опция –remote-name, которая говорит curl сохранить тело ответа в локальном файле. Опция -L говорит curl следовать перенаправлениям.

Как авторизоваться на сайте curl?

Хочу сделать парсинг с авторизацией. Сразу скажу, в скрипте стоит этот форум просто для примера, что бы не ставить дhугие сайты и т.д. Само собой логин и пароль указываю верные.

Суть в чем? вот скрипт, судя по уроку он должен авторизовать и сделать куки, что бы я как бы на вторую страницу заходил уже авторизованным, но вместо этого он дважды выводит страницу авторизации. Помогите исправить ошибку т.к я ее не вижу

header('Content-Type:text/html charset=utf-8');
    require_once('phpQuery-onefile.php');
    
    function get_content($url, $data = []){
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
        curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
        $res = curl_exec($ch);
        curl_close($ch);
        return $res;
    }
    
    $url_auth = 'http://www.cyberforum.ru/log-in.php';
    $url = 'http://www.cyberforum.ru/members/956598.html';
    $auth_data = [
        'vb_login_username' => 'почта',
        'vb_login_password' => 'пасс',
        'cookieuser' => 'on'
    ];
    $data = get_content($url_auth, $auth_data);
    $data1 = get_content($url);

x7P71CGLCSc.jpg

Как установить заголовок авторизации с помощью curl

см. раздел 6. Аутентификация HTTP

аутентификация HTTP

аутентификация HTTP-это возможность сообщить серверу свое имя пользователя и
пароль, чтобы он мог подтвердить, что вам разрешено выполнять запрос, который вы
делающий. Базовая аутентификация, используемая в HTTP (который является типом, используемым curl
по умолчанию)простыетекст, что означает, что он отправляет имя пользователя и пароль
только слегка запутанный, но все еще полностью читаемый любым, кто нюхает
сеть между вами и удаленным сервером.

чтобы сказать curl использовать пользователя и пароль для аутентификации:

curl --user name:password http://www.example.com

сайту может потребоваться другой метод аутентификации (проверьте заголовки
возвращается сервером), а затем –ntlm, –digest, –negotiate или даже
— anyauth может быть варианты, которые подходят вам.

Иногда ваш HTTP-доступ доступен только через использование HTTP
полномочие. Это, по-видимому, особенно распространено в различных компаниях. Прокси HTTP
может потребоваться собственный пользователь и пароль, чтобы позволить клиенту
интернет. Чтобы указать те, с завитком, запустите что-то вроде:

curl --proxy-user proxyuser:proxypassword curl.haxx.se

Если прокси-сервер требует проверки подлинности с помощью метода NTLM,
используйте –proxy-ntlm, если это требует использования дайджеста –proxy-digest.

Если вы используете любой из этих параметров user password, но оставляете пароль
часть, curl запросит пароль в интерактивном режиме.

обратите внимание, что при запуске программы ее параметры могут быть видны
при перечислении запущенных процессов системы. Таким образом, другие пользователи могут быть
возможность просмотра паролей, Если вы передаете их как обычную командную строку
опции. Есть способы обойти это.

стоит отметить, что пока это так HTTP Аутентификация работает, очень
многие веб-сайты не будут использовать эту концепцию, когда они дают логины и т. д. Видеть
более подробная информация об этом приведена ниже в разделе веб-входа.

Отправка post-запроса, содержащего json

Флаг

-X

говорит curl, какой метод следует использовать: PUT, POST и т.д. По-умолчанию curl использует метод GET, поэтому писать

curl -X GET

не нужно.

Флаг -X часто используется совместно с флагом -d, позволяющим добавить тело запроса. В следующем примере показано как отправить POST-запрос, содержащий некоторый json:

Отправка put-запроса, содержащего json-файл

Флаг

-d

также поддерживает отправку данных из локальных файлов.

Например, представим, что у нас есть файл data.js, содержащий такие данные:

Отправка авторизованного запроса

Заголовок авторизации используется для включения в запрос данных для авторизации при обращении к RESTful API. Для добавления указанных данных необходимо использовать флаг

-H

. Например, если ваш ключ интерфейса (API key)

my-secret-token

Заключение

Резюмируя, вот опции curl, которые я нахожу самыми полезными:

Curl — полезный инструмент взаимодействия с API посредством командной строки, независимо от того, сторонний это API или API, который вы разрабатываете. Для быстрого тестирования curl подходит лучше, чем Axios в Node.js или настройка запроса в Postman, если вы знакомы с их синтаксисом.

Благодарю за потраченное время. Надеюсь, оно было потрачено не зря.

Похожее:  Как сделать редирект на страницу каталога после авторизации пользователя? — Хабр Q&A

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *