ReportHackerOne - CSRF
wr3dmast3r
Всем привет! С Вами wr3dmast3r, и сегодня мы разберем репорт с HackerOne.
Сегодняшняя уязвимость связана с CSRF и подделкой запросов для создания привилегированного пользователя.
Суть уязвимости.
Можно заставить пользователя отправить любой POST-запрос с произвольным телом, если он нажмет на вредоносную ссылку. (например, в электронном письме, ссылке на чат и т. д.)
Эту уязвимость пытались исправить, однако патч по исправлению можно обойти, а также он представляет уязвимость CSRF.
Действия по воспроизведению.
Следующие шаги воспроизведения отправляют запрос API OCS на конечную точку /ocs/v1.php/cloud/users со следующим телом сообщения: path=/.\&userid=hacker&password=h4ck3rPassw0Rd!&displayName=hacker&email=mail@example.com&groups[] =admin&\..\.owncloudsync.log. Если жертва не является администратором, нужно выбрать другую учетную запись для нашей цели.
- Откройте следующую ссылку на компьютере с Windows с установленным настольным клиентом Nextcloud. Обязательно скорректируйте имя пользователя и URL-адрес экземпляра жертвы: nc://open/admin@pentest.cloud.wtf/.\&userid=hacker&password=h4ck3rPassw0Rd!&displayName=hacker&email=mail@example.com&groups[]=admin&\..\ .owncloudsync.log?token=../../../../../../../ocs/v1.php/cloud/users
- Убедитесь, что пользователь с именем «хакер» создан в экземпляре и добавлен в группу администраторов.
Основная причина.
Попытка исправить была сделана с помощью https://github.com/nextcloud/desktop/pull/5055, и представила следующий код:
const auto checkTokenForEditLocally = new SimpleApiJob(accountFound->account(), QStringLiteral("/ocs/v2.php/apps/files/api/v1/openlocaleditor/%1").arg(токен)); checkTokenForEditLocally->setVerb(SimpleApiJob::Verb::Post);checkTokenForEditLocally->setBody(QByteArray{"path=/"}.append(relPath.toUtf8()));
Здесь есть две уязвимости, которые можно связать вместе:
- Токен не закодирован: токен вставлен непосредственно в URL-адрес и не закодирован должным образом. Передача токена, такого как ?token=../../../../../../../ocs/v1.php/cloud/users, сделает запрос, поэтому перейдите к /ocs/v2. php/apps/files/api/v1/openlocaleditor/../../../../../../../ocs/v1.php/cloud/users, что означает /ocs/v1.php /облако/пользователи.
- Относительный путь к файлу не закодирован: relPath объединяется непосредственно с телом POST и не кодируется должным образом. Таким образом, передача пути, такого как .\&userid=hacker&password=h4ck3rPassw0Rd!&displayName=hacker&email=mail@example.com&groups[]=admin&\..\.owncloudsync.log, создаст несколько параметров запроса POST. (Примечание: ./owncloudsync.log — это файл по умолчанию, который я использую здесь, чтобы убедиться, что файл существует, проверьте ранее в коде)
Вспомогательные материалы/ссылки.
Скриншот запроса:

Скриншот созданного пользователя:

Влияние.
Можно заставить пользователя отправить любой POST-запрос с произвольным телом, если он нажмет на вредоносную ссылку. (например, в электронном письме, ссылке на чат и т. д.)
С вами был wr3mast3r и RESOLUTE ATTACK, до новых встреч!