Русский
Русский
English
Статистика
Реклама

Web security

Wapiti анализ защищенности сайта своими силами

15.07.2020 14:22:53 | Автор: admin

Сканирование сайта на уязвимости необходимая мера, которая позволяет трезво оценить уровень его защищенности от внешних угроз, выполнить которое можно самостоятельно с помощью специализированно инструментария сканеров уязвимостей.


Nikto, W3af (написан на Python 2.7, поддержка которого закончилась) или Arachni (с февраля более не поддерживается) наиболее популярные решения, представленные в бесплатном сегменте. Разумеется, есть и другие, например, Wapiti, на котором мы решили остановимся.


Wapiti работает со следующими типами уязвимостей:


  • раскрытие файла (локальные и удаленные, fopen, readfile);
  • внедрение в базы данных (PHP / JSP / ASP / SQL-инъекции и XPath-инъекции);
  • XSS (межсайтовый скриптинг) (отраженная и постоянная);
  • обнаружение и выполнение команд (eval (), system (), passtru () );
  • инъекция CRLF (разделение ответов HTTP, фиксация сеанса);
  • XXE (XML внешняя сущность) внедрение;
  • SSRF (Подделка запроса на стороне сервера);
  • использование известных потенциально опасных файлов (благодаря базе данных Nikto);
  • слабые конфигурации .htaccess, которые можно обойти;
  • наличие файлов резервных копий, раскрывающих конфиденциальную информацию (раскрытие исходного кода);
  • Shellshock (он же ошибка Bash);
  • открытые перенаправления;
  • нестандартные методы HTTP, которые могут быть разрешены (PUT).

Возможности:


  • поддержка прокси HTTP, HTTPS и SOCKS5;
  • аутентификация с помощью нескольких методов: Basic, Digest, Kerberos или NTLM;
  • возможность ограничить область сканирования (домен, папка, страница, URL-адрес);
  • автоматическое удаление одного из параметров в URL;
  • множественные меры предосторожности против бесконечных циклов сканирования (пример: ifor, ограничение значений для параметра);
  • возможность установки приоритета для изучения URL-адресов (даже если не находятся в области сканирования);
  • возможность исключить некоторые URL-адреса из сканирования и атак (например: URL logout);
  • импорт файлов cookie (получение их с помощью инструмента wapiti-getcookie);
  • возможность активировать / деактивировать проверку сертификатов SSL;
  • возможность извлечь URL из JavaScript (очень простой JS-интерпретатор);
  • взаимодействие с HTML5;
  • несколько вариантов управления поведением и ограничениями crawlera;
  • установка максимального времени для процесса сканирования;
  • добавление некоторых настраиваемых HTTP-заголовков или настройка пользовательского User-Agent.

Дополнительные возможности:


  • создание отчетов об уязвимостях в различных форматах (HTML, XML, JSON, TXT);
  • приостановка и возобновление сканирования или атаки (механизм сеанса с использованием баз данных SQLite3);
  • подсветка в терминале для выделения уязвимости;
  • разные уровни логирования;
  • быстрый и простой способ активации / деактивации модулей атаки.

Установка


Актуальную версию Wapiti можно установить 2 способами:


  • cкачать исходник с официального сайта и запустить скрипт установки, предварительно установив Python3;
  • c помощью команды pip3 install wapiti3.
    После этого Wapiti будет готов к работе.

Работа с инструментом


Для демонстрации работы Wapiti мы будем использовать специально подготовленный стенд sites.vulns.pentestit.ru, содержащий различные уязвимости (Injection, XSS, LFI/RFI) и прочие недостатки веб-приложений.


Информация предоставлена исключительно в ознакомительных целях. Не нарушайте законодательство!


Базовая команда для запуска сканера:


# wapiti http://sites.vulns.pentestit.ru/base_url/ <options>

При этом имеется довольно подробная справка с огромным количеством опций запуска, например:


--scope область применения
Если вместе с URL для сканирования указать параметр scope, то можно регулировать область сканирования сайта, указав как отдельную страницу, так и все страницы, которые получится найти на сайте.
-s и -x параметры добавления или удаления конкретных URL-адресов. Данные параметры полезны, когда необходимо добавить или удалить конкретный URL-адрес в процесса сканирования.
--skip указанный параметр с этим ключом будет сканироваться, но не будет атаковаться. Полезно, если есть какие-то опасные параметры, которые лучше исключить при сканировании.
--verify-ssl включение или отключение проверки сертификата.
Сканер Wapiti модульный. Однако, для запуска конкретных модулей, из числа тех, которые автоматически подключаются во время работы сканера, нужно использовать ключ -m и перечислять нужные через запятую. Если ключ не использовать, то будут по умолчанию работать все модули. В самом простом варианте выглядеть это будет следующим образом:


# wapiti -u http://sites.vulns.pentestit.ru/ -m sql,xss,xxe

Данный пример использования означает, что мы будем использовать только модули SQL, XSS и XXE при сканировании цели. Помимо этого, можно фильтровать работу модулей в зависимости от нужного метода. Например -m xss: get, blindsql: post, xxe: post. В таком случае модуль xss будет применяться к запросам, передаваемым методом GET, а модуль blibdsql к POST-запросам и т.д. Кстати, если какой-то модуль, который был включен в список, не потребовался во время сканирования или работает очень долго, то нажав комбинацию Ctrl+C можно пропустить использование текущего модуля, выбрав соответствующий пункт в интерактивном меню.


Wapiti поддерживает передачу запросов через прокси-сервер с помощью ключа -p и аутентификацию на целевом сайте через параметр -a. Также можно указать тип аутентификации: Basiс, Digest, Kerberos и NTLM. Для последних двух может потребоваться установка дополнительных модулей. Кроме того, можно вставлять в запросы любые заголовки (в том числе произвольный User-Agent) и многое другое.


Для использования аутентификации можно использовать инструмент wapiti-getcookie. C его помощью мы формируем cookie, которые Wapiti будет использовать при сканировании. Формирование cookie выполняется с помощью команды:


# wapiti-getcookie -u http://sites.vulns.pentestit.ru/login.php -c cookie.json

В процессе работы в интерактивном режиме отвечаем на вопросы и указываем необходимую информацию типа: логин, пароль и прочее:



На выходе получаем файл в формате JSON. Другой вариант добавить всю необходимую информацию через параметр -d:


# wapiti-getcookie - http://sites.vulns.pentestit.ru/login.php -c cookie.json -d "username=admin&password=admin&enter=submit"

Результат будет аналогичный:



При рассмотрении основного функционала сканера, конечным запросом для проведения тестирования веб-приложения в нашем случае стал:


# wapiti --level 1 -u http://sites.vulns.pentestit.ru/ -f html -o /tmp/vulns.html -m all --color -с cookie.json --scope folder --flush-session -A 'Pentestit Scans' -p http://proxy.office.pentestit.ru:3128

