Самый сочный веб-апп. Громим OWASP Juice Shop — полигон для атак на веб-приложения
Life-Hack [Жизнь-Взлом]/ХакингBug bounty, то есть поиск уязвимостей ради получения награды, становится все более попу
лярным. Перед начинающим багхантером часто стоит задача потренироваться на живом примере, но при этом ничего не сломать и не нарушить закон. В этом тебе поможет эта статья и прекрасный, но очень уязвимый интернет‑магазин соков Juice Shop, созданный в OWASP.
Ты наверняка слышал об OWASP (Open Web Application Security Project). Это открытый некоммерческий фонд, который занимается вопросами обеспечения безопасности веб‑приложений. Кроме крайне популярного OWASP Top 10, там разработали и постоянно развивают очень интересный проект Juice Shop, призванный продемонстрировать самые часто встречаемые уязвимости в приложениях и «худшие практики» веб‑разработки. Этот магазинчик — идеальный полигон для тренировки и изучения пентеста реальных приложений. В этой статье я покажу, как ставить, запускать и искать свои первые уязвимости.
УСТАНОВКА И ЗАПУСК
Juice Shop поддерживает разные варианты установки, но я рекомендую использовать локальный вариант с Node.js. В версии Docker доступны не все возможные уязвимости, кроме того, неплохо научиться ставить Node.js без рута и узнать, как использовать одновременно несколько разных версий.
Установка Node.js
Juice Shop поддерживает разные стабильные релизы Node.js. На момент написания статьи последней LTS (Long Term Support) Node.js была 14 версия, ее‑то мы и будем ставить. Чтобы не захламлять свою ОС пакетами и иметь возможность использовать разные релизы, был придуман Node Version Manager. Он устанавливается в домашнюю папку и позволяет легко рулить версиями. Сейчас последняя версия — 0.38, но я всегда рекомендую сходить и проверить перед установкой. Установка выполняется одной командой в домашней папке.
$curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
Теперь тебе нужно открыть и закрыть терминал, чтобы внесенные скриптом изменения применились. Проверь установленную версию nvm и переходи непосредственно к установке Node.js.
$nvm -v
$nvm install --lts
Проверь версию установленной команды node и запомни ее.
$node --version
Если тебе понадобится несколько разных версий одновременно, просто установи нужные и выбирай актуальную по необходимости (эта часть уже не нужна для работы Juice Shop).
$nvm install <номер версии>
$nvm use <номер версии>
Установка Juice Shop
В гитхабе разработчиков всегда можно найти свежие релизы. Проект постоянно развивается, вносятся новые задания и исправляются ошибки, поэтому всегда бери самый свежий вариант! Но он должен быть совместимым с твоим Node.js. Если на предыдущем этапе ты установил Node.js 14, то тебе будет нужен juice-shop-xx.x.x_node14_linux_x64.tgz
. Скачай его и распакуй в удобную тебе папку.
$tar -xzf juice-shop-xx.x.x_node14_linux_x64.tgz
На этом установка завершена. Переходи в папку с Juice Shop и запускай его:
$npm start
Если все прошло успешно, ты увидишь сообщение «info: Server listening on port 3000». Открывай любимый браузер и переходи на http://localhost:3000. В правом верхнем углу есть выбор языка, я всегда рекомендую ставить английский, так ты не встретишься с проблемами перевода разных терминов и, возможно, выучишь пару новых словечек. Надеюсь, тебе нравятся соки и этот прекрасный дырявый пакет, так как они и Burp Suite станут твоими лучшими друзьями на множество увлекательных часов.
Настройка Burp Suite
Я буду использовать и показывать скриншоты Burp Suite Community, но ты можешь использовать любой удобный тебе инструмент. Поскольку грамотная настройка Burp и интеграция его с любимым браузером потянет на хорошую статью, я оставлю тебе это в качестве домашнего задания. Помни, если все статьи и советы в интернете кажутся тебе безнадежно устаревшими — официальная документация всегда к твоим услугам!
ОСНОВНЫЕ УЯЗВИМЫЕ МЕСТА
В своей предыдущей статье я уже упоминал о важности методики и системного подхода к пентесту. В случае с веб‑приложениями это вдвойне важно! В сети есть множество отличных чек‑листов вроде Pentesting Web Checklist. Если ты никогда не слышал о XSS, IDOR, CSRF, OAUTH — очень рекомендую тебе бесплатный курс разработчиков Burp Suite.
Теперь перейдем непосредственно к анализу нашего приложения. Я рекомендую сделать табличку с описанием доступных функций и необходимых уровней доступа. Она поможет тебе потом экспериментировать над приложением и отвечать на вопросы вроде «А что будет, если я отправлю админский запрос с правами гостя?»
![](https://sun9-65.userapi.com/impg/-tVurRARhP4f6Su2umiFJU8LZ4pwAY9O_0pINQ/g-AVTU-F-HY.jpg?size=800x973&quality=96&sign=b3ec1b9ccaeb2e3a68b86e7bd98de4c0&type=album)
Пройдись по всему приложению, понажимай все кнопки, посмотри товар. Теперь зарегистрируйся и попробуй пройти весь путь покупки товара от добавления его в корзину до доставки. Твоя задача — познакомиться с функциями приложения и подумать, где могут быть логические ошибки разработчиков или неучтенные моменты. Если вдруг закончились идеи, какие еще места магазина можно посетить, посмотри на Happy Path подробный гид, составленный разработчиками.
WARNING
Я очень надеюсь, что ты не использовал при тестировании этого приложения реальные номера банковских карт и адреса! Помни, оно полно дыр как в плане безопасности, так и в плане приватности. Если вдруг сделал это, просто удали папку с приложением и установи его снова.
На какие места и функции этого и других приложений я рекомендую обращать особое внимание:
- форма регистрации, входа и восстановления пароля;
- любые строки поиска и пользовательского ввода. Они все могут быть уязвимы к разным видам XSS. Это я еще продемонстрирую;
- все варианты фильтрации товара или выборки его по критериям. Это часто путь к SQL-инъекциям;
- работа с корзиной, списком заказов и доставкой. Там часто можно встретить очень плохой контроль доступа и подсмотреть чужие корзины и адреса;
- любые функции с возможностью злоупотреблений (возврат товара, платные подписки и так далее);
- админка и доступ к ней неавторизованных пользователей или выполнение админских функций без необходимых прав (но вначале надо в эту админку попасть).
Теперь самое время посмотреть на OWASP Top 10. Все десять категорий обязательно присутствуют в Juice Shop. Что самое интересное, в каждой из этих категорий подробно описаны варианты возникновения и методы защиты. Варианты можно использовать как чек‑лист для проверки вроде «А посмотрел ли я этот момент в приложении?» или, если ты разработчик, «А не допустил ли я такой же ошибки у себя?»
На этом скучная (но очень важная!) вводная часть заканчивается, и я перехожу к непосредственно демонстрации уязвимостей магазина.
ИЩЕМ ДОСКУ С ЗАДАНИЯМИ
Ты наверняка при первом запуске уже заметил пакет с соком, предлагающий решить очень простую задачу, а именно найти доску с заданиями и результатами, она же Score Board. У этой крайне простой задачи есть два варианта решения.
- Внимательно посмотри на адресную строку вида
/#/search
,/#/login
и так далее и подумай, а какой бы была строка для доступа к Score Board? Сразу скажу, этот вариант мне не очень нравится, поскольку нужно играть в угадайку, и не всегда успешно. Поэтому я предпочитаю вариант номер два. - Давай изучим исходный код сайта и посмотрим, нет ли там чего интересного. Я надеюсь, ты умеешь читать исходный код сайта в своем любимом браузере? В Firefox достаточно просто нажать F12.
![](https://sun9-39.userapi.com/impg/sroM7Z04YZAur4FTl3XQnUgp05Vfsa0LmGr8sg/A2IWD13RCR8.jpg?size=807x542&quality=96&sign=07c5bcde949be1a7faaa17173c1a4443&type=album)
Что сразу же бросается в глаза? Огромное количество подключаемых скриптов на JS! Нас с тобой будет интересовать скрипт main
. За что отвечают другие скрипты, ты можешь выяснить на досуге с помощью любимого поисковика.
Теперь переходи во вкладку Debugger и смотри на исходный код main
. Выглядит не очень, правда? Тут есть два пути: или пытаться восстановить код после минимизатора JS c помощью одного из множества сайтов‑деобфускаторов или просто выбрать в Firefox (кликнув по закладке с названием файла) Pretty print source и получить более читаемый исходный код. Для наших целей пока хватит и этого.
Код внушительный. Это плохо и хорошо одновременно. Обычно это говорит о том, что очень много логики сайта вынесли в клиентский JavaScript, а значит, ее можно будет легко обойти простым дебаггером. Найдем же наконец Score Board. Как эффективнее искать в исходниках, каждый решает сам, но в результате ты должен добраться до куска с уже знакомыми тебе маршрутами вроде /#/search
.
![](https://sun9-41.userapi.com/impg/qvV2dSi3F41X74SVrACimybJKichnLdpcszZiA/vFYKiFNJbBM.jpg?size=427x517&quality=96&sign=37fb5bea75a3e48723cdb8a84222cd0e&type=album)
Вбивай в адресную строку http://localhost:3000/#/score-board
и успешно выполняй первое задание. Кстати, теперь в левом меню появился соответствующий пункт и возможность быстро открывать доску.
![](https://sun9-81.userapi.com/impg/PJsF2icz1Wdc1IVnnCP_lJ1lbTeChmqezBA_1w/xGX59FHjNe0.jpg?size=807x292&quality=96&sign=f8106eda205896a5809650b08015a148&type=album)
INFO
На просторах интернета и в YouTube есть полные решения всех задач Juice Shop. Кроме того, ты всегда можешь почитать подробное объяснение почти каждого задания с решением в книге разработчиков, но я рекомендую смотреть решение только в самом крайнем случае. Более того, некоторые задачи можно решить совершенно разными методами.
В версии Juice Shop 12.7.0 появилась замечательная функция — теперь, нажав кнопку с треугольными скобками, можно увидеть исходный код уязвимого модуля и строку, в которой и происходит ошибка. Просто сравни исходный код до минимизации и тот, что ты увидел в браузере. Возможно, ты найдешь новые интересные маршруты, скрытые от тебя интерфейсом сайта.
Кстати, на скриншоте выше у меня уже выполнено два задания. Я просто задался вопросом, а что будет, если попробовать открыть маршрут /#/complain
, не регистрируясь на сайте? Ты же помнишь, что без входа в учетную запись его нет в левом меню? Попробуй открыть его как гость и отправить анонимную жалобу! Получил новую ачивку? Вот так делать не стоит и всегда нужно учитывать, что любой маршрут может быть открыт простым набором нужного адреса в адресной строке. О том, почему не стоит доверять совершенно ничему, пришедшему тебе по сети, я покажу чуть позже.
ОТКРЫВАЕМ АДМИНКУ
Прежде чем бросаться с головой выполнять задания, я рекомендую внимательно ознакомиться с содержимым доски. Все задания на ней разделены по уровню сложности от одной до шести звездочек. Деление достаточно условное. Например, нужно сообщить магазину об использовании «слабой» криптографии. Сама по себе задача решается простой отправкой в чат названия уязвимого алгоритма, вот только узнать и определить эти алгоритмы можно, выполняя задания более высокого уровня сложности. Поэтому не старайся выполнить все задания одного уровня сложности и лишь потом переходить к другому. Я рекомендую руководствоваться категориями (кстати, ты заметил их удивительную схожесть с OWASP Top 10?). Теги напротив каждого задания могут показать тебе верное направление поиска.
Некоторые задания имеют подсказку или туториал. Попробуй вначале обойтись без помощи. Однако некоторые задания настолько туманны, что есть смысл почитать более подробное описание в книге разработчиков. Вот, к примеру, категория «Разнообразное».
![](https://sun9-49.userapi.com/impg/ED8fRqteuME_oMWdVjpAqmTVCIy74Q231E5Dhg/A-jt7s1vgB8.jpg?size=807x409&quality=96&sign=d5fdf08cf20e879583de22a1f47dfa4e&type=album)
Теперь давай перейдем к поиску админки и попытаемся в нее попасть. Надеюсь, ты еще не забыл место, где мы нашли адрес Score Board? Там же можно обнаружить и адрес админки! Однако при попытке перейти по этому адресу нас встретит красный баннер с ошибкой 403... Самое время запустить Burp Suite и посмотреть на сетевой обмен.
![](https://sun9-78.userapi.com/impg/oQGmd85h7FCS25oWWTpRijPQSsgNPUVph-eceA/Xo-87xYnm9A.jpg?size=807x236&quality=96&sign=b7f2b7d7e79b57dd295410035a548394&type=album)
Удивительно, но ничего похожего на доступ к админке тут нет! Помнишь про огромный размер скрипта main
? Наверняка вся проверка доступа обрабатывается в нем. Время поработать с дебаггером. Проще всего найти нужное место в коде по ошибке доступа — 403.
![](https://sun9-57.userapi.com/impg/hkGRf9Li5d2r_n5lwN9i7HK0wQSM0Bpvv0GrXA/YvQzjRD_1lo.jpg?size=807x411&quality=96&sign=c0836e751ea5fdb9fd212cb65403e854&type=album)
Видишь первую и вторую функцию CanActivate()
? Если у нас нет токена или нам запрещен доступ, то мы получаем ошибку 403. Чтобы сократить количество скриншотов, сразу скажу — придется зарегистрироваться. У незарегистрированных пользователей токена доступа нет. Так что самое время войти под созданным ранее пользователем или создать нового.
Теперь давай попробуем обмануть скрипт. Для этого установим точку останова (breakpoint) на строке 579 и добавим в Watch переменную t.
![](https://sun9-40.userapi.com/impg/2BB02hB8Sh3ku06r0GabiXNJ5muL-IXFZZSxXA/9YUDICzK44Q.jpg?size=807x270&quality=96&sign=d4f1485754b1fa0f197b297b4a266146&type=album)
Пробуй открыть страницу с админкой еще раз. Помни, для того чтобы точка останова сработала, у тебя обязательно должна быть открыта отладочная консоль!
![](https://sun9-54.userapi.com/impg/vt2KAud8MSsd1F6oXHLIhrgnc6V7aQpc0-_5dw/WMogDgdQbiU.jpg?size=807x434&quality=96&sign=cd06b7d9779775259e5d5f4a70cb7df2&type=album)
Теперь осталось самое простое. Скрипт выше проверяет, соответствует ли роль значению admin
. Если нет, ты получишь ошибку доступа. Поэтому тебе просто нужно исправить значение роли на admin
. К сожалению, с появлением новой консоли разработчика в Firefox возможность редактирования переменных в окне просмотра сломали и пока так и не вернули… Запомни путь к нужному значению t.data.role
, переключись в окне разработчика на вкладку Console и поменяй там значение роли на admin
.
![](https://sun9-86.userapi.com/impg/ueXstXuroyhfwKAcG-lGW2dba71ExPzkrF7WYg/zu3WOsNP2VI.jpg?size=726x291&quality=96&sign=aaae8d06f270ff5a15abd66ab63b2515&type=album)
Теперь вернись в отладчик и продолжи исполнение скрипта. Поздравляю, ты получил доступ к административной части сайта! Почему так произошло? Нельзя надеяться на контроль доступа на уровне клиентского кода, поскольку клиент всегда может этот код изменить. Кстати, это решение по уровню сложности тянет звездочки на три. Чуть позже ты зарегистрируешь нормальную админскую учетку и воспользуешься SQLi для доступа к админке. Они намного проще, так как не требуют изучения исходного кода.
Хочу заметить, что правильный серверный код не показал бы и список пользователей или отзывов, поскольку при запросе их с сервера он должен был проверить токен прав пользователя. В нашем же случае этого не происходит и, попав в админку, ты спокойно видишь все данные…
Если ты не выключил Burp, то можешь найти эти строки в обмене и убедиться, что проверка прав доступа на серверной стороне не происходит! Откуда это можно понять? Видишь куку token
? Это так называемый тoкен JWT, и его можно легко раскодировать.
![](https://sun9-83.userapi.com/impg/wowAd8XU1Gd2BYebDSmr6ecnITJmWBL6fk4RdQ/c8o6qr10jjY.jpg?size=807x308&quality=96&sign=63473a4ee6595022a69e6127ea90c602&type=album)
![](https://sun9-77.userapi.com/impg/sR55_3-Np2ktq_Qo1Zp_atnGW5mhPZIosDzIKg/GFW2BYpbLXI.jpg?size=807x504&quality=96&sign=41361314135b41eb19cf800cd10c0592&type=album)
В этом токене, по сути, содержится весь профиль пользователя и явно указана его оригинальная роль customer
, однако серверный бэкенд не проверяет права при запросе всех отзывов или профилей. Это значит, что, перехватив такой запрос, ты можешь легко получать информацию о зарегистрированных пользователях, даже не открывая админку. Если ты разработчик, никогда так не делай! Это яркий пример Broken Access Control по классификации OWASP. К сожалению, и в реальной жизни он встречается на каждом шагу… Особенно этим грешат микросервисные архитектуры.
РЕГИСТРИРУЕМ УЧЕТНУЮ ЗАПИСЬ АДМИНИСТРАТОРА
Самое время зарегистрировать себе полноценную учетную запись администратора! Для этого нужно разобраться, какая же информация отправляется при регистрации обычной учетной записи с сайта. В этом тебе поможет Burp Suite. Запускай его и проходи процесс регистрации полностью.
![](https://sun9-25.userapi.com/impg/5mouohglUPdv6eDSGuwEEC0OeM0KA22IbE737w/qPGZ0MVFoyU.jpg?size=807x632&quality=96&sign=6260eb6358cbde3502340603766ee704&type=album)
Как видишь, отправив информацию из формы, в ответ ты получишь профиль пользователя с ролью customer
. Одна из традиционных ошибок разработчика связана с так называемым mass assignment, или массовым заполнением полей. Код регистрации пользователя принимает список полей профиля для обработки, а для отсутствующих полей назначается значение по умолчанию. Видишь пустое поле username
в ответе? Попробуй перехватить этот запрос до отправки и вставить в него поле username
, как на скриншоте ниже.
![](https://sun9-66.userapi.com/impg/q8mLiMQT3yHayir4Em4KfLzxjiUEJfLeYltm1g/w9gNIX1G6Pc.jpg?size=701x552&quality=96&sign=68d4c473ecb5e824a91ef4a1f3691a69&type=album)
А теперь внимательно посмотри на ответ сервера! Видишь наше измененное имя пользователя в ответе? Кроме того, оно больше не возвращается первой строкой в данных. Надеюсь, ты понял, что нужно сделать со значением поля role
. Проделай эту простую операцию, и админская учетка у тебя в кармане, как и очередное выполненное задание! Кстати, оно официально тоже засчитывается за три звездочки.
![](https://sun9-32.userapi.com/impg/826nuD3gEyVXrlL9BoWyxPgc6qYCX4QnntagdQ/5f85iCmRmEc.jpg?size=807x399&quality=96&sign=28fed3d2566c3792a7647a29810bb00d&type=album)
ИСПОЛЬЗУЕМ SQL-ИНЪЕКЦИЮ ДЛЯ ВХОДА
Я очень надеюсь, ты не раз слышал об SQL-инъекциях и причинах их возникновения. Если нет, то самое время отправиться изучать теорию. Мне очень нравится обширный справочник по инъекциям. Открой окно логина пользователя и начни с самого простого, вставив одинарную обратную кавычку в поле логина и произвольный пароль. Судя по ярко‑красной ошибке, мы на правильном пути!
![](https://sun9-72.userapi.com/impg/rOlXuLWfVd9IaR2cCVKXdKQd9RxGG2SLl1sSzQ/brmK-2WpcTY.jpg?size=673x390&quality=96&sign=ad36d1b998f89d2baee7f6358ae2ae9e&type=album)
К сожалению, совершенно непонятно, что же именно происходит и как дальше развивать эту инъекцию. Здесь есть два варианта решения: либо ты обладаешь большим опытом инъекций и планомерно подбираешь нужные значения, либо, если это не о тебе, запускай Burp и смотри, что же происходит в сети. Помни, это очень уязвимое приложение, и наверняка разработчики допустили не одну ошибку…
![](https://sun9-48.userapi.com/impg/WZ7ydBUWS164k1qYmxNh762maovbkhwsQ_DviA/xjX9Z3GtQRQ.jpg?size=807x353&quality=96&sign=b189f09298dfe8a107bc228273187093&type=album)
Кто бы сомневался, тут даже есть код оригинального SQL-запроса. Теперь подобрать правильную нагрузку для окна логина не составит особого труда!
![](https://sun9-71.userapi.com/impg/d1N5fR9fJzKfM-H2szu4_FX-Oj3NwZD5p-u7pg/GLR-qvx2YVQ.jpg?size=807x103&quality=96&sign=9dbed34b332bf828e9ecb4bc3ea44c0f&type=album)
Здесь я должен сделать несколько важных замечаний.
- Ты нигде не указал почту, но вошел как администратор. Это произошло потому, что в этом варианте инъекции выбирается первая строка в базе, она же чаще всего будет первым зарегистрированным пользователем или суперадминистратором. Такое поведение есть в большинстве CMS.
- Если у тебя есть адрес почты интересующего тебя пользователя, то ты можешь немного модифицировать инъекцию и войти сразу же от его лица.
- Это самый простой и яркий пример класса Injection. Недаром они стоят на первом месте по классификации ОWASP.
- В коде приложения еще много мест с инъекциями, как и заданиями на нее, но они уже сложнее по уровню исполнения и наносимому урону. Например, можно получить всю базу данных вместе с паролями пользователей!
УГАДЫВАЕМ ПАРОЛЬ АДМИНИСТРАТОРА
Мне кажется, администратор этого магазина уже достаточно настрадался от тебя, однако в списке заданий есть достаточно интересное — на подбор пароля администратора. Судя по всего двум звездочкам рейтинга, оно крайне простое – мы же решим его более сложным, но универсальным методом!
Какие же ошибки в реализации аутентификации допустили разработчики этого приложения? А все самые популярные из раздела Broken Authentication:
- отсутствует защита от перебора пароля;
- пользователь может установить слабый пароль;
- пользователь может установить простой, как раз‑два‑три, пароль…
Ты можешь попробовать просто угадать пароль администратора, это не так сложно, как кажется на первый взгляд (или нажми кнопку Tutorial, и пакет с соком тебе поможет). Кроме того, я оставил тебе небольшую подсказку в предыдущем абзаце. Я же покажу, как можно решить эту задачу с помощью перебора и списка популярных паролей rockyou.txt
.
Для начала тебе нужно перехватить запрос на аутентификацию. Для этого просто открой Burp и попробуй поочередно войти как любой пользователь с правильным и неправильными паролями.
![](https://sun9-78.userapi.com/impg/UVf-_VP_ejYbyslr6FRVgVIvS_vWxG5XTdkFCw/4Mvu_R0sNpg.jpg?size=807x262&quality=96&sign=2fc2d9f2eb8f18830d1d2f30fc20db85&type=album)
Как видишь, для логина достаточно отправить JSON с двумя полями, если пароль неправильный — тебе вернется код 401. Тут я попробовал настроить самый известный подборщик паролей Hydra, но после получаса борьбы с ним просто написал вот такой небольшой код на Python.
INFO
Дело в том, что Hydra очень не любит JSON и некоторые нюансы поведения этого приложения. Если хочешь, можешь сам попробовать решить эти проблемы.
import requests
passwords = open('/usr/share/wordlists/rockyou.txt','r')
for password in passwords:
password = password.rstrip("\n")
data = {'email':'admin@juice-sh.op','password':password}
r = requests.post('http://localhost:3000/rest/user/login',json=data)
if r.status_code == 200:
print("Password is ",password)
break
print("That's all... ")
Маленькая рекомендация: прежде чем запускать перебор по всему словарю для неизвестных пользователей, убедись, что ты можешь подобрать свой собственный пароль и в коде нет никаких ошибок. В моем случае пришлось добавить код удаления символа переноса строки из пароля.
БЕСПЛАТНЫЙ DELUXE
Напоследок я покажу тебе, как можно решить более сложную задачу, а именно получение Deluxe Membership бесплатно!
Для начала запусти Burp и посмотри на весь обмен с сервером при попытке купить Deluxe без денег в кошельке и карт. Как видишь, в одном из запросов тебе возвращают стоимость в 49 условных единиц. Воспользуйся своими навыками работы в Burp и преврати их в 0.
![](https://sun9-49.userapi.com/impg/puVnDDLxTmyoCeGUqhg_Zw4LLbrdlThHR8NEAg/4E8kl3imd08.jpg?size=807x404&quality=96&sign=5087f8b1ff521b22bdd1abca6d0dd90c&type=album)
После этого на следующем экране ты сможешь оплатить 0 из кошелька, но почему‑то это так просто не получится... Если посмотреть обмен, то увидишь платеж из кошелька и ошибку «недостаточно денег».
![](https://sun9-53.userapi.com/impg/0BZMf4gxkfFvRd--DPKtbLdNU-A9q2p2KP0WGg/iEbn_98_wTI.jpg?size=807x294&quality=96&sign=dca0889dc0c2884fca683c5d6f2e00e1&type=album)
А что, если заменить paymentMode
на что‑то более интересное, например free
или deluxe
?
![](https://sun9-48.userapi.com/impg/1ibu5LEsEo1EeNKifbCZuRfqsEh5HRlIWqZ-5A/1v8P0dmoPAU.jpg?size=807x388&quality=96&sign=34e0e5fcab5c8bf23566a362778cb7b6&type=album)
Поздравляю! Ты только что обманул магазин на 49 условных единиц. Более того, если ты внимательно поэкспериментируешь с разными вариантами оплаты, то выяснишь, что менять цену на 0 на первом этапе совершенно необязательно. Главное — превратить GET-запрос /rest/deluxe-membership
в POST-запрос и добавить в него JSON-данные paymentMode
с любым отличным от wallet
или card
значением.
WARNING
Никогда не применяй такие вещи в реальных интернет‑магазинах! Это уголовно наказуемо практически во всех странах. Исключением может быть участие магазина в программе bug bounty, но там много разных нюансов, с которыми нужно ознакомиться до начала багхантинга!
ВЫВОДЫ
Очень надеюсь, что эта статья подтолкнула тебя к более глубокому изучению рекомендаций OWASP и типовых ошибок веб‑приложений. В Juice Shop еще много интересных задач как для начинающих, так и для опытных пентестеров. Если вдруг захотелось поглубже погрузиться в этот мир, то в статье «Как учиться пентесту» есть огромное количество полезных ссылок. Я же прощаюсь с тобой до следующей статьи, в которой ты попробуешь решить задачи с большим количеством звездочек!