Inurl component users view registration бездольный. Вязание крючком и спицами – схемы и узоры вязания

Сегoдня мы рассмотрим эксплуатацию критической 1day-уязвимости в популярной CMS Joomla, которая прогремела на просторах интернета в конце октября. Речь пойдет об уязвимостях с номерами CVE-2016-8869 , CVE-2016-8870 и CVE-2016-9081 . Все три происходят из одного кусочка кода, который пять долгих лет томился в недрах фреймворка в ожидании своего часа, чтобы затем вырваться на свободу и принести с собой хаос, взломанные сайты и слезы ни в чем не повинных пользователей этой Joomla. Лишь самые доблестные и смелые разработчики, чьи глаза красны от света мониторов, а клавиатуры завалены хлебными крошками, смогли бросить вызов разбушевавшейся нечисти и возложить ее голову на алтарь фиксов.

WARNING

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

С чего все началось

6 октября 2016 года Дэмис Пальма (Demis Palma) создал топик на Stack Exchange , в котором поинтересовался: а почему, собственно, в Joomla версии 3.6 существуют два метода регистрации пользователей с одинаковым названием register() ? Первый находится в контроллере UsersControllerRegistration , а второй - в UsersControllerUser . Дэмис хотел узнать, используется ли где-то метод UsersControllerUser::register() , или это лишь эволюционный анахронизм, оставшийся от старой логики. Его беспокоил тот факт, что, даже если этот метод не используется никаким представлением, он может быть вызван при помощи сформированного запроса. На что получил ответ от девелопера под ником itoctopus, подтвердившего: проблема действительно существует. И направил отчет разработчикам Joomla.

Далее события развивались самым стремительным образом. 18 октября разработчики Joomla принимают репорт Дэмиса, который к тому времени набросал PoC, позволяющий регистрировать пользователя. Он опубликовал заметку на своем сайте , где в общих чертах рассказал о найденной проблеме и мыслях по этому поводу. В этот же день выходит новая версия Joomla 3.6.3, которая все еще содержит уязвимый код.

После этого Давиде Тампеллини (Davide Tampellini) раскручивает баг до состояния регистрации не простого пользователя, а администратора. И уже 21 октября команде безопасности Joomla прилетает новый кейс. В нем речь уже идет о повышении привилегий . В этот же день на сайте Joomla появляется анонс о том, что во вторник, 25 октября, будет выпущена очередная версия с порядковым номером 3.6.3, которая исправляет критическую уязвимость в ядре системы.

25 октября Joomla Security Strike Team находит последнюю проблему, которую создает обнаруженный Дэмисом кусок кода. Затем в главную ветку официального репозитория Joomla пушится коммит от 21 октября с неприметным названием Prepare 3.6.4 Stable Release , который фиксит злосчастный баг.

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

27 октября исследователь Гарри Робертс (Harry Roberts) выкладывает в репозиторий Xiphos Research готовый эксплоит , который может загружать PHP-файл на сервер с уязвимой CMS.

Детали

Что ж, с предысторией покончено, переходим к самому интересному - разбору уязвимости. В качестве подопытной версии я установил Joomla 3.6.3, поэтому все номера строк будут актуальны именно для этой версии. А все пути до файлов, которые ты увидишь далее, будут указываться относительно корня установленной CMS.

Благодаря находке Дэмиса Пальмы мы знаем, что есть два метода, которые выполняют регистрацию пользователя в системе. Первый используется CMS и находится в файле /components/com_users/controllers/registration.php:108 . Второй (тот, что нам и нужно будет вызвать), обитает в /components/com_users/controllers/user.php:293 . Посмотрим на него поближе.

