В этой статье мы продолжим взлом интернет магазина OWASP Juice Shop. OWASP Juice Shop — это веб-приложение с открытым исходным кодом для демонстрации самых распространенных уязвимостей. Поддерживается некоммерческой организацией Open Web Application Security Project (OWASP) и волонтерами.
Еще по теме: Обзор лучших сканеров уязвимостей
В Juice Shop многие задания требуют решения некоторых предыдущих. Поэтому сейчас мы с вами попробуем взломать интернет магазин OWASP Juice Shop, это научит вас обходить защиту файлов от скачивания и другие способы защиты применяемые в разработке сайтов.
В недавней статье, мы рассказывали, как установить и использовать OWASP Juice Shop. Очень рекомендую для затравки!
Взлом интернет магазина OWASP Juice Shop
Не пытайтесь использовать подобные техники взлома на реальных интернет‑магазинах! Это преследуется законом и уголовно наказуемо, если, конечно, у вас нет подписанного договора на проведение пентеста.
Скачивание недоступных файлов
Я всегда рекомендую не забывать поискать скрытые директории на сайтах. Сделать это можно при помощи утилиты dirb.
1 |
dirb http://localhost:3000 |
Заметили очень интересную директорию ftp? Если вы внимательно посмотрите внутрь robots.txt, то убедитесь, что мы просто обязаны ее изучить.
Как видите, тут очень много интересного! Однако стоит начать скачивать файлы, как вы узнаете, что разрешено это делать, только если они имеют расширение .md или .pdf. Тем не менее эти файлы очень нужны нам для выполнения следующих заданий. Поэтому придется пойти в Google и найти там множество статей по техникам обхода фильтров по расширению файла.
Одна из техник называется null byte и заключается в добавлении к имени скачиваемого файла специального «нулевого байта» — %00. Например, можно запросить файл вот так:
1 |
http://localhost:3000/ftp/eastere.gg%00.md |
Не забывайте только, что такой URL содержит запрещенные символы и должен быть специальным способом закодирован перед использованием. Для этого существует огромное количество сервисов, можете использовать, например, CyberChef.
Скачайте теперь все файлы в папке FTP, и давайте отправимся искать пасхалку!
Пасхалка от разрабов
Одно из заданий на четыре звездочки называется Find the hidden easter egg. Для его решения нам понадобится содержимое файла eastere.gg.
Внутри файла вы найдете шутливое поздравление от разработчиков и интересную строчку:
1 |
ci9xcmlmL25lci9mYi9zaGFhbC9ndXJsL3V2cS9uYS9ybmZncmUvcnR0L2p2Z3V2YS9ndXIvcm5mZ3JlL3J0dA== |
В ней легко угадывается кодировка Base64, поэтому воспользуйтесь любым подходящим инструментом (например, тем же CyberChef) и превратите это в осмысленный текст.
Вот как выглядит результат:
1 |
/gur/qrif/ner/fb/shaal/gurl/uvq/na/rnfgre/rtt/jvguva/gur/rnfgre/rtt |
Как видите, он не отличается осмысленностью. Можно попробовать добавить его к http://localhost:3000, но в ответ нас ждет пустота. Эта строчка явно требует дальнейшего декодирования.
Для работы с неизвестными шифрами я обычно использую Cipher Identifier на dcode.fr. Передайте в него нашу строку и найдите шифр.
Это оказался очень известный ROT 13! Можете декодировать его на том же сайте и насладиться пасхалкой. Кстати, решая это задание, мы заодно прошли два других!
Скачивание всей базы данных
Как вы помните, в прошлой статье (ссылка в начале) мы уже использовали SQL-инъекцию, чтобы получить права администратора. Настало время поискать что‑нибудь интересное в базе данных этого приложения.
Например, решить задание Exfiltrate the entire DB schema definition via SQL Injection. Для этого нам нужно перейти в любой раздел, где возможна инъекция. В Juice Shop это раздел поиска товаров. Здесь я для удобства воспользуюсь sqlmap, но вы можете попробовать найти и использовать инъекцию вручную, поскольку на доске с заданиями есть пример уязвимого кода.
Однако напрямую задача не решается. Если вы попробуете выполнить вот такую команду, то успеха не добьетесь:
1 |
sqlmap -url="http://localhost:3000/search?q=1 |
Дело в том, что все опасные символы фильтруются на уровне фронтенда, что часто бывает в подобных приложениях. Значит, нужно запустить Burp и найти, какой адрес в действительности вызывается для поиска товаров. Если вы внимательно посмотрите на запросы, то обнаружите интересный запрос к REST API:
1 |
/rest/products/search?q=apple |
Давайте воспользуемся этими новыми данными и попробуем еще раз.
1 |
sqlmap -url="http://localhost:3000/rest/products/search?q=apple |
Этот вариант работает! Теперь добавьте нужные параметры, и вся база данных в ваших руках.
1 |
sqlmap -url="http://localhost:3000/rest/products/search?q=apple" -T Users --dump --threads=10 |
Вот эта команда позволит получить вам всю базу данных пользователей и хеши их паролей.
Подделка токенов JWT
В предыдущей статье мы уже сталкивались с JWT.
На доске задач есть два задания, связанных с подделкой JWT:
- Forge an essentially unsigned JWT token that impersonates the (non-existing) user jwtn3d@juice-sh.op
- Forge an almost properly RSA-signed JWT token that impersonates the (non-existing) user rsa_lord@juice-sh.op
Поскольку у нас нет нужных ключей для правильной подписи токена, попробуем подделать неподписанный токен.
Для начала нам нужно получить любой действующий токен пользователя. Войдите в магазин от имени любого пользователя, перехватите пакеты обмена и достаньте оттуда заголовок авторизации Bearer.
Для просмотра и кодирования JWT я использую сайт jwt.io, однако он не позволит сделать нам токен без подписи. Для начала скопируйте весь код токена в файл. Токен, как вы уже прочитали, состоит из трех частей Base64, которые нужно декодировать, изменить и закодировать обратно. Проделаем это с первой и второй частью, поскольку третья часть — это ненужная нам подпись.
Теперь изменим в заголовке алгоритм на none и в теле токена почту на jwtn3d@juice-sh.op. Проделайте это и закодируйте все обратно в Base64, соедините их точкой и обязательно добавьте еще одну точку в самом конце! При кодировании не забудьте включить опцию URL-safe, поскольку JWT использует именно этот стандарт кодирования. В итоге у меня получился вот такой токен.
Теперь подделайте в Burp любой запрос с этим токеном и можете радоваться решенной задаче. Помните, токен имеет ограниченный срок жизни, так что не затягивайте!
Погружение в дебри кода
Среди скачанных вами файлов есть крайне интересный файл package.json.bak. Если вы не знаете, что это такое и зачем нужно, то самое время узнать. Если вкратце, этот файл показывает, какие пакеты и компоненты использовались для создания Juice Shop. Очень часто среди этих компонентов можно найти уязвимые и проэксплуатировать это. Давайте подробно изучим содержимое этого файла.
На доске заданий есть еще одно интересное задание в разделе криптографии: Inform the shop about an algorithm or library it should definitely not use the way it does. А в файле package.json есть три библиотеки, подходящие под нужное описание: hashids, jsonwebtoken и z85.
Если посмотреть внимательно описание этих пакетов в интернете, то можно определить, что пакет Z85 отвечает за кодирование, а не шифрование. Поэтому можно попробовать сдать его в качестве решения задачи. Кстати, если вы внимательно смотрели на хеши пользователей из предыдущего задания, то они очень похожи на MD5, а этот алгоритм тоже давно небезопасен. Можете попробовать информировать магазин и об этой уязвимости.
Знание о том, что магазин использует Z85, позволит нам подобраться к следующей очень сложной задаче.
Подделка кода купона
На доске задач есть задача на шесть звездочек, предлагающая нам подделать купон и создать купон со скидкой не менее 80%: Forge a coupon code that gives you a discount of at least 80%.
Как вы помните, среди найденных нами файлов в папке ftp был очень интересный файл с резервной копией разных купонов. К сожалению, они безнадежно устарели… Однако если отправить их в анализатор шифров, о котором я писал выше, то он покажет, что все эти коды очень похожи на коды ROT, то есть не являются настоящим шифрованием, а просто используют смещение букв на определенную величину. К сожалению, точный вариант такого преобразования он установить не сможет.
Тут надо вспомнить, что проект реализован на Node.js, а разработчики обычно ленивы и используют одну и ту же библиотеку для разных вещей. Еще помните о Z85? У нее есть консольная версия Z85-cli — самое время установить ее и попробовать в деле. Перейдите в папку Juice Shop и выполните следующую команду:
1 |
npm install -g z85-cli |
Теперь можно попробовать декодировать купон:
1 |
z85 --decode "q:<IqgC7sn" |
Результат — SEP13-10! То есть это купон на сентябрь 2013 года на 10%. Отлично, теперь вы знаете, как сделать актуальный купон и применить его. Для примера вот мой купон на 99%.
Заключение
Надеюсь, эта статья позволила вам еще под одним углом взглянуть на безопасность веб‑приложений и освоить новые техники. В Juice Shop осталось много интересных задач, так что вы всегда можете на них попрактиковаться. Заодно узнаете, как не допускать таких уязвимостей при разработке своих приложений!
Если очень хочется попрактиковаться и поискать реальные ошибки в веб-приложениях, регистрируйтесь на специальных платформах — например, на HackerOne или BugCrowd.
Еще по теме: Проверка сайта на уязвимости