Самый сочный веб-апп. Громим OWASP Juice Shop — полигон для атак на веб-приложения

Самый сочный веб-апп. Громим 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.

Те­перь перей­дем непос­редс­твен­но к ана­лизу нашего при­ложе­ния. Я рекомен­дую сде­лать таб­личку с опи­сани­ем дос­тупных фун­кций и необ­ходимых уров­ней дос­тупа. Она поможет тебе потом экспе­римен­тировать над при­ложе­нием и отве­чать на воп­росы вро­де «А что будет, если я отправ­лю админ­ский зап­рос с пра­вами гос­тя?»

Прой­дись по все­му при­ложе­нию, понажи­май все кноп­ки, пос­мотри товар. Теперь зарегис­три­руй­ся и поп­робуй прой­ти весь путь покуп­ки товара от добав­ления его в кор­зину до дос­тавки. Твоя задача — поз­накомить­ся с фун­кци­ями при­ложе­ния и подумать, где могут быть логичес­кие ошиб­ки раз­работ­чиков или неуч­тенные момен­ты. Если вдруг закон­чились идеи, какие еще мес­та магази­на мож­но посетить, пос­мотри на Happy Path под­робный гид, сос­тавлен­ный раз­работ­чиками.

WARNING

Я очень наде­юсь, что ты не исполь­зовал при тес­тирова­нии это­го при­ложе­ния реаль­ные номера бан­ков­ских карт и адре­са! Пом­ни, оно пол­но дыр как в пла­не безопас­ности, так и в пла­не при­ват­ности. Если вдруг сде­лал это, прос­то уда­ли пап­ку с при­ложе­нием и уста­нови его сно­ва.

На какие мес­та и фун­кции это­го и дру­гих при­ложе­ний я рекомен­дую обра­щать осо­бое вни­мание:

  • фор­ма регис­тра­ции, вхо­да и вос­ста­нов­ления пароля;
  • лю­бые стро­ки поис­ка и поль­зователь­ско­го вво­да. Они все могут быть уяз­вимы к раз­ным видам XSS. Это я еще про­демонс­три­рую;
  • все вари­анты филь­тра­ции товара или выбор­ки его по кри­тери­ям. Это час­то путь к SQL-инъ­екци­ям;
  • ра­бота с кор­зиной, спис­ком заказов и дос­тавкой. Там час­то мож­но встре­тить очень пло­хой кон­троль дос­тупа и под­смот­реть чужие кор­зины и адре­са;
  • лю­бые фун­кции с воз­можностью зло­упот­ребле­ний (воз­врат товара, плат­ные под­писки и так далее);
  • ад­минка и дос­туп к ней неав­торизо­ван­ных поль­зовате­лей или выпол­нение админ­ских фун­кций без необ­ходимых прав (но вна­чале надо в эту админку попасть).

Те­перь самое вре­мя пос­мотреть на OWASP Top 10. Все десять катего­рий обя­затель­но при­сутс­тву­ют в Juice Shop. Что самое инте­рес­ное, в каж­дой из этих катего­рий под­робно опи­саны вари­анты воз­никно­вения и методы защиты. Вари­анты мож­но исполь­зовать как чек‑лист для про­вер­ки вро­де «А пос­мотрел ли я этот момент в при­ложе­нии?» или, если ты раз­работ­чик, «А не допус­тил ли я такой же ошиб­ки у себя?»

На этом скуч­ная (но очень важ­ная!) ввод­ная часть закан­чива­ется, и я перехо­жу к непос­редс­твен­но демонс­тра­ции уяз­вимос­тей магази­на.

ИЩЕМ ДОСКУ С ЗАДАНИЯМИ

Ты навер­няка при пер­вом запус­ке уже заметил пакет с соком, пред­лага­ющий решить очень прос­тую задачу, а имен­но най­ти дос­ку с задани­ями и резуль­татами, она же Score Board. У этой край­не прос­той задачи есть два вари­анта решения.

  1. Вни­матель­но пос­мотри на адресную стро­ку вида /#/search/#/login и так далее и подумай, а какой бы была стро­ка для дос­тупа к Score Board? Сра­зу ска­жу, этот вари­ант мне не очень нра­вит­ся, пос­коль­ку нуж­но играть в уга­дай­ку, и не всег­да успешно. Поэто­му я пред­почитаю вари­ант номер два.
  2. Да­вай изу­чим исходный код сай­та и пос­мотрим, нет ли там чего инте­рес­ного. Я наде­юсь, ты уме­ешь читать исходный код сай­та в сво­ем любимом бра­узе­ре? В Firefox дос­таточ­но прос­то нажать F12.