где среди прочих параметров:
-f и -o формат и путь для сохранения отчета;
-m подключение всех модулей не рекомендуется, т.к. будет сказываться на времени тестирования и размере отчета;
--color подсвечивать найденные уязвимости в зависимости от их критичности по версии самого Wapiti;
-c использование файла с cookie, сгенерированного с помощью wapiti-getcookie;
--scope выбор цели для атаки. Выбрав вариант folder будет сканироваться и атаковаться каждый URL, начиная с базового. Базовый URL должен иметь косую черту (без имени файла);
--flush-session позволяет проводить повторное сканирование, при котором не будут учитываться предыдущие результаты;
-A собственный User-Agent;
-p адрес прокси-сервера, если необходим.


Немного об отчете


Результат сканирования представлен в виде подробного отчета по всем найденным уязвимостями в формате HTML-страницы, в понятном и удобном для восприятия виде. В отчете будут указаны категории и число найденных уязвимостей, их описание, запросы, команды для curl и советы о том, как их закрыть. Для удобства навигации в названия категорий будет добавляться ссылка, кликнув по которой можно перейти к ней:



Существенный минус отчета отсутствие как таковой карты веб-приложения, без которой не будет понятно, все ли адреса и параметры были проанализированы. Также есть вероятность ложных срабатываний. В нашем случае в отчете фигурируют файлы бэкапов и потенциально опасные файлы. Их количество не соответствует действительности, так как подобных файлов на сервере не было:



Возможно, некорректно работающие модули исправят со временем. Также недостатком отчета можно назвать отсутствие окраски найденных уязвимостей (в зависимости от их критичности), или хотя бы их разделения по категориям. Единственное, как мы можем косвенно понять о критичности найденной уязвимости это применять параметр --color при сканировании и тогда найденные уязвимости будут окрашиваться различными цветами:



Но в самом отчете подобная окраска не предусмотрена.


Уязвимости


SQLi


Cканер частично справился с поиском SQLi. При поиске SQL-уязвимостей на страницах, где не требуется аутентификация, никаких проблем не возникает:



Не поучилось найти уязвимость на страницах, доступных только после аутентификации, даже с использованием валидных cookie, так как скорее всего после успешной аутентификации будет произведен "выход их сессии" и cookie станут недействительными. Если бы функция деавторизации была выполнена в виде отдельного скрипта, отвечающего за обработку этой процедуры, то можно было бы полностью исключить его через параметр -x, и тем самым предотвратить его срабатывание. В противном случае исключить его обработку не получится. Это проблема не конкретного модуля, а инструмента в целом, но из-за этого нюанса не удалось обнаружить несколько инъекций в закрытой области ресурса.


XSS


С заданной задачей сканер отлично справился и нашел все подготовленные уязвимости:



LFI/RFI


Сканер нашел все заложенные уязвимости:



В целом, несмотря на ложные срабатывания и пропуски уязвимостей, Wapiti, как бесплатный инструмент, показывает довольно неплохие результаты работы. В любом случае стоит признать, что сканер довольно мощный, гибкий и многофункциональный, а главное бесплатный, поэтому имеет право на использование, помогая администраторам и разработчикам получать базовую информацию о состоянии защищенности веб-приложения.


Оставайтесь здоровыми и защищенными!

Подробнее..

Перевод CRLF-инъекции и HTTP Response Splitting

23.07.2020 18:11:16 | Автор: admin

Привет, Хабровчане! В преддверии старта занятий в ближайшей группе профессионального курса Безопасность веб-приложений, мы подготовили для вас еще один полезный перевод.




Что такое CRLF?


Когда браузер отправляет запрос веб-серверу, тот отправляет ответ, который содержит заголовки HTTP-ответа и сам контент сайта, то есть тело ответа. HTTP-заголовки и HTML-ответ (содержимое сайта) разделяются определенной комбинацией специальных символов, а именно возвратом каретки (carriage return) и подачей строки (line feed). Сокращается это как CRLF.


Веб-сервер использует CRLF, чтобы понять, где начинается новый HTTP-заголовок и заканчивается старый. Также CRLF может сообщить веб-приложению или пользователю, что новая строка начинается в файле или в блоке текста. Символы CRLF это стандартное сообщение HTTP/1.1, поэтому оно используется любым типом веб-сервера, включая Apache, Microsoft IIS и другие.



Что такое CRLF-инъекция?


При CRLF-инъекции злоумышленник вставляет символы возврата каретки и ввода строки в пользовательский ввод, чтобы обмануть сервер, веб-приложение или пользователя, заставив его думать, что один объект завершился, а другой начался. Таким образом, CRLF-последовательности не являются вредоносными символами сами по себе, но могут быть использованы злоумышленниками для разделения HTTP-ответов (HTTP Response Splitting).


CRLF-инъекция в веб-приложениях


Для веб-приложений CRLF-инъекции могут иметь серьезные последствия, которые будут зависеть от того, как приложение работает с данными. Последствия могут варьироваться от раскрытия конфиденциальной информации до выполнения вредоносного кода, что напрямую влияет на уровень безопасности веб-приложения. На самом деле атака типа CRLF-инъекции может нанести серьёзный вред веб-приложению несмотря на то, что она не была включена в список OWASP Top 10. Например, таким образом можно изменять логи в панели администратора, как показано в примере ниже.


Пример CRLF-инъекции в логи


Представьте себе файл с логами в панели администратора с шаблоном выходного потока IP Время Путь, как показано ниже:


123.123.123.123 - 08:15 - /index.php?page=home

Если злоумышленник может сделать инъекцию CRLF-символов в HTTP-запрос, он может изменить выходной поток и фальсифицировать логи. Он может изменить ответ веб-приложения на что-нибудь подобное:


/index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit

Здесь %0d и %0a закодированные URL символы CR и LF. Таким образом после того, как злоумышленник вставит эти символы, а приложение выведет их, логи будут выглядеть следующим образом:


IP Время Путь


123.123.123.123 - 08:15 - /index.php?page=home&127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit

Таким образом, используя CRLF-инъекции, злоумышленник может подделать записи в логах, чтобы замести следы. Злоумышленник буквально делает hijacking страницы и изменяет ответ. Например, представим сценарий, в котором у злоумышленника есть пароль администратора и выполняется параметр restrictedaction, который может использовать только администратор.


Проблема заключается в том, что если администратор заметит, что неизвестный IP использует параметр restrictedaction, то поймет, что что-то не так. Однако пока это выглядит так, будто команда была выдана localhost (и, потому, вероятно, кем-то, кто имеет доступ к серверу, например, администратором), это не будет выглядеть подозрительно.


Часть запроса, начинающаяся с %0d%0a будет обработана сервером как один параметр. После этого появится еще один & с параметром restrictedaction, который будет воспринят сервером, как еще один параметр. По сути, это будет тот же самый запрос, что и:


/index.php?page=home&restrictedaction=edit

HTTP Response Splitting


Описание


Поскольку заголовок HTTP-ответа и его тело разделены символами CRLF, злоумышленник может попытаться внедрить их. Комбинация CRLFCRLF скажет браузеру, что заголовок заканчивается и начинается тело. Значит теперь он может записывать данные в тело ответа туда, где лежит HTML-код. Это может привести к уязвимости межсайтового скриптинга.


Пример HTTP Response Splitting, приводящего к XSS


Представьте, что приложение устанавливает собственный заголовок, например:


X-Your-Name: Bob

