「A Easy Vertical Privilege Escalation via Session Storage」からBroken Access Controlを学ぶ

ソース:

amjadali110.medium.com

脆弱性:Broken Access Control

 

訳:

この記事では、私が最近発見した、セッション ストレージを介した垂直権限昇格のストーリーを共有したいと思います。これは、プライベート プログラムで発見し、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" : "CanQueryIndi​​vidualInvitations" } ,
{ "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" : "CanNotifyIndi​​vidualInvitations" } ,
{ "permissionId" : 37 , "permissionName" : "CanSendInvitationEmail" }
]

 

これらの 「userPermissionsList」 オブジェクトを確認したところ、潜在的脆弱性があることがわかりました。 テストするために、通常のユーザー アカウントに戻りました。

これらの 「userPermissionsList」 オブジェクトを確認したところ、潜在的脆弱性があることがわかりました。 テストするために、通常のユーザー アカウントに戻りました。

ローカルストレージとセッションストレージについて

脆弱性の悪用に入る前に、ローカル ストレージとセッション ストレージの概念を理解することが重要。

ローカル ストレージとセッション ストレージとは何ですか?」

LocalStorage と SessionStorage は、HTML5 で導入されたブラウザー ストレージ機能。 これにより、JavaScript を介して Web ブラウザーのキーと値のペアにデータを保存できるようになり。
通常、ほとんどのブラウザは最大 5MB のブラウザ ストレージをサポートしており、より多くのデータを効率的に保存でき。

脆弱性を悪用しようとしている

収集した情報を使用して、通常ユーザー アカウントに進み、「セッション ストレージ」セクションに移動し。
Session Storage 内で、
「userPermissionsList」 ユーザー権限の JSON 配列を含むオブジェクトを見つけ。
管理者レベルのアクセス権を取得するために、管理者アカウントの「
userPermissionsList」 オブジェクトをセッション ストレージの通常ユーザーに変更し。
これらの変更を加えた後、ページを更新したところ、驚いたことに、管理レベルのリソースと機能に不正にアクセスできるようになり、簡単に垂直権限昇格が達成され。

私はすぐにこの問題を報告し、2 日後にプログラム マネージャーから 3 桁の報奨金 ($$$) とともに返答を受け取り。

 

多くの Bug Bounty Hunter がローカル ストレージとセッション ストレージを見落としていることは注目に値し。
これらのストレージ メカニズムには JWT トークン、メール/パスワード、PII などの機密情報が含まれている可能性があるため、常に確認することを強くお勧めします。

 

ほなほな。