Что сра­зу же бро­сает­ся в гла­за? Огромное количес­тво под­клю­чаемых скрип­тов на JS! Нас с тобой будет инте­ресо­вать скрипт main. За что отве­чают дру­гие скрип­ты, ты можешь выяс­нить на досуге с помощью любимо­го поис­ковика.

Те­перь перехо­ди во вклад­ку Debugger и смот­ри на исходный код main. Выг­лядит не очень, прав­да? Тут есть два пути: или пытать­ся вос­ста­новить код пос­ле миними­зато­ра JS c помощью одно­го из мно­жес­тва сай­тов‑деоб­фуска­торов или прос­то выб­рать в Firefox (клик­нув по зак­ладке с наз­вани­ем фай­ла) Pretty print source и получить более чита­емый исходный код. Для наших целей пока хва­тит и это­го.

Код вну­шитель­ный. Это пло­хо и хорошо одновре­мен­но. Обыч­но это говорит о том, что очень мно­го логики сай­та вынес­ли в кли­ент­ский JavaScript, а зна­чит, ее мож­но будет лег­ко обой­ти прос­тым дебаг­гером. Най­дем же наконец Score Board. Как эффектив­нее искать в исходни­ках, каж­дый реша­ет сам, но в резуль­тате ты дол­жен доб­рать­ся до кус­ка с уже зна­комы­ми тебе мар­шру­тами вро­де /#/search.

Вби­вай в адресную стро­ку http://localhost:3000/#/score-board и успешно выпол­няй пер­вое задание. Кста­ти, теперь в левом меню появил­ся соот­ветс­тву­ющий пункт и воз­можность быс­тро откры­вать дос­ку.

INFO

На прос­торах интерне­та и в YouTube есть пол­ные решения всех задач Juice Shop. Кро­ме того, ты всег­да можешь почитать под­робное объ­ясне­ние поч­ти каж­дого задания с решени­ем в кни­ге раз­работ­чиков, но я рекомен­дую смот­реть решение толь­ко в самом край­нем слу­чае. Более того, некото­рые задачи мож­но решить совер­шенно раз­ными метода­ми.

В вер­сии Juice Shop 12.7.0 появи­лась замеча­тель­ная фун­кция — теперь, нажав кноп­ку с тре­уголь­ными скоб­ками, мож­но уви­деть исходный код уяз­вимого модуля и стро­ку, в которой и про­исхо­дит ошиб­ка. Прос­то срав­ни исходный код до миними­зации и тот, что ты уви­дел в бра­узе­ре. Воз­можно, ты най­дешь новые инте­рес­ные мар­шру­ты, скры­тые от тебя интерфей­сом сай­та.

Кста­ти, на скрин­шоте выше у меня уже выпол­нено два задания. Я прос­то задал­ся воп­росом, а что будет, если поп­робовать открыть мар­шрут /#/complain, не регис­три­руясь на сай­те? Ты же пом­нишь, что без вхо­да в учет­ную запись его нет в левом меню? Поп­робуй открыть его как гость и отпра­вить ано­ним­ную жалобу! Получил новую ачив­ку? Вот так делать не сто­ит и всег­да нуж­но учи­тывать, что любой мар­шрут может быть открыт прос­тым набором нуж­ного адре­са в адресной стро­ке. О том, почему не сто­ит доверять совер­шенно ничему, при­шед­шему тебе по сети, я покажу чуть поз­же.

ОТКРЫВАЕМ АДМИНКУ

Преж­де чем бро­сать­ся с головой выпол­нять задания, я рекомен­дую вни­матель­но озна­комить­ся с содер­жимым дос­ки. Все задания на ней раз­делены по уров­ню слож­ности от одной до шес­ти звез­дочек. Деление дос­таточ­но условное. Нап­ример, нуж­но сооб­щить магази­ну об исполь­зовании «сла­бой» крип­тогра­фии. Сама по себе задача реша­ется прос­той отправ­кой в чат наз­вания уяз­вимого алго­рит­ма, вот толь­ко узнать и опре­делить эти алго­рит­мы мож­но, выпол­няя задания более высоко­го уров­ня слож­ности. Поэто­му не ста­рай­ся выпол­нить все задания одно­го уров­ня слож­ности и лишь потом перехо­дить к дру­гому. Я рекомен­дую руководс­тво­вать­ся катего­риями (кста­ти, ты заметил их уди­витель­ную схо­жесть с OWASP Top 10?). Теги нап­ротив каж­дого задания могут показать тебе вер­ное нап­равле­ние поис­ка.

Не­кото­рые задания име­ют под­сказ­ку или тутори­ал. Поп­робуй вна­чале обой­тись без помощи. Одна­ко некото­рые задания нас­толь­ко туман­ны, что есть смысл почитать более под­робное опи­сание в кни­ге раз­работ­чиков. Вот, к при­меру, ка­тего­рия «Раз­нооб­разное».

Те­перь давай перей­дем к поис­ку админки и попыта­емся в нее попасть. Наде­юсь, ты еще не забыл мес­то, где мы наш­ли адрес Score Board? Там же мож­но обна­ружить и адрес админки! Одна­ко при попыт­ке перей­ти по это­му адре­су нас встре­тит крас­ный бан­нер с ошиб­кой 403... Самое вре­мя запус­тить Burp Suite и пос­мотреть на сетевой обмен.

Уди­витель­но, но ничего похоже­го на дос­туп к админке тут нет! Пом­нишь про огромный раз­мер скрип­та main? Навер­няка вся про­вер­ка дос­тупа обра­баты­вает­ся в нем. Вре­мя порабо­тать с дебаг­гером. Про­ще все­го най­ти нуж­ное мес­то в коде по ошиб­ке дос­тупа — 403.

Ви­дишь пер­вую и вто­рую фун­кцию CanActivate()? Если у нас нет токена или нам зап­рещен дос­туп, то мы получа­ем ошиб­ку 403. Что­бы сок­ратить количес­тво скрин­шотов, сра­зу ска­жу — при­дет­ся зарегис­три­ровать­ся. У незаре­гис­три­рован­ных поль­зовате­лей токена дос­тупа нет. Так что самое вре­мя вой­ти под соз­данным ранее поль­зовате­лем или соз­дать нового.

Те­перь давай поп­робу­ем обма­нуть скрипт. Для это­го уста­новим точ­ку оста­нова (breakpoint) на стро­ке 579 и добавим в Watch перемен­ную t.

Про­буй открыть стра­ницу с админкой еще раз. Пом­ни, для того что­бы точ­ка оста­нова сра­бота­ла, у тебя обя­затель­но дол­жна быть откры­та отла­доч­ная кон­соль!

Те­перь оста­лось самое прос­тое. Скрипт выше про­веря­ет, соот­ветс­тву­ет ли роль зна­чению admin. Если нет, ты получишь ошиб­ку дос­тупа. Поэто­му тебе прос­то нуж­но испра­вить зна­чение роли на admin. К сожале­нию, с появ­лени­ем новой кон­соли раз­работ­чика в Firefox воз­можность редак­тирова­ния перемен­ных в окне прос­мотра сло­мали и пока так и не вер­нули… Запом­ни путь к нуж­ному зна­чению t.data.role, перек­лючись в окне раз­работ­чика на вклад­ку Console и поменяй там зна­чение роли на admin.

Те­перь вер­нись в отладчик и про­дол­жи исполне­ние скрип­та. Поз­драв­ляю, ты получил дос­туп к адми­нис­тра­тив­ной час­ти сай­та! Почему так про­изош­ло? Нель­зя наде­ять­ся на кон­троль дос­тупа на уров­не кли­ент­ско­го кода, пос­коль­ку кли­ент всег­да может этот код изме­нить. Кста­ти, это решение по уров­ню слож­ности тянет звез­дочки на три. Чуть поз­же ты зарегис­три­руешь нор­маль­ную админ­скую учет­ку и вос­поль­зуешь­ся SQLi для дос­тупа к админке. Они нам­ного про­ще, так как не тре­буют изу­чения исходно­го кода.

Хо­чу заметить, что пра­виль­ный сер­верный код не показал бы и спи­сок поль­зовате­лей или отзы­вов, пос­коль­ку при зап­росе их с сер­вера он дол­жен был про­верить токен прав поль­зовате­ля. В нашем же слу­чае это­го не про­исхо­дит и, попав в админку, ты спо­кой­но видишь все дан­ные…

Ес­ли ты не вык­лючил Burp, то можешь най­ти эти стро­ки в обме­не и убе­дить­ся, что про­вер­ка прав дос­тупа на сер­верной сто­роне не про­исхо­дит! Отку­да это мож­но понять? Видишь куку token? Это так называ­емый тoкен JWT, и его мож­но лег­ко рас­кодиро­вать.

В этом токене, по сути, содер­жится весь про­филь поль­зовате­ля и явно ука­зана его ори­гиналь­ная роль customer, одна­ко сер­верный бэкенд не про­веря­ет пра­ва при зап­росе всех отзы­вов или про­филей. Это зна­чит, что, перех­ватив такой зап­рос, ты можешь лег­ко получать информа­цию о зарегис­три­рован­ных поль­зовате­лях, даже не откры­вая админку. Если ты раз­работ­чик, никог­да так не делай! Это яркий при­мер Broken Access Control по клас­сифика­ции OWASP. К сожале­нию, и в реаль­ной жиз­ни он встре­чает­ся на каж­дом шагу… Осо­бен­но этим гре­шат мик­росер­висные архи­тек­туры.

РЕГИСТРИРУЕМ УЧЕТНУЮ ЗАПИСЬ АДМИНИСТРАТОРА

Са­мое вре­мя зарегис­три­ровать себе пол­ноцен­ную учет­ную запись адми­нис­тра­тора! Для это­го нуж­но разоб­рать­ся, какая же информа­ция отправ­ляет­ся при регис­тра­ции обыч­ной учет­ной записи с сай­та. В этом тебе поможет Burp Suite. Запус­кай его и про­ходи про­цесс регис­тра­ции пол­ностью.

Как видишь, отпра­вив информа­цию из фор­мы, в ответ ты получишь про­филь поль­зовате­ля с ролью customer. Одна из тра­дици­онных оши­бок раз­работ­чика свя­зана с так называ­емым mass assignment, или мас­совым запол­нени­ем полей. Код регис­тра­ции поль­зовате­ля при­нима­ет спи­сок полей про­филя для обра­бот­ки, а для отсутс­тву­ющих полей наз­нача­ется зна­чение по умол­чанию. Видишь пус­тое поле username в отве­те? Поп­робуй перех­ватить этот зап­рос до отправ­ки и вста­вить в него поле username, как на скрин­шоте ниже.

А теперь вни­матель­но пос­мотри на ответ сер­вера! Видишь наше изме­нен­ное имя поль­зовате­ля в отве­те? Кро­ме того, оно боль­ше не воз­вра­щает­ся пер­вой стро­кой в дан­ных. Наде­юсь, ты понял, что нуж­но сде­лать со зна­чени­ем поля role. Про­делай эту прос­тую опе­рацию, и админ­ская учет­ка у тебя в кар­мане, как и оче­ред­ное выпол­ненное задание! Кста­ти, оно офи­циаль­но тоже зас­читыва­ется за три звез­дочки.

ИСПОЛЬЗУЕМ SQL-ИНЪЕКЦИЮ ДЛЯ ВХОДА

Я очень наде­юсь, ты не раз слы­шал об SQL-инъ­екци­ях и при­чинах их воз­никно­вения. Если нет, то самое вре­мя отпра­вить­ся изу­чать теорию. Мне очень нра­вит­ся об­ширный спра­воч­ник по инъ­екци­ям. Открой окно логина поль­зовате­ля и нач­ни с самого прос­того, вста­вив оди­нар­ную обратную кавыч­ку в поле логина и про­изволь­ный пароль. Судя по ярко‑крас­ной ошиб­ке, мы на пра­виль­ном пути!

К сожале­нию, совер­шенно непонят­но, что же имен­но про­исхо­дит и как даль­ше раз­вивать эту инъ­екцию. Здесь есть два вари­анта решения: либо ты обла­даешь боль­шим опы­том инъ­екций и пла­номер­но под­бира­ешь нуж­ные зна­чения, либо, если это не о тебе, запус­кай Burp и смот­ри, что же про­исхо­дит в сети. Пом­ни, это очень уяз­вимое при­ложе­ние, и навер­няка раз­работ­чики допус­тили не одну ошиб­ку…

Кто бы сом­невал­ся, тут даже есть код ори­гиналь­ного SQL-зап­роса. Теперь подоб­рать пра­виль­ную наг­рузку для окна логина не сос­тавит осо­бого тру­да!

Здесь я дол­жен сде­лать нес­коль­ко важ­ных замеча­ний.

  1. Ты ниг­де не ука­зал поч­ту, но вошел как адми­нис­тра­тор. Это про­изош­ло потому, что в этом вари­анте инъ­екции выбира­ется пер­вая стро­ка в базе, она же чаще все­го будет пер­вым зарегис­три­рован­ным поль­зовате­лем или суперад­минис­тра­тором. Такое поведе­ние есть в боль­шинс­тве CMS.
  2. Ес­ли у тебя есть адрес поч­ты инте­ресу­юще­го тебя поль­зовате­ля, то ты можешь нем­ного модифи­циро­вать инъ­екцию и вой­ти сра­зу же от его лица.
  3. Это самый прос­той и яркий при­мер клас­са Injection. Недаром они сто­ят на пер­вом мес­те по клас­сифика­ции ОWASP.
  4. В коде при­ложе­ния еще мно­го мест с инъ­екци­ями, как и задани­ями на нее, но они уже слож­нее по уров­ню исполне­ния и наноси­мому уро­ну. Нап­ример, мож­но получить всю базу дан­ных вмес­те с пароля­ми поль­зовате­лей!

УГАДЫВАЕМ ПАРОЛЬ АДМИНИСТРАТОРА

Мне кажет­ся, адми­нис­тра­тор это­го магази­на уже дос­таточ­но нас­тра­дал­ся от тебя, одна­ко в спис­ке заданий есть дос­таточ­но инте­рес­ное — на под­бор пароля адми­нис­тра­тора. Судя по все­го двум звез­дочкам рей­тин­га, оно край­не прос­тое – мы же решим его более слож­ным, но уни­вер­саль­ным методом!

Ка­кие же ошиб­ки в реали­зации аутен­тифика­ции допус­тили раз­работ­чики это­го при­ложе­ния? А все самые популяр­ные из раз­дела Broken Authentication:

  • от­сутс­тву­ет защита от перебо­ра пароля;
  • поль­зователь может уста­новить сла­бый пароль;
  • поль­зователь может уста­новить прос­той, как раз‑два‑три, пароль…

Ты можешь поп­робовать прос­то уга­дать пароль адми­нис­тра­тора, это не так слож­но, как кажет­ся на пер­вый взгляд (или наж­ми кноп­ку Tutorial, и пакет с соком тебе поможет). Кро­ме того, я оста­вил тебе неболь­шую под­сказ­ку в пре­дыду­щем абза­це. Я же покажу, как мож­но решить эту задачу с помощью перебо­ра и спис­ка популяр­ных паролей rockyou.txt.

Для начала тебе нуж­но перех­ватить зап­рос на аутен­тифика­цию. Для это­го прос­то открой Burp и поп­робуй пооче­ред­но вой­ти как любой поль­зователь с пра­виль­ным и неп­равиль­ными пароля­ми.

Как видишь, для логина дос­таточ­но отпра­вить 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.

Пос­ле это­го на сле­дующем экра­не ты смо­жешь опла­тить 0 из кошель­ка, но почему‑то это так прос­то не получит­ся... Если пос­мотреть обмен, то уви­дишь пла­теж из кошель­ка и ошиб­ку «недос­таточ­но денег».

А что, если заменить paymentMode на что‑то более инте­рес­ное, нап­ример free или deluxe?

Поз­драв­ляю! Ты толь­ко что обма­нул магазин на 49 условных еди­ниц. Более того, если ты вни­матель­но поэк­спе­римен­тиру­ешь с раз­ными вари­анта­ми опла­ты, то выяс­нишь, что менять цену на 0 на пер­вом эта­пе совер­шенно необя­затель­но. Глав­ное — прев­ратить GET-зап­рос /rest/deluxe-membership в POST-зап­рос и добавить в него JSON-дан­ные paymentMode с любым отличным от wallet или card зна­чени­ем.

WARNING

Ни­ког­да не при­меняй такие вещи в реаль­ных интернет‑магази­нах! Это уго­лов­но наказу­емо прак­тичес­ки во всех стра­нах. Исклю­чени­ем может быть учас­тие магази­на в прог­рамме bug bounty, но там мно­го раз­ных нюан­сов, с которы­ми нуж­но озна­комить­ся до начала баг­хантин­га!

ВЫВОДЫ

Очень наде­юсь, что эта статья под­тол­кну­ла тебя к более глу­боко­му изу­чению рекомен­даций OWASP и типовых оши­бок веб‑при­ложе­ний. В Juice Shop еще мно­го инте­рес­ных задач как для начина­ющих, так и для опыт­ных пен­тесте­ров. Если вдруг захоте­лось пог­лубже пог­рузить­ся в этот мир, то в статье «Как учить­ся пен­тесту» есть огромное количес­тво полез­ных ссы­лок. Я же про­щаюсь с тобой до сле­дующей статьи, в которой ты поп­робу­ешь решить задачи с боль­шим количес­твом звез­дочек!

Источник


Report Page