Значение заголовка задается с помощью GET-параметра name. Если нет кодировки URL-адреса и значение просто содержится в заголовке, то злоумышленник может вставить вышеупомянутую комбинацию CRLFCRLF, чтобы сообщить браузеру о начале тела запроса. Так он может вставить данные, например, полезную нагрузку XSS:


?name=Bob%0d%0a%0d%0a<script>alert(document.domain)</script>

Вышеуказанное выведет окно оповещения в контексте атакуемого домена.


Инъекция в HTTP-заголовки


Описание


С помощью CRLF-инъекции, злоумышленник также может вставлять HTTP-заголовки, которые могут быть использованы для обхода механизмов безопасности, таких как XSS-фильтр браузера или политики одинакового источника (same-origin-policy). Так злоумышленник может получить конфиденциальную информацию, такую как CSRF-токены. Он даже может установить файлы cookie, которые могут быть эксплуатированы путем входа жертвы в учетную запись злоумышленника или использования уязвимости межсайтового скриптинга (XSS).


Пример инъекции в HTTP-заголовок для извлечения конфиденциальных данных


Если злоумышленник сможет сделать инъекцию в HTTP-заголовок, который активирует CORS (Cross Origin Resource Sharing), то он сможет использовать javascript для доступа к ресурсам, защищенным SOP (Same Origin Policy), которая запрещает сайтам из разных источников получать доступ друг к другу.


Последствия CRLF-инъекции


Последствия CRLF-инъекции варьируются и могут включать в себя все последствия использования XSS и раскрытия конфиденциальной информации. Таким способом можно деактивировать некоторые ограничения системы безопасности, такие как фильтры XSS и Same Origin Policy в браузерах жертвы, делая их уязвимыми к вредоносным атакам.


Как предотвратить CRLF/HTTP-инъекции заголовков в веб-приложениях


Лучший метод предотвращения это не использовать ввод данных пользователем непосредственно в заголовок ответа. Если это невозможно, вы всегда должны использовать функцию для кодирования специальных символов CRLF. Еще одна хорошая практика безопасности это обновление языка программирования до версии, которая не позволяет делать инъекции CR и LF внутри функций, которые устанавливают HTTP-заголовки.


Таблица классификации уязвимостей и их степени тяжести





Подробнее о курсе Безопасность веб-приложений



Подробнее..

Что нам стоит WAF настроить

22.12.2020 12:11:10 | Автор: admin


Занимаясь разработкой или обслуживанием веб-приложений, в какой-то момент времени приходится сталкиваться с необходимостью использовать WAF (Web Application Firewall). Если опыта работы с такого класса решением у вас нет, я расскажу, как упростить задачу, а также поделимся советами и фишками. В качестве инструмента будем рассматривать Nemesida WAF Free бесплатную версию Nemesida WAF.

Визуализация, или начнем с конца


Наблюдать за работой Nemesida WAF Free можно через браузер, поэтому после того, как система будет настроена, мы получим доступ к веб-интерфейсу, в котором будет доступна информация заблокированных атаках, причинах блокировки, информации об IP-адресах и т.д. Кроме этого будут доступны разделы со сводной статистикой в виде графиков, диаграмм и данными по трафику, получаемыми от модуля VTS (если он у вас настроен).





Приступаем к установке.

Установка Nemesida WAF Free


Несмотря на то, что бесплатная версия ответвление полноценной, она содержит большой набор возможностей для выявления, блокирования и визуализации атак на веб-приложения. Под веб-приложением подразумеваем все, что построено на протоколе HTTP: сайты, личные кабинеты, интернет-магазины, площадки для обучения, API и все остальное.

В предыдущем абзаце я специально разделил функционал блокирования атак на выявления и блокирование, поскольку есть 2 (даже три) режима работы продукта: IDS, IPS и PseudoIDS (режим LM).

Режим IDS


IDS режим позволяет использовать продукт на копии трафика, выявляя, но не блокируя атаки. Такой режим работы полезен, например, для первичного запуска или для пассивного мониторинга, чтобы исключить любое блокирование запросов. Для примера настройки будем использовать Nginx для передающего сервера (хотя можно использовать любой другой, например, Apache2).

Настройка передающего сервера:

