ソース:
訳:
この記事では、私が最近発見した、セッション ストレージを介した垂直権限昇格のストーリーを共有したいと思います。これは、プライベート プログラムで発見し、3($$$) 桁の報奨金を獲得しました。 それでは、早速、詳細を見ていきましょう。
これは CRM ポータルであり、通常ユーザーと管理者という 2 つの異なるユーザー ロールがあって。
テストの一環として、通常のユーザー アカウントを使用してログインし、Web アプリの機能を調べ。
通常のユーザーはリソースと機能へのアクセスが制限されており、ポータル内のデータを変更できず。
Web サイトを閲覧しているときに、ローカル ストレージとセッション ストレージを確認し。
セッション ストレージには、「userPermissionsList」オブジェクトがあり、ユーザー権限の JSON 配列を含んでて。
そこで、すぐに管理者アカウントとしてログインし。
管理者はリソースと機能に完全にアクセスでき、ポータル内のデータを変更で。
また、管理者アカウント内のセッション ストレージを確認し、管理者と通常のユーザーの 「userPermissionsList」 オブジェクトを比較。
これには、ユーザー権限の JSON 配列が含まれていて。
通常のユーザーの初期権限は次のようになり。
[
{"permissionId": 1, "permissionName": "CanGetApplicants"},
{"permissionId": 5, "permissionName": "CanGetUsers"},
{"permissionId": 8, "permissionName": "CanGetApplications"},
{"permissionId": 9, "permissionName": "CanResendEmails"},
{"permissionId": 18, "permissionName": "CanGetCustomers"},
{"permissionId": 22, "permissionName": "CanGetUserActivity"}
]
管理者の初期権限は次のようになります。
[
{ "permissionId" : 1 , "permissionName" : "CanGetApplicants" } ,
{ "permissionId" : 2 , "permissionName" : "CanCreateApplicants" } ,
{ "permissionId" : 3 , "permissionName" : "CanUpdateApplicants" } ,
{ "permissionId" : 4 , "permissionName" : "CanManageAccounts" } ,
{ "permissionId" : 5 , "permissionName" : "CanGetUsers" } ,
{ "permissionId" : 6 , "permissionName" : "CanCreateUsers" } ,
{ "permissionId" : 7 , "permissionName" : "CanUpdateUsers" } ,
{ "permissionId" : 8 , "permissionName" : "CanGetApplications" } ,
{ "permissionId" : 9 , "permissionName" : "CanResendEmails" } ,
{ "permissionId" : 10 , "permissionName" : "CanGetDocuments" } ,
{ "permissionId" : 11 , "permissionName" : "CanUploadDocuments" } ,
{ "permissionId" : 12 , "permissionName" : "CanCreateIndividualInvitations" } ,
{ "permissionId" : 14 , "permissionName" : "CanQueryIndividualInvitations" } ,
{ "permissionId" : 15 , "permissionName" : "CanGetBulkInvitations" } ,
{ "permissionId" : 16 , "permissionName" : "CanUploadBulkInvitationsFile" } ,
{ "permissionId" : 17 , "permissionName" : "CanUpdateFormStatus" } ,
{ "permissionId" : 18 , "permissionName" : "CanGetCustomers" } ,
{ "permissionId" : 19 , "permissionName" : "CanResendInvitations" } ,
{ "permissionId" : 20 , "permissionName" : "CanResendEvaluations" } ,
{ "permissionId" : 21 , "permissionName" : "CanResendManualReviews" } ,
{ "permissionId" : 22 , "permissionName" : "CanGetUserActivity" } ,
{ "permissionId" : 23 , "permissionName" : "CanGetDeliveredDocuments" } ,
{ "permissionId" : 24 , "permissionName" : "CanGetBillingTables" } ,
{ "permissionId" : 25 , "permissionName" : "CanGetBillingTableHistoricalRecords" } ,
{ "permissionId" : 26 , "permissionName" : "CanGetBillingTableDraftUpdateRecords" } ,
{ "permissionId" : 27 , "permissionName" : "CanGetFeedbacks" } ,
{ "permissionId" : 28 , "permissionName" : "CanUpdateBillingTables" } ,
{ "permissionId" : 29 , "permissionName" : "CanUpdateUserEmail" } ,
{ "permissionId" : 30 , "permissionName" : "CanGetTemplates" } ,
{ "permissionId" : 31 , "permissionName" : "CanResendApplicationEmail" } ,
{ "permissionId" : 32 , "permissionName" : "CanDeleteUpcomingUpdates" } ,
{ "permissionId" : 33 , "permissionName" : "CanCreatePolls" } ,
{ "permissionId" : 34 , "permissionName" : "CanGetPolls" } ,
{ "permissionId" : 35 , "permissionName" : "CanUpdatePolls" } ,
{ "permissionId" : 36 , "permissionName" : "CanNotifyIndividualInvitations" } ,
{ "permissionId" : 37 , "permissionName" : "CanSendInvitationEmail" }
]
これらの 「userPermissionsList」 オブジェクトを確認したところ、潜在的な脆弱性があることがわかりました。 テストするために、通常のユーザー アカウントに戻りました。
これらの 「userPermissionsList」 オブジェクトを確認したところ、潜在的な脆弱性があることがわかりました。 テストするために、通常のユーザー アカウントに戻りました。
ローカルストレージとセッションストレージについて
脆弱性の悪用に入る前に、ローカル ストレージとセッション ストレージの概念を理解することが重要。
ローカル ストレージとセッション ストレージとは何ですか?」
LocalStorage と SessionStorage は、HTML5 で導入されたブラウザー ストレージ機能。 これにより、JavaScript を介して Web ブラウザーのキーと値のペアにデータを保存できるようになり。
通常、ほとんどのブラウザは最大 5MB のブラウザ ストレージをサポートしており、より多くのデータを効率的に保存でき。
脆弱性を悪用しようとしている
収集した情報を使用して、通常ユーザー アカウントに進み、「セッション ストレージ」セクションに移動し。
Session Storage 内で、「userPermissionsList」 ユーザー権限の JSON 配列を含むオブジェクトを見つけ。
管理者レベルのアクセス権を取得するために、管理者アカウントの「userPermissionsList」 オブジェクトをセッション ストレージの通常ユーザーに変更し。
これらの変更を加えた後、ページを更新したところ、驚いたことに、管理レベルのリソースと機能に不正にアクセスできるようになり、簡単に垂直権限昇格が達成され。
私はすぐにこの問題を報告し、2 日後にプログラム マネージャーから 3 桁の報奨金 ($$$) とともに返答を受け取り。
多くの Bug Bounty Hunter がローカル ストレージとセッション ストレージを見落としていることは注目に値し。
これらのストレージ メカニズムには JWT トークン、メール/パスワード、PII などの機密情報が含まれている可能性があるため、常に確認することを強くお勧めします。
ほなほな。