Исторические недостатки безопасности популярных PHP CMS? - PullRequest
39 голосов
/ 01 июня 2010

Я создаю PHP CMS, которая, я надеюсь, будет использоваться широкой публикой. Безопасность - это серьезная проблема, и я хотел бы узнать о некоторых популярных PHP CMS, таких как Wordpress, Joomla, Drupal и т. Д. Какие недостатки безопасности или уязвимости у них были в прошлом, которых я мог избежать в своем приложении и какие стратегии я могу использовать, чтобы избежать их? С какими еще проблемами я должен быть связан, чтобы они, возможно, не воспринимали их как уязвимость, потому что они правильно с ней справились? Какие дополнительные функции или меры безопасности вы бы включили, от мелких деталей до подходов безопасности на системном уровне? Пожалуйста, будьте настолько конкретны, насколько это возможно. Я обычно знаю о большинстве обычных векторов атаки, но я хочу убедиться, что все базы покрыты, так что не надо боюсь упомянуть и очевидное. Предположим, PHP 5.2 +.

Редактировать : Я изменяю это на вики сообщества. Несмотря на то, что превосходный ответ Арха принят, меня все еще интересуют дополнительные примеры, если они у вас есть.

Ответы [ 9 ]

59 голосов
/ 01 июня 2010

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

Описание:

Основная идея состоит в том, чтобы обмануть пользователя на странице, где его браузер инициирует запрос POST или GET к CMS, на которую вы нападаете.

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

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

Обычный способ - генерировать случайные кратковременные одноразовые номера (от 15 до час) во всех ваших формах. Когда ваша CMS получает данные формы, она сначала проверяет, в порядке ли одноразовый номер. Если нет, данные не используются.

Примеры CMS:

Дополнительная информация:

На странице википедии и в проекте OWASP .

Неверное хранение пароля

Описание:

Представьте, что ваша база данных взломана и опубликована на что-то вроде wikileak. Зная, что большая часть ваших пользователей используют одни и те же логин и пароль для многих веб-сайтов, вы хотите, чтобы их было легко получить?

Нет. Вам необходимо уменьшить нанесенный ущерб, если данные вашей базы данных станут общедоступными.

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

  • Первая идея состоит в том, чтобы хэшировать их. Что является плохой идеей из-за радужных таблиц (даже если хеш не md5, а, например, sha512).
  • Вторая идея: добавьте уникальную случайную соль перед хэшированием, чтобы хакеры взломали каждый пароль. Проблема в том, что хакер может быстро вычислить много хешей.
  • Итак, текущая идея состоит в том, чтобы сделать хэширование паролей медленным: вам все равно, потому что вы делаете это не часто. Но злоумышленник будет плакать, когда он получит от 1000 хэшей, генерируемых за мс, до 1.

Чтобы упростить процесс, вы можете использовать библиотеку phpass , разработанную каким-то гуру паролей.

Примеры CMS:

Дополнительная информация:

Страница phpass .

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

Описание

Цель этих атак - заставить ваш веб-сайт отображать некоторый скрипт, который будет выполняться вашим законным пользователем.

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

<?php
if(!is_numeric($_GET['id'])){
  die('The id ('.$_GET['id'].') is not valid');
}
?>

Теперь ваш злоумышленник может просто отправлять ссылки типа http://www.example.com/vulnerable.php?id=<script>alert('XSS')</script>

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

Вам необходимо отфильтровать все, что вы выводите клиенту. Самый простой способ - использовать htmlspecialchars , если вы не хотите, чтобы ваш пользователь сохранял любой html. Но когда вы позволяете им выводить html (либо собственный html, либо какой-либо другой, сгенерированный из других вещей, таких как bbcode), вы должны быть очень осторожны. Вот старый пример использования события onerror тега img: Уязвимость vBulletin . Или у вас есть старая Myspace's Samy .

Примеры CMS:

Дополнительная информация:

Вы можете проверить Википедию и OWASP . У вас также есть много XSS-векторов на странице ha.ckers .

Инъекция заголовка почты

Описание:

Почтовые заголовки разделены последовательностью CRLF (\r\n). Когда вы используете некоторые пользовательские данные для отправки писем (например, используя их для From: или To :), они могут добавить больше заголовков. При этом они могут отправлять анонимные письма с вашего сервера.

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

Отфильтруйте все символы \n, \r, %0a и %0d в заголовках.

Примеры CMS:

Дополнительная информация:

Википедия - хорошее начало, как обычно.

SQL-инъекция

Описание:

Старая классика. Это происходит, когда вы формируете SQL-запрос, используя прямой ввод данных пользователем. Если этот ввод создается как нужно, пользователь может делать именно то, что он хочет.

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

Simple. Не формируйте SQL-запросы с пользовательским вводом. Используйте параметризованные запросы . Рассматривайте любые входные данные, которые сами не кодируются как пользовательские, например, из файловой системы, из вашей собственной базы данных или веб-службы.

Пример CMS:

Дополнительная информация:

Википедия и OWASP имеют действительно хорошие страницы по теме.

Http-ответ разделения

Описание:

Как и заголовки электронной почты, заголовки http разделяются последовательностью CLRF. Если ваше приложение использует пользовательский ввод для вывода заголовков, они могут использовать его для создания своих собственных.

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

Как и для электронных писем, фильтруйте \n, \r, %0a и %0d символов из пользовательского ввода, прежде чем использовать его как часть заголовка. Вы также можете urlencode свои заголовки.

Примеры CMS:

Дополнительная информация:

Я позволю вам немного догадаться, где можно найти много информации об этом виде атаки. OWASP и Википедия .

Захват сессии

Описание:

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

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

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

Примеры CMS:

Дополнительная информация:

Википедия страница по теме.

Другое

  • User DoSing: если вы предотвращаете грубое использование попытки входа в систему, отключая пробные имена пользователей, а не IP-адреса, с которых поступают попытки, любой может заблокировать всех ваших пользователей за 2 мин. То же самое при создании новых паролей: не отключайте старый, пока пользователь не подтвердит новый (например, войдя в него).
  • Использование пользовательского ввода, чтобы сделать что-то в вашей файловой системе. Фильтруйте это, как будто это рак, смешанный со СПИДом. Это касается использования include и require для файлов, путь которых частично определяется из пользовательского ввода.
  • Использование eval , system , exec или чего-либо подобного с пользовательским вводом.
  • Не помещайте файлы, которые вам не нужны, в веб-каталог.

На странице OWASP вы можете прочитать множество вещей.

12 голосов
/ 01 июня 2010

Я помню довольно забавный из phpBB. Файл cookie autologin содержал сериализованный массив, содержащий идентификатор пользователя и зашифрованный пароль (без соли). Измените пароль на логическое значение со значением true, и вы сможете войти в систему под любым именем. Разве вы не любите слабые языки?

Другая проблема, с которой сталкивался phpBB, заключалась в регулярном выражении для выделения ключевых слов для поиска, которые имели обратный вызов (с e modifier), что позволяло вам выполнять собственный код PHP - например, системные вызовы в незащищенных системах просто выведите файл конфигурации, чтобы получить логин / пароль MySQL.

Итак, подведем итог этой истории:

  • Остерегайтесь слабого типа PHP (md5( "secretpass" ) == true).
  • Будьте осторожны со всем кодом, который может быть использован в обратном вызове (или, что еще хуже, eval).

И, конечно, есть другие вопросы, уже упомянутые до меня.

3 голосов
/ 02 июня 2010

Самое большое, что многие люди забывают или не осознают, это то, что любой может публиковать любые данные в ваших скриптах, включая файлы cookie, сеансы и т. Д. Это означает, что они могут совершать любые действия.

Например, если у вас есть скрипт, который обрабатывает добавление / редактирование комментария, вы можете иметь это:

if ( userIsLoggedIn() ) {
    saveComment( $_POST['commentid'], $_POST['commenttext'] )
}

Ты видишь, что не так? Вы проверили, что пользователь вошел в систему, но вы не проверили, владеет ли пользователь комментарием или имеет возможность редактировать комментарий. Это означает, что любой вошедший в систему пользователь может опубликовать идентификатор и контент комментария и редактировать комментарии других пользователей!


Еще одна вещь, которую следует помнить при предоставлении программного обеспечения другим, это то, что настройки сервера сильно различаются. Когда данные публикуются, вы можете сделать это, например:

if (get_magic_quotes_gpc())
    $var = stripslashes($_POST['var']);
else
    $var = $_POST['var'];
3 голосов
/ 02 июня 2010

Так много ..

В ряде ответов приведен список тех, которые они помнят, или общие «вещи, о которых я беспокоюсь при написании веб-приложения», но если вы хотите получить достаточно надежный список большинства обнаруженных уязвимостей, обнаруженных исторически, то вы не сделаете гораздо хуже, чем искать в Национальной базе данных уязвимостей

В аддонах Joomla или Joomla зарегистрировано 582 уязвимости, 199 для Wordpress и 345 для Drupal, которые вы можете переварить.

Для общего понимания общих веб-приложений недавно был обновлен проект OWASP Top Ten *, который является важным документом для любого веб-разработчика.

  • А1: впрыск
  • A2: межсайтовый скриптинг (XSS)
  • A3: сломанная проверка подлинности и управление сеансами
  • A4: небезопасные ссылки на прямые объекты
  • A5: Подделка межсайтовых запросов (CSRF)
  • A6: неправильная настройка безопасности
  • A7: небезопасное криптографическое хранилище
  • A8: сбой при ограничении доступа к URL
  • A9: недостаточная защита транспортного уровня
  • A10: Непроверенные перенаправления и переадресация
3 голосов
/ 01 июня 2010

Другая проблема безопасности на уровне приложений, с которой я сталкивался в CMS, - это недостаточная авторизация доступа на уровне страниц или функций.Другими словами, безопасность устанавливается путем показа ссылок, только когда вы авторизованы для просмотра этих ссылок, но не для полной проверки того, что учетная запись пользователя авторизована для просмотра страницы или использования функциональности, когда они находятся на странице.* Другими словами, в учетной записи администратора отображаются ссылки для перехода на страницы управления пользователями.Но страница управления пользователями проверяет только то, что пользователь вошел в систему, а не то, что он вошел в систему и администратор.Затем обычный пользователь входит в систему, вручную вводит URI страницы администратора, затем получает полный доступ администратора к страницам управления пользователями и превращает свою учетную запись в учетную запись администратора.

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

2 голосов
/ 01 июня 2010

Четыре больших в моей памяти:

  • использование exec для ненадежных данных / кода (или вообще)
  • включение файлов из удаленных URL для локального исполнения
  • включение регистров глобальных переменных, чтобы переменные get и post получали значения переменных автоматически.
  • не экранирование введенных данных в дБ / разрешение атак SQL-инъекций (обычно происходит, когда не используется уровень API БД)
1 голос
/ 01 июня 2010

Запретить POST с другого домена / IP, поэтому боты не могут войти / отправить формы.

0 голосов
/ 22 июля 2017

Люди , есть ответы, самая большая защитная скорострельность, это человек глупость . Доверие , обзор код. Вам нужна специальная команда, которая рассмотрит все, что добавлено как дополнительный код в ваше приложение, проблема с cms заключается в аутсорсинге, поступлениях, WordPress, Drupal, Joomla и других популярных cms, таких как стандартные установки, они действительно хорошая точка безопасности. Проблема возникает, когда вы оставляете людей добавлять дополнительный код в ваше приложение, без хорошего обзора (или лучше, без тестирования на проникновение). В этом и заключается слабость WordPress и Joomla, так много плагинов и разработчиков тем, так много одобрений, сотни устаревших плагинов и тем. Так что, если вы в состоянии создать сильную команду , хороший план безопасности, обучите своих участников и научите их, как защищать код, и со всеми остальными комментариями до меня, тогда вы сможете двигаться дальше и сказать: эй, привет, это мой cms, и это немного более безопасно чем все другие cms в сети;)

0 голосов
/ 18 января 2011

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

В колледже я понял, что селектор 'страны' пользователя в phpBB не имеет такой проверки.

На нашем школьном форуме вместо «Соединенные Штаты» или «Афганистан» моя страна может быть НИЧЕГО, какой бы глупой или грязной она ни была. Все, что мне было нужно, это HTML-форма POST. Моим одноклассникам потребовалось несколько дней, чтобы понять, как я это сделал, но вскоре у всех «крутых детей» появились странные фразы вместо стран, отображаемых под их именами пользователей.

Ходить в колледж гиков было круто. : D

...