location / {    mirror /mirror;    ...}location = /mirror {    internal;    proxy_pass http://192.168.0.1$request_uri;}
(вместо 192.168.0.1 необходимо указать адрес сервера с установленным Nemesida WAF)

После внесения изменений и перезапуска веб-сервера, поступающие на этот сервер запросы будут транслироваться на сервер 192.168.0.1 с установленным Nemesida WAF (его настройка проста и будет описана ниже). Такая схема работы позволяет мониторить атаки без их блокирования, но в то же время, без воздействия на основной сервер.

Режим IPS и PseudoIDS


Остальные 2 режима работы предполагают использование WAF вразрез, при этом в режиме IPS выявленные инциденты безопасности блокируются, в режиме PseudoIDS фиксируются, но не блокируются. Последний режим удобен тем, что переключение между этими двумя режими происходит с помощью простых опций: nwaf_ip_lm или nwaf_host_lm, а также есть возможность перевода в PseudoIDS режим как по имени сервера (опция nwaf_host_lm), так и по IP-адресу пользователя сайта (опция nwaf_ip_lm).

Вообще, в Nemesida WAF Free предусмотрено множество параметров для тонкой настройки системы: гибкий функционал создания собственных правил блокировок и исключений, возможность добавлять IP клиента в список исключений, опция настройка бана для всех и для каждого отдельного виртуального хоста и т.д. Всем этим хозяйством можно управлять через конфигурационный файл в бесплатной версии, а в полноценной еще и через вызовы API.

Вернемся к процедуре установки. Nemesida WAF представлен в виде нескольких компонентов:

  • Динамический модуль для Nginx
  • Nemesida WAF API (принимает события от Nemesida WAF и помещает их в Postgres для последующего вывода в ЛК или интеграции с SIEM-системами)
  • Личный кабинет (веб-интерфейс для мониторинга за инцидентами)
  • Модуль машинного обучения Nemesida AI
  • Сканер уязвимостей Nemesida WAF Scanner
  • Nemesida WAF Signtest веб-интерфейс для управления модулем машинного обучения

В Nemesida WAF Free нам потребуются только первые три сам динамический модуль, Nemesida WAF API и Личный кабинет. Все компоненты доступны в виде установочных дистрибутивов и позволяют подключать Nemesida WAF к уже установленному экземпляру Nginx, начиная с версии 1.12 (поддерживаются Stable, Mainline и Plus версии Nginx).

Динамический модуль Nemesida WAF


Для тех, кто устанавливает дистрибутив не в первый раз, процесс установки и запуска динамического модуля занимает примерно 5-10 минут. Динамический модуль Nemesida WAF можно подключить к уже установленному Nginx (или скомпилированному из исходников с собственными модулями).

Репозитории Nemesida WAF доступны для следующих ОС: Debian 9/10, Ubuntu 16.04/18.04/20.04, Centos 7/8. На Youtube-канале опубликованы видео-инструкции по установке и первичной настройке компонентов. Рекомендуем ознакомиться с одной из них, но установку и настройку советуем производить по документации на основном сайте, поскольку некоторые параметры могут устаревать, другие добавляться.



После того, как Nginx будет настроен, подключите соотвествующий вашей ОС репозиторий Nemesida WAF и приступайте к установке. Обновление продукта производится также из репозитория. Инструкция по установке доступна по ссылке: github.com/nemesida-waf/nemesida_waf_free.

Nemesida WAF API и Личный кабинет


После того, как динамический модуль будет установлен и запущен, пора переходить к установке оставшихся двух компонентов: Nemesida WAF API и Личный кабинет.

Nemesida WAF API представлен в виде API, написанного с использованием Flask, и предназначен для приема событий от Nemesida WAF, Nemesida WAF Scanner и Nemesida AI с последующим помещением этих событий в БД. В качестве СУБД используется PostgreSQL. В бесплатной версии Nemesida WAF на БД будут передаваться только информация о заблокированных запросах. Динамический модуль Nemesida WAF позволяет активировать встроенное API (Nemesida WAF MGMT API), предназначенное для управления (все параметры, используемые модулем, можно менять через API), но этот функционал доступен только в полноценной версии.

После того, как Nemesida WAF API будет настроен и подключен к PostgreSQL, пора приступать к запуску Личного кабинета. Согласно документации производим установку, настройку, выполняем миграцию, указываем пользователя и пароль для входа.

На наш взгляд, установка двух последних компонентов сложнее, чем первого, поэтому для первого старта мы подготовили Virtual Appliance (виртуальный диск с Debian 10 и компонентами Nemesida WAF, 3GB до распаковки), а также сделали 2 Docker-образа: для динамического модуля и для Nemesida WAF API/Личного кабинета.

Ну что, самая скучная часть позади, теперь можем проверить WAF в действии.

Первый hack


Чтобы проверить работу уже настроенного WAF, не обязательно вспоминать различные вариации атак. Мы создали тестовую сигнатуру, которая позволит проверить, работает ли Nemesida WAF и отображаются ли заблокированные атаки в ЛК. Актуальный набор используемых сигнатур всегда можно посмотреть на rlinfo.nemesida-security.com.

Отправляем запрос (я это сделал через консоль, но лучше делать через браузер для наглядности):

curl --noproxy '*' example.com/nwaftest

В ответ получаем код ответа 403:

<html><head><title>403 Forbidden</title></head><body><center><h1>403 Forbidden</h1></center><hr><center>nginx/1.18.0</center></body></html>

А в ЛК через несколько секунд должна появиться атака:



Если запрос не заблокировался WAF некорректно подключен или настроен (возможно, адрес или хост добавлен в WL/LM), если блокирование запроса произошло, но в ЛК информации нет проверьте корректность настройки взаимодействия с Nemesida WAF API и ЛК. В любом случае, всегда можно попросить помощи на форуме.

Кастомная 403 страница


По умолчанию 403 страница (страница с 403 кодом ответа) невзрачна и скупа на информацию. Nemesida WAF в связке с Nginx позволяет ее сделать красивой и более информативной.

Чтобы ваш сервер отдавал такую страницу, необходимо:

1. Создать файл конфигурации для кастомных страниц (например, в /etc/nginx/snippets/custom_pages.conf);

Добавить необходимые параметры в Nginx
## Error pageserror_page      403 405 = 222 /403.html;## Locationslocation /403.html {        internal;        root /var/www/custom_pages/;        proxy_no_cache 1;        proxy_cache_bypass 1;        add_header X-Request-ID $request_id always;        add_header Host $host always;        add_header X-Remote-IP $remote_addr always;        add_header NemesidaWAF-BT $nwaf_block_type always;}


Описание:


error_page 403 405 = 222 /403.html; задаем кастомный 222 код ответа для кодов ответа 403 и 405 и возвращаем локацию /403.html;

Определяем локацию /403.html как внутреннюю (то есть если обратиться к ней example.com/403.html она не будет доступна), добавляя специальные заголовки для вывода ID запроса ($request_id), виртуального хоста ($host), к которому обращаемся, IP посетителя ($remote_addr) и реакцию (причину блокировки) Nemesida WAF ($nwaf_block_type). У Nemesida WAF есть несколько типов блокировки, например, 1 и 2 запрос заблокирован сигнатурным анализом, 3 модулем машинного обучения, 4 антивирусом и т.д.




2. Подключить созданный файл:

Подключить созданный файл к конфигурации Nginx
Пример подключения файла конфигурации кастомных страниц в файле с виртуальным хостом (например, в /etc/nginx/conf.d/example.com.conf):
server {        ...        ## Custom pages        include                 snippets/custom_pages.conf;       ....}


3. Создать кастомную страницу (например, /var/www/custom_pages/403.html) следующего содержания (для примера):

Пример кастомной страницы 403
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://personeltest.ru/away/www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>    <meta http-equiv="Cache-Control" content="no-cache">    <meta http-equiv="refresh" content="7; URL=/" />    <style type="text/css">        .error {color:#000; font-family:Arial, sans-serif; text-align: center; position: absolute; top: 50%; left: 50%; -moz-transform: translateX(-50%) translateY(-50%); -webkit-transform: translateX(-50%) translateY(-50%); transform: translateX(-50%) translateY(-50%);}        .error-fon {font-weight:bold; color:#d0e3f7;}        .error-text-top {font-size:16px; color:#434141}        hr { display: block; height: 10px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }    </style>    <title>403 Access denied</title></head><body><div class="error">    <div class="error-fon">        <font style="font-size:240px;">403</font>        <br>        <font style="font-size:40px;">ACCESS IS BLOCKED</font>    </div>    <br>    <div class="error-text-wrap">        <div class="error-text-top">            <p>            <hr>            <p style="text-align: justify;">              Suspicious activity. If the request is blocked by mistake, please email us at <a href="mailto:blocked@example.com">blocked@example.com</a> and  be sure to include technical information below (domain, IP, request ID), or try again in 5 minutes.              <br><br>              Подозрительная активность. Если запрос заблокирован по ошибке, пожалуйста, напишите нам на <a href="mailto:blocked@example.com">blocked@example.com</a>, обязательно указав техническую информацию ниже (domain, IP, request ID), или повторите попытку через 5 минут.            </p>    <hr>            <table style="text-align: left; margin: auto">                <tr>                    <td>                        <code style="font-size:14px;"> Domain:</code>                    </td>                    <td>                        <code style="font-size:14px;"> <span id="domain">-</span> </code>                    </td>                </tr>                <tr>                    <td>                        <code style="font-size:14px;"> IP address:</code>                    </td>                    <td>                        <code style="font-size:14px;"> <span id="ip">-</span> </code>                    </td>                </tr>                <tr>                    <td>                        <code style="font-size:14px;"> Request ID:</code>                    </td>                    <td>                        <code style="font-size:14px;"> <span id="id">-</span> </code>                    </td>                </tr>            </table>            </p>        </div>        <script type="application/javascript">            function replace() {                window.location.replace('/');            }            const req = new XMLHttpRequest();            req.open('GET', document.location, false);            req.send(null);            const req_id = req.getResponseHeader('x-request-id');            const req_domain = req.getResponseHeader('host');            let req_ip = req.getResponseHeader('x-remote-ip');            const req_bt = req.getResponseHeader('nemesidawaf-bt');            if (req_bt == 6)            {                req_ip = req_ip  + " (banned)";            }            if (req_bt ==7)            {                req_ip = req_ip  + " (banned, bruteforce)";            }            document.getElementById('domain').innerHTML = req_domain;            document.getElementById('ip').innerHTML = req_ip;            document.getElementById('id').innerHTML = req_id;            if (req_bt != 6 & req_bt !=7)            {                setTimeout(replace,3000);            }        </script>    </div></div></body></html>



После перезапуска Nginx (с установленным Nemesida WAF) все стараницы, имеющие код ответа 403, будут выглядеть следующим образом:



При этом кастомная страница будет обновляться каждые 7 секунд, и если IP клиента не будет забанен, то возвратится корневая страница сайта.

Автоматический бан


Вы, наверняка слышали или даже используете системы автоматического бана вроде Fail2ban и знаете об их достоинствах и недостатках. В Nemesida WAF используется встроенный механизм бана, позволяющий устанавливать произвольный период блокировки для всех виртуальных хостов сервера и для определенных, как пожелаете. Блокирование происходит по IP-адресу, а для управления доступны следующие опции:

  • Количество атак с IP, которое приводит к блокированию;
  • Период блокирования;
  • Виртуальный хост, на который направлены атаки (опционально).

Управление параметром автоматического блокирование осуществляется с помощью параметра nwaf_limit, доступного в файле /etc/nginx/nwaf/conf/global/nwaf.conf. Использование параметра будет полезным в случаях, когда сайт подвергается сканированию на уязвимости или при попытках раскрутить обнаруженную уязвимость.

Списки исключений (While lists)


Работа WAF построена по принципу анализа поступающих на сервер запросов и реакции в случаях, когда в них содержатся признаки атаки или аномалий. Применение алгоритмов машинного обучения вкупе с улучшенной технологией нормализации в полноценной версии Nemesida WAF позволяет выявлять такие атаки с точно и с ультра-минимальным количеством ложных срабатываний (порядка 0.01%), но в бесплатной версии для снижения количества ложных срабатываний мы упираемся в ограничения, заложенные в архитектуру сигнатурного анализа. Таким образом, бесплатная версия имеет большее количество ложных срабатываний, и для решения этой проблемы приходится использовать списки исключений (или white lists). В Nemesida WAF также доступно создание правил исключений.

Чаще всего ложные срабатывания появляются, когда администратор/модератор веб-ресурса производит обновление или изменение через веб-интерфейс, передавая в теле запроса нетипичные для пользователя конструкции:
...
$html = curl_exec($ch);
curl_close($ch);
return json_decode($html,true);
...


Легитимный запрос будет заблокирован, поскольку содержит вхождение функции json_decode(), при этом такие запросы не характерны для обычных посетителей веб-ресурса.

В случаях, когда администраторы приложений не могут взаимодействовать с ним в обход WAF, можно добавить IP-адрес, с которого они обращаются к ресурсу, в список исключений или же перевести адрес в режим PseudoIDS (опция nwaf_ip_lm) для фиксации событий без блокирования. Но с такими действиями всегда нужно быть достаточно осторожными.

Кстати, Nemesida WAF позволяет добавлять не только IP-адреса, но и подсети, если в этом появляется необходимость.

Заключение


Не зависимо от того, насколько качественно на ваш взгляд написан код, применяются в нем функции фильтрации ввода и специальные фреймворки вроде HTML Purifier, призванные удалять если не весь вредоносный код, то большую его часть, необходимо использовать WAF для повышения уровня защищенности.

Если использовать WAF предполагается впервые, или вы устали от бесконечных добавлений правил исключения, рекомендуем попробовать бесплатную Nemesida WAF Free. Для профессионального использования (блокирование сложных атак, атак методом перебора, СМС флуда; поиск уязвимостей; наличие системы виртуального патчинга и т.д.) требуется полноценная версия Nemesida WAF с модулем машинного обучения и сканером уязвимостей. Тем не менее, для большинства нецелевых атак и массовых сканирований Nemesida WAF Free будет хорошим и удобным инструментом.

В статье я постарался раскрыть ситуации, чаще других возникающие при использовании решений такого класса. Буду рад, если в комментариях вы вспомните еще.
Подробнее..

Я твой WAF payload шатал

09.02.2021 14:04:30 | Автор: admin

Пару недель назад команда Vulners опубликовала сравнение нескольких популярных WAF. Поймав себя на мысли - "а как оценивать качество его работы?", я решил разобрать подробнее тему security-тестов и критериев оценки Web Application Firewall. Статья пригодится, в первую очередь, тем, кому интересна тема веб-безопасности, ровно как и счастливым обладателям WAF.

Критерии оценки

Сравнивая различные решения, мы привыкли ориентироваться на показатели скорости и стабильности работы, удобства настройки, управления, обновления и масштабирования. В контексте WAF к этому списку нужно добавить и точность выявления атак - количество пропусков (False Negative) и ложных срабатываний (False Positive).

Зоопарк из UTF-8

Чтобы понять, сколько тонкостей существует при анализе запросов, рассмотрим в качестве примера особенность работы с UTF-8. Если в поисковой строке сайта мы наберем что-то в английской раскладке, то, скорее всего, будет использоваться набор Basic Latin.

UTF-8: Basic LatinUTF-8: Basic Latin

При этом запрос, который будет передаваться в веб-приложение, выглядит следующим образом: GET /?s=test

Ищем "test", фиксируем выводИщем "test", фиксируем вывод

Теперь попробуем использовать набор символов из Halfwidth and Fullwidth Forms (ищем тот же test, только в другой кодировке).

UTF-8: Halfwidth and Fullwidth FormsUTF-8: Halfwidth and Fullwidth Forms

Выглядит так, будто мы использовали пробел между символами, но на самом деле - нет.

Используем другой набор символов и получаем тот же результат в поисковой выдачеИспользуем другой набор символов и получаем тот же результат в поисковой выдаче

Запрос (в URLencode): GET /?s=%EF%BD%94%EF%BD%85%EF%BD%93%EF%BD%94

При этом оба запроса (с разными наборами символов) приведут к выводу одного и того же результата - объекта, содержащего вхождение "test", хотя используем разный набор символов.

Меняем "test" на "tes1", чтобы убедиться в корректности работы поиска - ничего не выводитсяМеняем "test" на "tes1", чтобы убедиться в корректности работы поиска - ничего не выводится

Сперва мы подумали, что само веб-приложение (проверяли на WordPress, но отработает и на других) производит нормализацию данных до Basic Latin, но в итоге выяснили, что данные передаются без нормализации напрямую в БД. Есть ограничения, связанные с использованием Halfwidth and Fullwidth Forms - его нельзя применять при написании оператора SELECT, но можно использовать, к примеру, в конструкции LIKE '%Текст в Halfwidth and Fullwidth Forms%'. Этот набор символов может использоваться не только при составлении SQL-запросов. Есть примеры его применения при поиске XSS и т.д.

Данная особенность позволяет выполнять обход WAF, если он не нормализует символы до Basic Latin. Существует множество техник обхода, и было бы здорово создать инструмент, позволяющий разом их все проверить.

WAF Bypass: инструментарий

На github можно найти множество решений, позволяющих тестировать WAF, есть даже специальные аккаунты, производящие сбор такого инструментария, например waflib.

Помимо основного Unit-теста, который используем для тестирования Nemesida WAF перед каждым релизом (тест на каждую версию ОС занимает примерно 30 часов), мы разработали собственный waf-bypass, позволяющий оценить точность выявления атак. Но всегда интересно и полезно проверить работу продукта с использованием сторонних решений, поэтому в качестве второго (а в рамках этой статьи - основного) инструмента я выбрал Go Test WAF, размещенный в git-репозитории пользователя wallarm.

Для использования waf-bypass, написанного на Python3, необходимо клонировать проект, установить зависимости и запустить скрипт:

git clone https://github.com/nemesida-waf/waf_bypass.git /opt/waf-bypass/python3 -m pip install -r /opt/waf-bypass/requirements.txtpython3 /opt/waf-bypass/main.py --host='example.com'

Если следовать документации, Go Test WAF можно запускать из докер-контейнера, что я и сделал:

docker build . --force-rm -t gotestwafdocker run gotestwaf --url='http://example.com'

Если проводить сравнение инструментов исходя из их использования, то Go Test WAF работает быстрее (за счет многопоточности) и содержит небольшой набор для проверки False Positive. Учтем это в следующих релизах waf-bypass.

Вижу цель, иду к ней!

Тестировать буду 2 версии: Nemesida WAF (полноценную с машинным обучением) и Nemesida WAF Free (бесплатную, но только с сигнатурным анализом).

Когда увидел результаты тестов WAFКогда увидел результаты тестов WAF

В обзоре Vulners, с которым можно ознакомиться по ссылке, в финальной таблице максимальным результатом WAF, полученным путем тестирования Go Test WAF, являлось значение 83.06%, при этом ModSecurity набрал 49.82%. Интересно посмотреть, сколько сможет набрать Nemesida WAF и Nemesida WAF Free.

Nemesida WAF Free bypass

Напомню, анализ в Nemesida WAF Free производится только сигнатурным методом, при этом эта версия имеет качественно написанную и автоматически обновляемую базу сигнатур (ознакомиться с которой можно по ссылке), а также Личный кабинет (также устанавливается локально) - веб-интерфейс для визуализации событий. Nemesida WAF Free представлена в виде динамического модуля, который можно подключать как к новому экземпляру Nginx, так и к уже установленному (или скомпилированному с собственными флагами). Обновляется Nemesida WAF Free из репозитория и доступен для Debian, Ubuntu и CentOS, "быстрый старт" займет 5-7 минут для опытных пользователей.

Часть содержимого первой страницы Личного кабинета Nemesida WAF FreeЧасть содержимого первой страницы Личного кабинета Nemesida WAF Free

Запускаем Go Test WAF, смотрим результаты.

Nemesida WAF Free: GoTestWAFNemesida WAF Free: GoTestWAF

45.47% и 0 ложных срабатываний - довольно неплохо, учитывая, что часть тестов содержит пейлоады в Base64, которые не декодируются в Nemesida WAF Free. Теперь ловким движением руки и не меняя настроек Nemesida WAF Free, проверим его с помощью waf-bypass:

Nemesida WAF Free: waf-bypassNemesida WAF Free: waf-bypass

325 пропусков и 1054 заблокированных пейлоадов. Пытаемся запомнить результаты и двигаемся дальше.

Nemesida WAF bypass

Помимо функционала нормализации данных, Nemesida WAF позволяет производить декодирование запросов в различных кодировках, в том числе и в Base64, поэтому было особенно интересно, какой скор он сможет набрать. Начнем с waf-bypass, запускаем, смотрим результаты:

Nemesida WAF: waf-bypassNemesida WAF: waf-bypass

4 пропуска, остальные запросы заблокированы. Здорово, но все-таки waf-bypass - наша разработка, поэтому очень интересно, какие результаты будут получены при тестировании с использованием Go Test WAF. Запускаем Go Test WAF, смотрим результаты:

Nemesida WAF: gotestwafNemesida WAF: gotestwaf

Проверка заняла немного больше времени, но и показатели в 2 раза лучше - 94.45% - то есть на 11.39% выше, чем наилучший результат в обзоре Vulners. Почти отсутствуют пропуски, но из 8 False Positive заблокировано 5, а хотелось, чтобы 0, поэтому будем разбираться. Сперва посмотрим содержимое всех 8 FP-запросов:

- union was a great select- 'h2<h1'- D'or 1st parfume- "1) a-b=c"- john+or@var.es- DEAR FINN,--I think it would do; copy should reach us second post- The Senora found herself a heroine; more than that, she became aware time he came.

Из них ошибочно заблокированные:

- f971e9ace6=union was a great select- 24d85a0990=D'or 1st parfume- 48105a7f77=john+or@var.es- 18196a6191=DEAR FINN,--I think it would do; copy should reach us second post- e7e5421304=The Senora found herself a heroine; more than that, she became aware

Чтобы понять, почему запросы были заблокированы, нужно понимать, как работает модуль машинного обучения в Nemesida WAF - построение моделей происходит за счет использования 2-х наборов обучающих выборок - базы атак и базы условно чистого трафика. Чем меньше реальных запросов попало в обучающую выборку - тем больше будет False Positive. В данном случае в обучающей выборке не попадались такие или схожие запросы, кроме этого, они содержат признаки атаки (например, --, или union ... select, или 'or), поэтому были заблокированы. Используя модуль дообучения Nemesida WAF Signtest, производим экспорт False Positive в один клик, после чего они войдут в обучающую выборку и не будут учитываться - как сами, так и другие, схожие с ними запросы.

Запускаем тест заново:

Nemesida WAF: gotestwaf (с FP в обучающей выборке)Nemesida WAF: gotestwaf (с FP в обучающей выборке)

Несмотря на то, что содержимое запросов имеет динамический контент 24d85a0990 в 24d85a0990=D'or 1st parfume, ложные срабатывания отсутствуют, при этом количество пропусков не изменилось. Скоринг стал меньше, а должен был увеличиться - вероятно, ошибка в самом Go Test WAF.

Чтобы разобраться в пропусках, я настроил журналирование Nginx таким образом, чтобы фиксировать содержимое запросов, не получивших код ответа 403:

Расширенное журналирование Nginx

Если вы хотите проверить, какие запросы не были заблокированы - активируйте расширенное журналирование в Nginx:

1. В секцию http {} добавив:

logformat extended '$msec $requesttime $timeiso8601 $timelocal $requestid $status $remoteaddr $scheme $host $request $httphost $httpcookie $httpuseragent $contentlength $contenttype $httporigin $requestbody\n';

и

map $status $loggable { 403 0; default 1; }

2. В секцию server {} файла виртуального хоста (например, /etc/nginx/conf.d/1.conf) добавив:

access_log /var/log/nginx/extended_access.log extended if=$loggable;

После перезапуска Nginx в /var/log/nginx/extended_access.log будут попадать все незаблокированные запросы (не получившие код ответа 403).

Фактически пропусков было всего 3, и об их критичности судите сами:

GET /AEAEAFAEAEAFetcAFpasswd

GET / QUIT /

GET /foo_bar=foo bar=foo[barfoo[bar

Визуализация атак: графики, поиск, отчеты

Вне зависимости от того, используется ли Nemesida WAF или Nemesida WAF Free, к любому из них можно подключить Личный кабинет - веб-интерфейс, позволяющий визуализировать работу модулей:

Личный кабинет: графики и диаграммыЛичный кабинет: графики и диаграммыЛичный кабинет: графики и диаграммыЛичный кабинет: графики и диаграммыЛичный кабинет: графики и диаграммыЛичный кабинет: графики и диаграммыNemesida WAF: информация об атакахNemesida WAF: информация об атаках

В Личном кабинете есть и другие разделы - информация по атакам методом перебора и SMS-флуде, статистика работы сканера уязвимостей и т.д. Также можно выгрузить общий отчет в формате PDF или CSV. Личный кабинет написан на Django и устанавливается локально, так же, как и другие модули.

И пока на версусе решают, кто из них круче...

Как я писал выше, есть несколько показателей оценки качества работы ПО, для WAF одним из основных критериев является количество ложных срабатываний и пропусков, и было очень увлекательно и полезно выполнять проверки с использованием сторонних байпасеров, за что отдельная благодарность разработчикам Go Test WAF.

Кроме этого, такие тесты позволяют наглядно понять разницу между сигнатурным анализом и машинным обучением, необходимость использовать различные механизмы нормализации и декодирования. Но если по какой-то причине использовать коммерческий продукт нет возможности, всегда можно воспользоваться ModSecurity, NAXSI или Nemesida WAF Free с красивым и удобным Личным кабинетом. Nemesida WAF Free доступен в виде установочных дистрибутивов для Debian/Ubuntu/CentOS, в виде Virtual Appliance для KVM/VirtualBox/VMWare и образа для Docker-контейнера. Больше информации можно найти здесь.

Спасибо, что дочитали, если появятся какие-то мысли - можно обсудить в комментариях.

Подробнее..

Чек-лист устранения SQL-инъекций

10.03.2021 14:15:34 | Автор: admin

В прошлой статье мы уже рассматривали тему SQL-инъекций.

Предлагаем снова остановиться на этой проблеме, так как этот тип атак наиболее распространенный и один из самых опасных. В данной статье мы расскажем о способах выявления SQLi и предложим подробную инструкцию по их ликвидации.

SQL-инъекция - это попытка злоумышленника изменить запрос кбазе данных для ее компрометации.

Возможные SQLi:

  • Соблюдение условия WHERE к истинному результату при любых значениях параметров.

  • Объединение запросов через оператор UNION.

  • Комментирование части запроса.

Для того, чтобы обнаружить SQL-инъекции, тестировщику необходимо понимать функциональные требования, триггеры, бизнес-логику, основной сценарий веб-приложения и т. д.

Как выявлять SQL-инъекции

Статья носит информационный характер. Не нарушайте законодательство.

Ручной поиск

Шаг 1.

Во все параметры подставляем спецсимволы (кавычки, двойные кавычки и т.д. ). В первую очередь проверяются параметры, принимающие в качестве аргументов пользовательский ввод. Если при передаче сервер вернул ошибку, то есть подозрение на наличие инъекции. Когда веб-приложение не отреагировало на спецсимволы, то возможны 2 причины:

  • SQL-инъекции нет.

  • Отключен вывод ошибок на веб-сервере.

Пример:

http://example.com/?id=1

http://example.com/?id=1

http://example.com/?id=1)

и т. д.

Шаг 2.

Если инъекция обнаружена, то используем метод UNION-Based, который применяется, если SQL-инъекция возникает в запросе с использованием оператора SELECT. Благодаря такому методу можно объединить два запроса в один набор результатов. Особенность его заключается в том, что он будет работать только в случае, если количество столбцов, возвращаемых первым запросом, будет равно их количеству, возвращаемых во втором запросе. Для определения количества столбцов можно воспользоваться 3 методами:

  1. Добавление столбца при каждой итерации проверки. Это не совсем удобно, так как их может быть бесконечное количество.

    Пример:

    ?id=1' union select null -- ?id=1' union select null,null -- ?id=1' union select null,null,null --

и т. д.

Поиск количества столбцов

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

2. Использование оператора ORDERBY для определения количества столбцов. В данном случае нужно опираться на появление ошибки о несоответствии количества столбцов в запросе. Стоит начать с большого количества столбцов и уменьшать их вдвое при каждой итерации проверки. Если количество не будет соответствовать фактическому значению, то вернется ошибка:

?id=1' order by 20 -- ?id=1' order by 10 -- ?id=1' order by 5 --

и т.д.

Проверка с помощью order by

3. Применение оператора GROUP BY, который основывается на обратном методе проверки, в отличие от ORDERBY.

Пример:

?id=1' group by 5 -- ?id=1' group by 10 -- ?id=1' group by 20 --

и т. д.

Теперь, когда мы знаем, сколько столбцов имеет текущая таблица, используем UNION SELECT, чтобы увидеть, какой столбец уязвим.Уязвимым столбцом будет являться тот, данные которого отображаются на странице.

Пример:

?id=1 union select 1,2,3,4 --

Когда уязвимый столбец найден, вместо его названия можем указать полезные команды для сбора информации о СУБД и получения данных из интересующих таблиц:

?id=1 union select 1,null,version(),null - версия СУБД
?id=1 union select 1,null,database(),null - текущая база данных
?id=1 union select 1,null,@@port,null - порт, используемый СУБД
?id=1 union select 1,null,user(),null - пользователь СУБД
?id=1 union select 1,null,table_name,null from information_schema.tables список таблиц с применением information_schema.

Шаг 3.

Если наличие инъекции при подстановке спецсимволов не подтвердилось, то воспользуемся одной из техник поиска слепых инъекций:

  • Boolean Based SQLi

Такой метод эксплуатации слепых SQL-инъекций, при котором информация извлекается исходя из реакции на условные выражения. Атака называется слепой в тех случаях, когда нет видимой реакции от веб-приложения. Например, при подстановке кавычек в потенциально уязвимый параметр, ошибка, связанная с нарушением логики SQL-запроса, не появляется, а страница отображается без изменений.


Пример:

?id=1 and 1=1

В этом случае содержимое страницы останется неизменным, потому что оба условия в операторе SQL истинные. Если изменить условие на 1 = 2, то ничего не возвращается, так как 1 не равно 2, а должны выполняться оба условия.

?id=1 and 1=2
  • Time Based SQL-injection

Существует метод, при котором используются функции СУБД (например, SLEEP), вызывающие задержку ответа от базы данных. Такой способ также применяется для эксплуатации слепых инъекций, когда отсутствует какой-либо вывод информации, в том числе в случаях, описанных вBoolean Based SQL-injection.

Пример:

?id=1 and sleep(10)

Функция sleep() выполнится на стороне СУБД при условии обращения к записи с id=1 соответствующей таблицы. Возможно использование функций BENCHMARK или WAITFOR.

Пример:

BENCHMARK(5000000,ENCODE('MSG','by 5 seconds'));

id=1' waitfor delay '00:00:10' (MS-SQL);

pg_sleep() (PostgreSQL).

  • Stacked Query Based SQL-injections

В SQL точка с запятой указывает на конец запроса, после которого можно начать новый.Это позволяет выполнять несколько операторов в одном вызове сервера базы данных.В отличие от UNION-Based, который ограничен операторами SELECT,составные запросы могут использоваться для выполнения любой процедуры SQL. Стоит также отметить, что не все БД поддерживают эту функцию. Например, при использовании MySQL и SQLite3, нельзя воспользоваться этими операторами запросов, но в PostrgeSQL такая возможность есть.

Пример:

?id=1; delete from table_name

Автоматизированный анализ

SQLmap - мощный кроссплатформенный консольный инструмент для поиска, эксплуатации SQL-инъекций любого вида и сложности, написанный на языке Python.

Основные функции SQLmap:

  • полная поддержка системы управления базами данных (MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB и HSQLDB) и прямое подключение к ним;

  • автоматическое распознавание форматов хешей паролей и предложение их подбора с использованием атаки по словарю;

  • поддержка выполнения произвольных команд на ОС сервера БД, получение их стандартного вывода при использовании MySQL, PostgreSQL или Microsoft SQL Server и многое другое.

Основные ключи, которые используют при работе с MySQL : --dbs, -D,T,C, --level,--risk, --random-agent.

Пример:

# sqlmap -u http://example.com/?id=1 --dbs

# sqlmap -u http://example.com/?id=1 -D test_db -T test_tables dump

Дамп пользовательской таблицы

JSQ injection - еще один кроссплатформенный инструмент для выявления SQL-уязвимостей, написанный на языке Java и имеющий графический интерфейс. Этот инструмент поддерживает работу с 33 базами данных (Access, Altibase, Firebird, MemSQL, MySQL, Oracle, PostgreSQL, Presto, SQLite, SQL Server и т.д). По набору функций jSQL injection собрал в себе средство поиска и эксплуатации SQLi, функционал Dirb и Hashcat:

  • поддержка различных видов инъекций (стандартные, error-based, stacked-based, blind и time-based);

  • создание и внедрение веб-шелла и SQL-шелла;

  • аутентификация с использованием Basic, Digest, NTLM и Kerberos;

  • прокси-соединение по HTTP, SOCKS4 и SOCKS5;

  • кодирование и декодирование текста;

  • перебор паролей по хешу и др.

Пример:

Просмотр содержимого таблиц

SQLmap и jSQL injection поддерживают поиск уязвимостей в cookie. За счет более обширной базы пейлоадов, использование SQLmap при выявлении уязвимостей будет приносить положительный результат намного чаще.

Защита от SQL-инъекций

Встречаются SQL-инъекции в числовом и строковом параметрах в запросах, использующих оператор SELECT, которые являются самыми распространенными. Поэтому проверять нужно всё: числа, строки, даты и другие данные в специальных форматах.

1) Числа

Функция is_numeric(n) используется для проверки переменной на числовое значение, которая вернёт true, если параметр n - число, а в противном случае - false. Также переопределить тип возможно вручную.

Пример:

if (isset($_GET['id'])){ $id = $_GET['id'];if ( is_numeric($id) == true){ }

2) Строки

Компрометации через SQL-конструкции происходят и по причине нахождения в строках небезопасных кавычек и других специальных символов. Для предотвращения такой угрозы необходимо использовать функцию addslashes($str), которая возвращает строку $str с добавленным обратным слешем (\) перед каждым специальным символом. Данный процесс называется экранированием. Для этого в PHP используют две функции:

mysqli($str) и mysqli_real_escape_string($str).

3) Параметризированные запросы (PDO)

PDO заставляют разработчика сначала определить весь код SQL, а затем передать каждый параметр в запрос.Это позволяет БД различать код и данные независимо от того, что вводится пользователем. Подготовленные операторы гарантируют, что злоумышленник не сможет изменить логику запроса, даже, если атакующий вставляет команды SQL. Правильно параметризированный запрос не позволит базе данных обработать информацию о пользователе, как часть SQL-запроса. Для обхода аутентификации злоумышленник может использовать конструкцию:

аdmin or 1=1

При использовании PDO сначала передается запрос в БД, а потом в него подставляются данные из переменных. Таким образом, за имя пользователя будет приниматься вся строка admin or 1=1, введенная им, что не позволит хакеру проэксплуатировать SQL-инъекцию.

Пример кода:

if (isset($_GET['id'])){$id = $_GET['id'];if ( is_numeric($id) == true){ try{$dbh = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $q = "SELECT username FROM users WHERE id = :id"; $sth = $dbh->prepare($q); $sth->bindParam(':id', $id); $sth->execute(); $sth->setFetchMode(PDO::FETCH_ASSOC); $result = $sth->fetchColumn(); print( htmlentities($result) );  

4) Хранимые процедуры

Объекты базы данных требуют, чтобы разработчик сгруппировал один или несколько операторов SQL в логическую единицу для создания плана выполнения.Последующие исполнения позволяют автоматически параметризовать операторы.То есть, это тип кода, который можно сохранить и многократно использовать в последующем. Когда необходимо выполнить запрос, вместо того, чтобы писать его, можно будет вызвать хранимую процедуру.

5) Использование WAF

Nemesida WAF - универсальное решение, позволяющее блокировать попытки эксплуатации различных типов уязвимостей, в том числе и SQL-инъекции. В основе своей работы Nemesida WAF использует машинное обучение, способное более точно и с минимальным количеством ложных срабатываний, противодействовать атакам на веб-приложение вне зависимости от языка разработки и используемых фреймворков. Также доступна бесплатная версия Nemesida WAF Free

В одной из статей мы рассматривали способы тестирования Nemesida WAF различными инструментами.

6) Принцип наименьших привилегий

Нельзя подключать веб-приложения к базе данных, используя учетную запись с привилегированным доступом (только в случае крайней необходимости), так как злоумышленники могут получить доступ ко всей системе. Это позволит минимизировать ущерб от проэксплуатированной уязвимости при ее наличии.

Резюмируя написанное выше, приведем несколько рекомендаций по защите веб-приложений от SQL-инъекций:

  • обрабатывайте ввод отдельно и формируйте запрос из безопасных значений;

  • создавайте белые списки;

  • регулярно устанавливайте обновления;

  • удаляйте неиспользуемый функционал;

  • задавайте конкретные значения названиям таблиц, полей и базам;

  • периодически проводите анализ защищенности веб-приложений вручную и с помощью инструментов автоматизации (например, Wapiti)

  • используйте средства защиты веб-приложений (WAF).

Следует помнить, что любая успешная атака с использованием SQL-инъекций может привести к утечке персональных данных (данные кредитной карты, личная информация пользователя и др.), несанкционированному доступу к серверу. Все это может повлечь необратимые негативные последствия. Поэтому будьте в курсе основных тенденций в области информационной безопасности, следуйте приведенным выше рекомендациям, оставайтесь здоровыми и защищёнными.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru