![]() |
CSRF на JSON API: от разведки до эксплуатации. Практический кейс
https://forum.antichat.xyz/attachmen...23b4c6740f.png Цитата:
Вавилен был доволен своим рабочем местом в конторе. Он приносил деньги себе и своему начальству, которое давало для этого всю инфраструктуру. Но в один прекрасный день боссы, в очередной раз срубив куш на труде Вавилена, решили с ним не делиться. Так они потеряли ценного сотрудника и получили в ответ обманутого и очень мотивированного человека, жаждущего возмездия. Постановка цели После ухода из конторы все доступы к инфраструктуре, разумеется, были отозваны. Но это не проблема. Основные активы бизнеса крутятся в кастомном веб-приложении для обработки данных. Компрометация этого приложения — ключ ко всей нужной информации. В истории браузера, к счастью, остался IP-адрес сервера. С него и начнём. Изучение цели Чтобы не шуметь и не светить свой IP на боевом сервере, было принято очевидное решение — развернуть аналогичный софт у себя в лаборатории. ПО распространяется по подписке, но есть семидневный триал с предоставлением VPS. Идеально для наших тестов. Регистрируюсь через 10-минутную почту, разворачиваю софт, активирую триал. Можно приступать к вскрытию. Первое, что нас встречает — стандартная форма логина. https://forum.antichat.xyz/attachmen...00cf84fdc3.png Смотрю, как устроен механизм аутентификации. При попытке входа улетает Код:
POSTКод:
application/jsonЧто там в JWT? После успешного входа сервер в ответ ставит cookie с JWT: Код:
content=AA.BBB.CКод:
jwt.iohttps://forum.antichat.xyz/attachmen...64e8a3a2b5.png И тут первый "красный флаг". Внутри токена, в открытом виде (просто закодированном в Base64), лежат поля Код:
loginКод:
passwordВажно понимать: JWT по умолчанию не шифруется, а подписывается. Это как паспорт: любой может прочитать ваши данные, но подделать печать (цифровую подпись) без секретного ключа, который есть только у сервера, невозможно. Так что идея подделать токен "в лоб", не зная секрета, отпадает сразу. Но сам факт такой архитектуры уже говорит о многом. Прощупываем очевидные векторы
XSS и CSRF Проверяю на XSS. В дашборде отображаются разные данные, приходящие в Код:
GETА что насчёт CSRF (Cross-Site Request Forgery)? По мне так крайне скучная уязвимость, до боли банальная. Но именно на таких банальностях часто и прокалываются. Идея проста: заставить залогиненного пользователя перейти по нашей ссылке, и его браузер сам, от его имени, выполнит нужное нам действие. Смотрю на критически важное действие — создание нового администратора. И что я вижу? А точнее, чего я не вижу? Никакой защиты от CSRF. Ни случайного токена, ни проверки заголовков. Ничего. Запрос на создание админа выглядит так: Код:
POST /admin/?object=account.createКод:
application/jsonhttps://forum.antichat.xyz/attachmen...118f9d7840.png Тут и кроется главная загвоздка. Обычная HTML-форма не может отправить запрос с Код:
Content-Type: application/jsonHTML: Код:
Доставка Эксплойт готов и протестирован в лабе. Осталось доставить его жертве. Подозрительные ссылки никто открывать не будет. Поэтому покупаем домен, созвучный с рабочей тематикой конторы, накидываем простенький сайт-визитку, внедряем наш скрипт. Дальше — дело техники. Составляем деловое предложение, отправляем на корпоративную почту и делимся ссылкой на наш "рабочий" сайт. Администратор кликает, переходит на сайт... и в этот момент на заднем фоне без его ведома срабатывает наш скрипт. Его браузер, сохранивший легитимную сессию, отправляет запрос на создание нового админа с логином Код:
hacked_adminКак защититься? В первую очередь, разработчики могли бы этого избежать, если бы просто знали о существовании таких атак. Продукт на рынке с десятых годов... могли бы и заказать аудит приложения Но если серьезно, вот конкретные шаги для защиты от подобной CSRF-атаки на JSON API:
|
Цитата:
Цитата:
Зачем нужно ломать роутер, если можно установить Wireshark или написать собственный сниффер? Да, и что можно было найти в своём трафике, если требуются кукисы или учетка админа? Цитата:
Поднять tor, proxychains и написать банальный bash script, отправляющий по 5 запросов и меняющий IP не составит большого труда. Как минимум можно было поставить такое задание в фон Цитата:
Цитата:
Цитата:
Да и кавычки должны быть парными... такой запрос, похоже, кроме ошибки ничего не создаст Цитата:
Цитата:
Цитата:
|
Привет!
У нас есть: реальная цель, где пользователь сидит за свои пк и отправляет запросы на VPS, а так же лабаратория, где можно затестить софт. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Привет!)
Цитата:
Цитата:
Это просто какая-то машина, на которой может работать пользователь? Или речь идёт о поднятом VPN на VPS? Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вот только почему же у вас в Burp'e тогда запрос не битый? Как вы смогли догадаться, что он сработал? Вы этот момент опишите А если этот ваш запрос сработал, зачем нужно было атаковать пользователя, у вас же уже есть админка? |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вы можете протестировать мой PoC, увидеть что генерируется правильный запрос. Обратите внимание на закрытие скобки Код:
Да я видел, как и вы гору однообразных CSRF PoC. Но я вас уверяю, попробовав своими руками вы убедитесь, что например там прилетает откуда не возьмись символ равно, и PoC не работает. Я вам предлагаею рабочий варинт, который подтверждает мою находку. Ей богу как при сдаче на hackerOne нахожусь https://forum.antichat.xyz/attachmen...7530367284.png Цитата:
У меня есть админка в моей тестовой лаборатории, а настоящая цель использует свою личную инфраструктуру. |
| Время: 18:34 |