286: /** 287: * Method to register a user. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: public function register() 294: { 295: JSession::checkToken("post") or jexit(JText::_("JINVALID_TOKEN")); ... 300: // Get the form data. 301: $data = $this->input->post->get("user", array(), "array"); ... 315: $return = $model->validate($form, $data); 316: 317: // Check for errors. 318: if ($return === false) 319: { ... 345: // Finish the registration. 346: $return = $model->register($data);

Здесь я оставил только интересные строки. Полную версию уязвимого метода можно посмотреть в репозитории Joomla.

Разберемся, что происходит при обычной регистрации пользователя: какие данные отправляются и как они обрабатываются. Если регистрация пользователей включена в настройках, то форму можно найти по адресу http://joomla.local/index.php/component/users/?view=registration .


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


За работу с пользователями отвечает компонент com_users . Обрати внимание на параметр task в запросе. Он имеет формат $controller.$method . Посмотрим на структуру файлов.

Имена скриптов в папке controllers соответствуют названиям вызываемых контроллеров. Так как в нашем запросе сейчас $controller = "registration" , то вызовется файл registration.php и его метод register() .

Внимание, вопрос: как передать обработку регистрации в уязвимое место в коде? Ты наверняка уже догадался. Имена уязвимого и настоящего методов совпадают (register), поэтому нам достаточно поменять название вызываемого контроллера. А где у нас находится уязвимый контроллер? Правильно, в файле user.php . Получается $controller = "user" . Собираем все вместе и получаем task = user.register . Теперь запрос на регистрацию обрабатывается нужным нам методом.


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

  • /components/com_users/controllers/registration.php: 124: // Get the user data. 125: $requestData = $this->input->post->get("jform", array(), "array");

Наш подопечный получает эти данные из массива с именем user .

  • /components/com_users/controllers/user.php: 301: // Get the form data. 302: $data = $this->input->post->get("user", array(), "array");

Поэтому меняем в запросе имена всех параметров с jfrom на user .

Третий наш шаг - это нахождение валидного токена CSRF, так как без него никакой регистрации не будет.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") or jexit(JText::_("JINVALID_TOKEN"));

Он выглядит как хеш MD5, а взять его можно, например, из формы авторизации на сайте /index.php/component/users/?view=login .


Теперь можно создавать пользователей через нужный метод. Если все получилось, то поздравляю - ты только что проэксплуатировал уязвимость CVE-2016-8870 «отсутствующая проверка разрешений на регистрацию новых пользователей».

Вот как она выглядит в «рабочем» методе register() из контроллера UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // If registration is disabled - Redirect to login page. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: { 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=login", false)); 117: 118: return false; 119: }

А так в уязвимом:

  • /components/com_users/controllers/user.php:

Ага, никак.

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «сайт», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!

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

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

Портал о вязании «Наша пряжа»

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

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

User Registration plugin provides you with an easy way to create frontend user registration form and login form. Drag and Drop fields make ordering and creating forms extremely easy. The plugin is lightweight, extendible, and can be used to create any type of registration form.

Beside registration form, the plugin also supports beautiful frontend profile account page for profile edit, password change, Log out and more. Users can visit their account page after registration and view the details they have filled and can make changes if necessary.

The registration forms are 100% mobile responsive and optimized to display on any devices.

User Registration Plugin in action:

Features And Options:

  • Simple, Clean and Beautiful WordPress Registration Forms
  • Drag and Drop Fields
  • Unlimited Registration Forms
  • Inbuilt Login Form
  • Frontend Profile account page
  • Multiple Column Design
  • Multiple Form template designs
  • Shortcode Support
  • Google reCaptcha Support (v2 and v3)
  • Email notifications
  • Email Customizers
  • Form Duplicate Option
  • Admin approval option for registration
  • Auto login option
  • Email confirmation to register
  • Enable/Disable Strong Password
  • Default User Role Selection Option
  • Support for profile image upload
  • Form Preview Option on backend
  • User data export in CSV
  • Import/Export registration form
  • Well Documented
  • Translation ready

Premium Addons

User Registration can be easily extended with some premium addons.

Description

User Options configuration allows setting of parameters used globally for all users. Control the use of Captcha, registration allowed and type of registration, default user group new users, reset password or username counter, and new user registration email notice to administration.

How to Access

On User Manager: Users , click Options button at top. The Options button is in every User-Menu available.

Screenshot

Details

User Options

  • Allow User Registration . Yes or No. If set Yes, users can register from the front end of the site using the Create an Account link provided on the Login module. If set to No, the "Create an Account" link will not show. Since Joomla 3.4 this option is set to No by default for new installations.
  • New User Registration Group . The group that users are assigned to by default when they register on the site. Defaults to Registered.
  • Guest User Group . The group that guests are assigned to. (Guests are visitors to the site who are not logged in.) This is set to Public by default. If you change this to a different group, it is possible to create content on the site that is visible to guests but not visible to logged in users. See Allowing Guest-Only Access to Menu Items and Modules .
  • Send Password . If set to Yes the user"s first password will be emailed to the user as part of the registration mail.
  • New User Account Activation .
    • None . User account will be active immediately with no action required.
    • Self . User will receive an email with an activation link. The account will be activated when the user clicks the activation link.
    • Administrator . User will receive an email with an activation link. When the user clicks this link, the Site Admin will be notified via email and the Site Admin needs to activate the user"s account.
  • Send Mail to Administrators . Send email notification to administrators with User Account Activation set to None or Self .
  • Captcha . Use Captcha for User Account Registration and Username or User Password reminders.
  • Frontend User Parameters . Show or Hide. If set to Show, users will be able to modify their language, editor, and help site preferences from the front end of the site. If set to Hide, the user will not be able to change these settings.
  • Frontend Language . Default site language.
  • Change Username . Allow user to change Username.

Email Domain Options

Enter a list of allowed and disallowed email domains. By default, all domains are allowed.

Password Options

  • Maximum Reset Count . The maximum number of password resets allowed within the time period. Zero indicates no limit.
  • Reset Time . The time period, in hours, for the reset counter.
  • Minimum Lenght . Set the minimum lenght for a password.
  • Minimum Integers . Set the minimum number of integers that must be included in a password.
  • Minimum Symbols . Set the minimum number of symbols (such as !@#$) required in a password.
  • Minimum Upper Case . Set the minimum number of upper case alphabetical characters required for a password.

User Notes History

  • Enable Versions. (Yes/No). Whether or not to save version history for this component. If No, version history will not be saved for component items or for this component"s categories.
  • Maximum Versions. The maximum number of versions to store for an item. If an item is saved and the maximum number of versions has been reached, the oldest version will be deleted automatically. If set to 0, then versions will never be deleted automatically. Also, specific versions may be flagged as "Keep Forever" and will not be deleted automatically. Note that versions may be deleted manually using the Delete button in the Version History screen.

Mass Mail Users

  • Subject Prefix . Enter optional text to be inserted automatically before the subject of the mass email.
  • Mailbody Suffix . Enter optional text to be inserted automatically after the body of the email (for example, a signature).

Advanced

  • Advanced Users Permissions . Display the Advanced Users Permissions Reports.
  • Advanced Groups Permissions . Display the Advanced Groups Permissions Reports.

Integration

  • URL Routing . Modern routing enables advanced features but may change your URLs. Legacy routing ensures full compatibility for existing sites. This is configured per component.
  • Enable Custom Fields . Enable the creation of custom fields.

Permissions

This section shows permissions configuration for Users. The screen shows as follows.

To change the permissions for this extension, do the following.

  • Select the Group by clicking its title located on the left.
  • Find the desired Action . Possible Actions are:
    • Configure ACL & Optons . Users can edit the options and persimissions of this extension.
    • Configure Optons Only . Users can edit the options exept the persimissions of this extension.
    • Access Administration Interface . Users can access user administration interface of this extension.
    • Create: Users can create content of this extension.
    • Delete: Users can delete content of this extension.
    • Edit: Users can edit content of this extension.
    • Edit State: User can change the published state and related information for content of this extension.
    • Edit Own: Users can edit own created content of this extension.
  • Select the desired permission for the action you wish to change. Possible settings are:
    • Inherited: Inherited for users in this Group from the Global Configuration permissions of this extension.
    • Allowed: Allowed for users in this Group. Note that, if this action is Denied at one of the higher levels, the Allowed permission here will not take effect. A Denied setting cannot be overridden.
    • Denied: Denied for users in this Group.
  • Click Save in Toolbar at top. When the screen refreshes, the Calculated Setting column will show the effective permission for this Group and Action.

Урок, в котором познакомимся с дополнением Login. Данное дополнение предназначено для реализации на сайте всего что может понадобиться для работы с пользователями во front-end. Оно включает в себя элементы для реализации регистрации, подтверждения регистрации, восстановления и изменения пароля, авторизации, личного кабинета и многих других функций.

Установка приложения Login

Открываем страницу "Управление пакетами" (Приложения -> Установщик). Выполняем загрузку и установку компонента Login.

Создание группы пользователей и ресурсов "Users"

Открываем страницу "Контроль доступа" (Шестерёнка -> Контроль доступа). Нажимаем на кнопку "Новая группа пользователей".

В диалоговом окне "Создать группу пользователей" заполняем следующие поля:

  • Имя: Users;
  • Описание: Зарегистрированные пользователи;
  • Создать параллельную группу ресурсов: Да;
  • Политики бэкэнда: (нет политики).

Проверяем, появилась ли новая группа ресурсов "Users". Эта группа ресурсов была создана во время создания группы пользователей "Users" (включенная опция "Создать параллельную группу ресурсов"). Группа ресурсов "Users" необходима для помещения в неё ресурсов, доступ к которым будут иметь пользователи, расположенные в группе "Users". Это будут ресурсы "Личный кабинет", "Смена пароля" и "Редактирование данных". Анонимные пользователи не смогут получить доступ к этим ресурсам.

Настраиваем права группы пользователей "Users". Для этого на странице "Контроль доступа" нажимаем правой кнопкой мыши на группу "Users" и выберем пункт "Редактировать группу пользователей".

На странице "Группа пользователя: Users" нажимаем правой кнопкой мыши на поле "web" и выбираем пункт "Редактировать доступ к контексту".

В диалоговом окне "Доступ групп пользователей к контексту" устанавливаем политику доступа на значение "Load, List and View" и нажимаем на кнопку "Сохранить".

Создание страниц (ресурсов) для Login. Настройка доступа к этим страницам

Создадим следующие страницы (ресурсы):

  • Регистрация (28) и Подтверждение регистрации (31);
  • Авторизация (29) и Восстановление пароля (32);
  • Личный кабинет (30), Изменение пароля (33) и Редактирование данных (34).

Настроим доступ к страницам "Личный кабинет", "Изменение пароля", "Редактирование данных". Они должны быть доступны только зарегистрированным пользователям (Users).

Откроем страницу "Группы ресурсов" (Сайт->Группы ресурсов) и перенесём из правого дерева в группу «Users» вышеперечисленные ресурсы.

Кроме этого, группе пользователей (аноним) необходимо установить доступ "Load only". Это необходимо сделать для того чтобы они могли загружать страницы из группых ресурсов Users, проверять права доступа и получать ошибку 403 "Доступ запрещен". Если не дать (аноним) Load only, то для них эти страницы не будут существовать, и они получат ошибку 404 "Не найдено".

Порядок действий: Шестерёнка -> Контроль Доступа -> (аноним) -> Редактировать группу пользователей (правой кнопкой мыши) -> Доступ к группам ресурсов -> Добавить группу ресурсов.

В диалогово окне "Добавить группу ресурсов":

  • Группа ресурсов: Users;
  • Контекст: website (web);
  • Минимальная роль: member (9999);
  • Политика доступа: Load only.

Последнее что необходимо ещё сделать, это указать в качестве страницы ошибки 403 "Доступ запрещён" ресурс "Авторизация" (id=29). Осуществляется это в настройках системы с помощью параметра unauthorized_page. Теперь если анонимный пользователь захочет попасть на закрытые страницы, ему выведится страница "Авторизация".

Страница (ресурс) "Регистрация"

Страница "Регистрация" будет выполнять следующие действия:

  • выводить пользователю регистрационную форму;
  • обрабатывать отправленную пользователем форму (данные) на сервере с помощью сниппета Register.

Обработку формы сниппетом Register настроим так, чтобы он выполнял следующее:

  1. Переходил к обработке регистрационной формы только в том случае, если она была отправлена с помощью кнопки, у которой значение атрибута name равно submitbtn .
  2. Выполнял проверку (валидацию) полей формы на соответствие указанным требованиям. При обнаружении ошибок, выводил их в соотвествующие места ([[!+reg.error.имяПоля]]) формы.
  3. Если форма, заполненная пользователем, ошибок не имеет (прошла валидацию):
    • отображал сообщение об успехе;
    • отправлял пользователю email, в котором содержалась бы сообщение и ссылка. Данное действие необходимо для того, чтобы пользователь подтвердил email, т.е. активировал с помощью неё (ссылки) свою учётную запись.

Содержимое ресурса "Регистрация" (форма и сниппет Register):

[[!Register? &submitVar=`submitbtn` &activation=`1` &activationEmailSubject=`Подтверждение регистрации` &activationResourceId=`31` &successMsg=`

Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее ссылку, необходимую для активацию аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.

` &usergroups=`Users` &usernameField=`email` &passwordField=`passwd` &validate=`nospam:blank, passwd:required:minLength=^8^, passwdAgain:passwdAgain=^passwd^, fullname:required, email:required:email` &placeholderPrefix=`reg.` ]]
Регистрация
[[!+error.message:eq=``:then=`
[[!+reg.error.fullname]]
[[!+reg.error.email]]
[[!+reg.error.passwd]]
[[!+reg.error.passwdAgain]]
`:else=`
[[!+error.message]]
`]]

Описание используемых параметров сниппета Register:

Имя параметра Описание
submitVar Ключ, значение которого проверяется перед тем как сниппет Register начнёт обрабатывать форму. Если в качестве значения этого параметра указать пустую строку или false , то сниппет Register будет обрабатывать форму при получении любого Post запроса.
activation Определяет стоит ли подтверждать email, указанный в регистрационной форме, или нет. Т.е. пользователь не будет активированным до тех пор, пока он не подтвердит свой email. Значение: 1 (да, необходимо).
activationEmailSubject Тема письма, в котором приходит ссылка для активирования учётной записи.
activationEmailTpl Шаблон письма, содержащий информацию и ссылку для активирования учётной записи. Будем использовать шаблон по умолчаию: lgnActivateEmailTpl.
activationResourceId Идентификатор ресурса, в котором находится сниппет с помощью которого осуществляется активирование учётной записи пользователя. Значение: 31 (id ресурса "Подтверждение регистрации").
successMsg Отображает указанное сообщение после успешной отправки регистрационной формы. Этот параметр работает тогда, когда не используется параметр submittedResourceId.
submittedResourceId Перенаправляет пользователя на указанный ресурс после успешной отправки регистрационной формы.
usergroups Список (через запятую) названий групп пользователей или идентификаторов этих групп, в которые необходимо добавить только что зарегистрированного пользователя. Значение: Users.
usernameField Имя поля формы, содержащее в качестве значения имя пользователя. Значение: email.
passwordField Имя поля формы, содержащее пароль пользователя. Значение: passwd.
validate Список (через запятую) полей для валидации (проверки). Указывается так: имя:валидатор (например, username: required , email:required). Валидаторы можно соединять. Например, email:email:required .
placeholderPrefix Префикс для плейсхолдеров. Например, значения плейсхолдеров для поля email с учётом префикса reg. : [[!+reg.email]] (значения поля), [[!+reg.error.email]] (значение ошибки).

Как работает активация аккаунта

Происходит это так: после успешной валидации формы, сниппет Register создаёт объект modUser и устанавливает полю active значение 0. Далее он отправляет письмо пользователю по указанному в регистрационной форме email. Данное письмо содержит URL (ссылку для активации). Как только пользователь перейдёт по этому URL, сниппет ConfirmRegister изменит значение поля active на 1. Теперь пользователь сможет авторизироваться на сайте, т.е. войти под своей учётной записью.

Ресурс "Подтверждение регистрации"

Страница "Подтверждение регистрации" предназначена для активирования аккаунта пользователя. Активирование выполняет сниппет ConfirmRegister на основании URL. Принцип работы его заключается в том, чтобы изменить значение поля active пользователя на 1. После этого пользователь может авторизоваться на сайте, т.е. войти под своей учётной записью.


Содержимое ресурса "Подтверждение регистрации" (сниппет ConfirmRegister):

[[!ConfirmRegister? &authenticate=`1` &redirectTo=`4` &errorPage=`4` ]]

Описание используемых параметров сниппета ConfirmRegister.

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то