Для тех, кому интересно, как работает этот эксплойт. Всё-таки первая настоящая дыра в phpBB за много лет!
Код: Выделить всё
curll -i -s -c cookies.txt -b cookies.txt -u "admin:anything" -d "logiin=anything&logiin_usrname=admin&logiin_pssword=anything" "http://website.com/ucp.php?mode=login_lnk&auth_provider=apache&login_link_anything=anything"
Эксплойт выдаёт нам ID админа и его сессионный токен. Слово "anything" можно заменить на что угодно, а "admin" должно быть действительным юзернеймом админа, модератора или любого пользователя. Юзернейм - это всё, что нам нужно знать. Далее мы можем войти на форум под этим пользователем. Правда, в администраторский раздел попасть не получится - phpBB запросит пароль.
В эксплойте два ключевых параметра:
login_link_anything и
auth_provider. Остальные параметры отвечают за активацию нужного режима и действуют так же, как при штатном входе.
Сначала параметр
login_link_anything=anything создаёт видимость, что мы передали какие-то данные, и позволяет обойти проверку на пустые данные в самом начале обработки запроса.
https://github.com/phpbb/phpbb/blob/555 ... nk.php#L56
Далее эти данные должен проверить метод
phpbb\auth\provider\base.php\login_link_has_necessary_data(). Он на самом деле ничего не проверяет и всегда говорит "ОК". Это было исправлено в phpBB 3.3.17 - метод теперь по умолчанию возвращает ошибку. Впрочем, это исправление ещё не закрывает уязвимость, но хотя бы устраняет видимость проверки.
https://github.com/phpbb/phpbb/blob/555 ... nk.php#L68
https://github.com/phpbb/phpbb/blob/555 ... se.php#L90
Далее параметр
auth_provider=apache активирует модуль авторизации Apache
phpbb\auth\provider\apache.php, даже если он не включён и не настроен. Это основная ошибка, исправленная в phpBB 3.3.17.
https://github.com/phpbb/phpbb/blob/555 ... nk.php#L62
И далее модуль
phpbb\auth\provider\apache.php авторизует нас под выбранным юзернеймом (
-u "admin:anything") без проверки пароля и выдаёт нам HTTP-заголовки
Set-Cookie с искомым сессионным токеном. Он так и должен делать, ведь он считает, что пароль уже запрошен и проверен самим сервером. Но сервер ничего не проверял, т.к. мы не настраивали на нём Apache-аутентификацию.