Когда мы развернули систему защиты от атак на веб-приложения SolidWall WAF для наших клиентов, у нас появилась мысль посмотреть, как будут обнаруживаться и блокироваться атаки на тестовый сервис, например, тренажера Juice Shop - приложения, в котором намеренно реализованы наиболее частые уязвимости.
Мы хотели сделать разбор всех простых загадок (с одной звездой) Juice Shop, но с учетом скриншотов в формат статьи влезла только одна: «Zero Stars Give a devastating zero-star feedback to the store. Improper Input Validation». Она интересна тем, что от нее сложно защититься негативной моделью (сигнатурами), но легко - позитивной моделью, хорошо развитой у SolidWall.
![](https://habrastorage.org/getpro/habr/upload_files/1d5/dfd/ead/1d5dfdead650d5dd522bc01458260b9d.png)
Juice Shop развернули легко по инструкции https://hub.docker.com/r/bkimminich/juice-shop#docker-container
![](https://habrastorage.org/getpro/habr/upload_files/5c2/4ab/d14/5c24abd149865265678bc25d66a4d4ba.png)
Настраиваем SolidWall. Сначала фильтрующие ноды, публикуем приложение в конфиге nginx: /etc/solidwall/nginx/sites-enabled/juiceshop
![](https://habrastorage.org/getpro/habr/upload_files/ac6/9a8/39b/ac69a839b947953bd5573244b0cfde8b.png)
sudo solidwall-nginx test
sudo solidwall-nginx reload
Далее добавляем приложение в веб-интерфейсе SolidWall:
![](https://habrastorage.org/getpro/habr/upload_files/2d8/4e8/69e/2d84e869e1c5104ad5016c0a61cc3895.png)
В нашем случае перед фильтрующими нодами стоит балансировщик. Поэтому в рамках «тройки» будем определять приложение только по имени.
Трафик пошел, корректно определилось приложение.
![](https://habrastorage.org/getpro/habr/upload_files/73f/142/a76/73f142a7650ca80814f664f02605060e.png)
Итак, приступаем к тестированию
Задача: Give a devastating zero-star feedback to the store (В форме обратной связи оставить отзыв с 0 звездами). Классическая задача по валидации входных данных.
![](https://habrastorage.org/getpro/habr/upload_files/ac9/211/ef2/ac9211ef2b5b1f74d1af1248dbee8694.png)
Эксплуатируем
Решается предельно просто: создаем запрос с нужным телом (JSON), например, в BurpSuite Repeater.
![](https://habrastorage.org/getpro/habr/upload_files/727/64a/5bd/72764a5bdfceaf32b8c2cc401b69ce91.png)
Защищаем
Теперь вопрос, как защититься на уровне SolidWall? Очевидно, нужно ввести валидацию входных значений.
Находим нужную нам транзацию в журнале SolidWall.
![](https://habrastorage.org/getpro/habr/upload_files/6d4/15c/abe/6d415cabeb6603ec979cc13096bc2590.png)
В первую очередь нам надо убедиться, что разбор запроса на стороне WAF осуществляется корректно. Идем в раздел «Запрос». Как мы видим ниже, структура полностью соответствует запросу, который мы видим в свойствах транзакции. Это означает, что он будет разбираться корректно, и можно переходить к правилам.
![](https://habrastorage.org/getpro/habr/upload_files/f3e/7ec/f1d/f3e7ecf1def7260dfacea73527fbd751.png)
Возвращаемся в транзакцию, переходим на вкладку «Действие» и нажимаем кнопку «Создать действие на основе этой транзакции».
Переходим в раздел действия и видим действие вот такого вида:
url->path->0 == api
url->path->1 == Feedbacks
url->path->2 ==
method == POST
body->rating, body->captcha, body->captchaId, body->comment (любое значение)
Редактируем созданное действие:
![Нужно нажимать на верхний карандаш, отметил на картинке Нужно нажимать на верхний карандаш, отметил на картинке](https://habrastorage.org/getpro/habr/upload_files/a72/d4a/f3e/a72d4af3ebe1031ed6d3551dca4de0ba.png)
Параметры (из JSON) появились при создании правила из транзакции, а вот в поле «Модель» было указано «по умолчанию». Изменяем ее для каждого из параметров и сохраняем изменения.
![](https://habrastorage.org/getpro/habr/upload_files/8cf/f18/bc4/8cff18bc409f0cfb4cc233475484612a.png)
Проверяем...
Неправильный рейтинг
![](https://habrastorage.org/getpro/habr/upload_files/1b0/1f3/4ff/1b01f34ff422a8299b5a06d1558f0eec.png)
Правильный рейтинг
![](https://habrastorage.org/getpro/habr/upload_files/548/bda/d39/548bdad39f969fe6bf3eb719ea751250.png)
Неправильный тип id капчи
![](https://habrastorage.org/getpro/habr/upload_files/29a/f00/f5d/29af00f5d0cb215b546496e8f84b1cc5.png)
Неправильный комментарий
Вообще в строковый тип сложно закинуть некорректные данные… те же числа он просто конвертирует в строки. Пусть будет еще один вложенный JSON:
![](https://habrastorage.org/getpro/habr/upload_files/beb/1d0/b07/beb1d0b071c04d037c8f1b10ddf5e22d.png)
Лишний параметр
А вот с лишним параметорм нормально проходит, но он теряется при обработке приложением.
![](https://habrastorage.org/getpro/habr/upload_files/d54/5a1/db8/d545a1db8bfe5f6ca04077bad96b5661.png)
Журнал SolidWall
В журнале SolidWall видим, что появились ошибки «Параметр не соответствует модели»
![](https://habrastorage.org/getpro/habr/upload_files/5b0/423/a85/5b0423a85b2d787810c8b59566eea899.png)
Видим, что не прошла валидация параметров:
![](https://habrastorage.org/getpro/habr/upload_files/9b4/946/c1c/9b4946c1cd3829f97b7fbd4a1d222c79.png)
Заключение
Итак, нам удалось провести валидацию входных данных и блокировать запросы, не соответствующие модели.
На этом на сегодня все, спасибо за внимание. Если интересно почитать разбор конкретного кейса – напишите в комментариях.