Разбітая аўтарызацыя ўзроўню аб'екта на прыкладах

У гэтым паведамленні мы даследуем і абмяркоўваем правал аўтарызацыі ўзроўню разбітага аб'екта.

Мы пачнем з тлумачэння, што азначае аўтарызацыя ўзламанага ўзроўню аб'екта. Тады мы праходзім атаку, тлумачачы звязаныя з гэтым фактары рызыкі.

Затым мы разгледзім некаторыя магчымыя наступствы ўразлівасці, перш чым нарэшце разгледзець агульныя меры абароны.




Што такое аўтарызацыя ўзроўню разбітага аб'екта

Карацей кажучы, гэты тып атакі азначае, што аўтарызацыя, якая прымяняецца да дадзеных, робіцца не так, як трэба. Гэта прыводзіць да таго, што доступ да рэсурсаў і дадзеных прадастаўляецца тады, калі гэтага не павінна быць.

У мінулым аўтарызацыя зламанага аб'екта была вядомая як 'Небяспечная прамая спасылка на аб'ект' (IDOR).


Калі мы прамаўляем гэтае слова аб'ект пры аўтарызацыі ўзроўню разбітых аб'ектаў мы маем на ўвазе значэнне альбо групу значэнняў. Аб'ектам можа быць паведамленне ў сацыяльнай сетцы, якое змяшчае аўтара, змест і дату публікацыі.

Аўтарызацыя гэта ўсё пра тое, што карыстальнік мае доступ. Такім чынам, гаворка ідзе пра карыстальніка, які ўжо ўвайшоў у сістэму.

Калі карыстальнік робіць запыт на API, ён выкарыстоўваецца для доступу да аб'ектаў. У гэты момант павінна быць прынята рашэнне аб дазволе. Карыстальнік павінен мець доступ толькі да аб'ектаў, да якіх ім быў прадастаўлены доступ. Гэта аўтарызацыя працуе правільна.


Калі аўтарызацыя парушаецца, карыстальнікам дазваляецца атрымаць доступ да дадзеных і рэсурсаў, якія яны не павінны мець.

API палягчае розныя аперацыі над аб'ектамі. Мы можам атрымліваць, ствараць, абнаўляць ці нават выдаляць аб'екты.

Узаемадзеянне з аб'ектам - уся сутнасць API, таму, калі элементы аўтарызацыі вакол гэтых аб'ектаў сапсаваны, у нас уразлівасць Broken Object Level Access.



Выкарыстанне ўразлівасці доступу да ўзламанага ўзроўню аб'екта

Як правіла, лёгка выкарыстаць гэтую ўразлівасць, як толькі яна знойдзена. Усё, што трэба зрабіць зламысніку, - гэта змяніць ідэнтыфікатар у запыце, і яны патэнцыйна атрымалі доступ да аб'ектаў, якія ім не павінны быць дазволены.


Паглядзім на прыкладзе.

Тут у нас ёсць URL, які выкарыстоўваецца для выкліку API:

https://myemail.com/messages/12345

Гэты выклік API выкарыстоўваецца для атрымання асабістых паведамленняў карыстальніка. Рэсурс, які выкарыстоўваецца, ёсць паведамленняў .

Паведамленне - гэта аб'ект, пра які мы маем на ўвазе аўтарызацыю ўзроўню разарванага аб'екта. Мяркуецца, што асабістыя паведамленні можа чытаць толькі прызначаны атрымальнік.


Далей у нас ёсць ідэнтыфікатар паведамлення 12345. Гэта важная частка для зламысніка.

Ідэнтыфікатар кажа службе, якую запіс трэба вярнуць. API атрымлівае гэтую запіс з сховішча дадзеных і вяртае яе ў адказ.

Цяпер, што адбудзецца, калі мы зменім ідэнтыфікатар з 12345 да 12346? напрыклад:

https://myemail.com/messages/12346

Калі паведамленне з ідэнтыфікатарам 12346 быў прызначаны для нашага карыстальніка, мы павінны мець магчымасць атрымаць яго.


Але калі паведамленне належала іншаму карыстальніку, API ніколі не павінен яго вяртаць. Калі нам удалося атрымаць паведамленне, у нас узнікла памылка аўтарызацыі аб'екта непрацуючага ўзроўню.

Іншы прыклад - адпраўка запыту POST на абнаўленне рэсурсу. Мы можам пагуляць з ідэнтыфікатарам у карыснай нагрузцы JSON:

{
'userId': '12345678',
'oldPassword': 'My_0ld_Pa$$',
'newPassword': '$uperS3CurE' }

Калі б мы паставілі які-небудзь патэнцыял userId у запыце і змаглі абнавіць дадзеныя іншага карыстальніка, тады ў нас масавая праблема.

