본 포스팅은 학습 목적으로 작성되었으며, hackerone report를 기반으로 작성되었습니다.
-분석 레포트-
https://hackerone.com/reports/867513
Summary
Shopify 사용자 계정의 일부 하위 집합에 대해 Shopify의 이메일 확인을 우회할 수 있는 것으로 나타났다. 그렇게 하면, 사용자가 자신이 소유하지 않은 계정에 액세스할 수 있게 된다.
Details
pos-channel.shopifycloud.com/graphql-proxy/admin 경로를 통해 이메일 확인 없이, 직원 이메일을 업데이트 할 수 있고, partner dashboard를 사용하면, accounts.shopify.com에 Shopify ID 계정이 없는 스토어를 생성할 수 있다. 위 두가지를 함께 사용하면, 우리가 소유한 이메일에 대한 임의의 저장소를 만들고 수신된 이메일로 이를 확인한 다음 POS 직원 엔드포인트를 사용하여 이메일을 검증할 필요 없이 업데이트하기만 하면 된다.
그런 다음 매장에 대한 Shopify ID를 생성하라는 메시지가 표시되는데, 이메일이 이미 확인되었으므로 해당 이메일을 소유하고 있는지 확인할 필요가 없다.
Steps to reproduce
1. Shopify ID가 없는 스토어를 보유한 피해자가 존재한다.
2. partners.shopify.com을 열고, 개발 스토어를 생성한다.
3. 스토어 생성 양식에서 Shopify에 존재하지 않고, 소유하고 있는(유효성을 검사할 수 있는) 스토어 이메일로 업데이트 해야 한다. 필드는 읽기 전용이므로 Burp와 같은 애플리케이션으로 요청을 가로채거나 브라우저 콘솔에서 위의 작업을 수행하여 양식 개체를 업데이트할 수 있다.
window.RailsData.current_organization.business_email = "nonexistingemail@shopify.com";
window.RailsData.user.email = "nonexistingemail@shopify.com";
1. 이메일 주소를 소유하고 있는지 확인한다. ( 이메일로 전송된 링크 )
2. POS를 상점 판매 채널에 추가한다.
3. POS > staff 를 연다.
4. 자신의 직원 페이지를 저장하고, 브라우저 검사를 사용하여 CURL 요청을 복사한다.
5. CURL 페이로드 이메일 필드를 피해자 이메일로 바꾸고 요청을 전송한다.
6. Shop에서 프로필 페이지를 새로 고치면 계정을 결합하라는 메시지가 표시되며, 새 이메일(피해자의 이메일)의 유효성을 검사하라는 메시지가 표시되지 않는다.
7. Shopify ID 생성을 진행한다.
8. 이제 Shopify ID를 소유하게 되었으므로, 피해자가 비밀번호를 잊어버려서 복구할 수 있으므로 이메일을 회원의 것으로 변경하기만 하면 된다.
Impact
1. 일부 계정을 인수할 수 있는 가능성이 존재한다.
2. 인증되지 않은 이메일로 인증된 Shopify ID를 생성할 수 있다.
3. Shopify ID에 연결된 경우에도 직원 정보를 업데이트 할 수 있는 기능
- 후자의 경우 직원이 두명인 스토어가 있다고 가정해본다. A와 B(attacker). 직원 B 는 상점 소유자가 직원 A에게 상점을 양도하려는 것을 알고 있다. POS 액세스 엔드포인트를 악용하면 직원 B는 이름, 성, 이메일을 직원 A <--> 직원 B 간에 이동할 수 있으므로 상점 소유자가 UI 에서 올바른 직원을 선택하면 잘못된 사람에게 전송하게 된다.
비지니스 로직 취약점