Ushbu bo'limda ilg'or texnikalarni va HTTP/2'ga asoslangan hujumlarni ko'rib chiqamiz. Bu laboratoriyalar PortSwigger tadqiqot direktori James Kettle tomonidan Black Hat USA 2021'da taqdim etilgan real zaifliklarga asoslangan.
Ko'pchilikning fikridan farqli, HTTP/2'ni joriy qilish ko'p saytlarni request smuggling'ga ko'proq zaif qildi. HTTP/2 xabarlari alohida "freym"lar sifatida yuboriladi, har biri aniq uzunlik maydoni bilan — bu HTTP/2'ni tabiiy immunitetli qiladi. Muammo esa HTTP/2 downgrading'da: front-end HTTP/2 so'rovni HTTP/1 sintaksisiga qayta yozadi.
HTTP/2 so'rovlar uzunlikni header'da ko'rsatishi shart emas, lekin o'z content-length header'ini o'z ichiga olishi mumkin. Downgrading paytida ba'zi front-end'lar bu qiymatni tekshirmasdan qayta ishlatadi. Front-end HTTP/2 uzunligini ishlatadi, back-end esa siz kiritgan Content-Length'ni — natijada desync:
:method POST
:path /example
:authority vulnerable-website.com
content-length 0
GET /admin HTTP/1.1
Host: vulnerable-website.com
Content-Length: 10
x=1Chunked transfer encoding HTTP/2 bilan mos kelmaydi va spetsifikatsiya transfer-encoding: chunked header'i olib tashlanishi kerakligini aytadi. Front-end buni qilmasa va so'rovni HTTP/1 back-end uchun downgrade qilsa, request smuggling yuzaga keladi.
HTTP/2 binar format bo'lgani uchun header chegaralari delimiter belgilariga emas, aniq ofsetlarga asoslanadi. Ya'ni \r\n header qiymati ichida bo'lishi mumkin. Lekin bu HTTP/1'ga qayta yozilganda \r\n yana header delimiteri sifatida talqin qilinadi va back-end ikkita alohida header ko'radi:
foo bar\r\nTransfer-Encoding: chunkedBitta HTTP so'rovni back-end'da aniq ikkita to'liq so'rovga bo'lish mumkin. HTTP/2 downgrading'da bu bo'linishni tana o'rniga header'larda amalga oshirishingiz mumkin — bu ko'p qirrali, chunki tana talab qilmaydigan GET kabi metodlarni ham ishlatish mumkin:
:method GET
:path /
:authority vulnerable-website.com
foo bar\r\nHost: vulnerable-website.com\r\n\r\nGET /admin HTTP/1.1Response queue poisoning — kuchli request smuggling hujumi bo'lib, boshqa foydalanuvchilarga mo'ljallangan ixtiyoriy javoblarni o'g'irlashga imkon beradi, ularning hisoblarini va hatto butun saytni buzishi mumkin. Bu bitta so'rovni back-end'da aniq ikkita to'liq so'rovga bo'lishga tayanadi.
Ko'p hujumlar front-end va back-end o'rtasidagi ulanish qayta ishlatilgani uchun mumkin. HTTP request tunnelling esa ulanish umuman qayta ishlatilmaganda ham jiddiy ekspluatatsiya yaratish yo'lini beradi.
0.CL desync hujumlari front-end back-end qayta ishlaydigan Content-Length header'ini e'tiborsiz qoldirganda yuzaga keladi. Bu uzoq vaqt ekspluatatsiya qilib bo'lmaydigan deb hisoblangan (serverlar o'rtasidagi deadlock tufayli). Lekin 0.CL hujumini "early-response gadget" bilan birlashtirib deadlock'ni buzish va to'liq ekspluatatsiya qurish mumkin.