Тэхнічны ўплыў

Як толькі мы даведаемся, што ўразлівасць існуе, мы можам выкарыстоўваць яе любымі спосабамі. Як ужо згадвалася раней, мы можам выкарыстоўваць розныя метады HTTP у API. Мы можам выкарыстоўваць ідэнтыфікатар для абнаўлення і нават выдалення паведамленняў!

Што адбудзецца, калі мы змаглі перабраць усе ідэнтыфікатары? Мы маглі б выдаліць усе захаваныя паведамленні. Гэта вялікі ўплыў.



Агульная ўразлівасць

Гэта вельмі распаўсюджаная ўразлівасць. Як ужо згадвалася раней, API выкарыстоўваюцца для доступу да аб'ектаў, і ў большасці выпадкаў мы выкарыстоўваем ідэнтыфікатары ў запыце для ідэнтыфікацыі рэсурсаў. Пытанне ў тым, ці ёсць для гэтага доступу праверкі аўтарызацыі?

У асноўным ёсць дзве прычыны, па якіх у кодзе ўразлівасці аўтарызацыі ўзламанага ўзроўню аб'екта.

Першае - кантроль бяспекі проста не рэалізаваны. Код не быў напісаны для праверкі аўтарызацыі запытаў.

Другая прычына - чалавечая памылка. Людзі робяць памылкі. Добры прыклад - у API, які апрацоўвае як адчувальныя да неадчувальных дадзеных. Некаторыя запыты павінны мець праверкі аўтарызацыі, а іншыя - не. Такім чынам, можа быць лёгка прапусціць праверку пры напісанні кода.



Як выявіць

Аўтаматызаваныя інструменты звычайна не могуць знайсці гэты тып уразлівасці, бо, як правіла, патрабуецца хаця б крыху мазгоў.

Чалавеку параўнальна лёгка выявіць гэтую ўразлівасць. Усё, што нам трэба зрабіць, гэта знайсці ідэнтыфікатар, які выкарыстоўваецца для атрымання аб'ектаў.

Звярніце ўвагу, ідэнтыфікатар можа быць у Url, у целе запыту ці ў загалоўку.

Таксама мы павінны прааналізаваць і інтэрпрэтаваць адказ, які вяртаецца, каб даведацца, ёсць уразлівасць ці не.

Інструменты

Мы можам выкарыстоўваць любы інструмент, які правярае HTTP-запыты і адказы. Некаторыя з іх:

  • Інструменты распрацоўшчыка Google
  • Люлька «Адрыжка»
  • Паштальён

Burp Suite таксама можна выкарыстоўваць для аўтаматызацыі некаторых запытаў.



Абарона ад дазволу ўзброенага аб'екта

У нас тут дзве абароны.

Першая абарона - выкарыстанне непрадказальныя ідэнтыфікатары, такія як GUID . Калі мы выкарыстоўваем паслядоўныя лічбы ў кодзе, напр. 12345, гэта азначае, што ідэнтыфікатары вельмі прадказальныя. Зламысніку не трэба шмат намаганняў, каб перабраць нумары, каб знайсці прадметы.

Прыклад GUID:

d3b773e6-3b44-4f5f-9813-c39844719fc4

GUID складаныя і іх цяжка ўгадаць, і яны не з'яўляюцца паслядоўнымі.

Наступная абарона - гэта наяўнасць нейкага кода праверыць дазвол . Гэтая праверка часта проста не адбываецца.

Праверка аўтарызацыі павінна адбывацца ў любы час, калі карыстальнік прадстаўляе API у ідэнтыфікатары, які будзе выкарыстоўвацца. Асноўны прынцып заключаецца ў тым, што мы ніколі не павінны давяраць дадзеным, якія карыстальнік дае API.

Запытаны ідэнтыфікатар трэба праверыць, каб пацвердзіць, што карыстальнік мае права доступу да аб'екта.

Гэтыя праверкі могуць быць простымі аглядамі кода падчас распрацоўкі праграмнага забеспячэння і / або аўтаматызаванымі праверкамі, якія правяраюць памылкі аўтарызацыі падчас распрацоўкі.



Выснова

Як мы ўжо бачылі, аўтарызацыя ўзроўню разбітых аб'ектаў - распаўсюджаная ўразлівасць, якую лёгка выявіць і атакаваць. Патэнцыйны ўплыў велізарны.

Сапраўднай крыніцай гэтай уразлівасці з'яўляюцца даверныя дадзеныя, якія кліент перадае API.

Вялікая частка абароны заключаецца ў тым, каб пераканацца, што мы не давяраем гэтым дадзеных. Такім чынам, мы павінны пераканацца, што праверкі аўтарызацыі ёсць.