Basic
Sử dụng lỗ hổng CL.TE (Content-Length và Transfer-Encoding), chúng ta có thể “buôn lậu” một request thứ hai bên trong một request POST. Frontend server (ví dụ: Apache Traffic Server) sẽ chỉ xử lý header Content-Length
, trong khi backend server sẽ xử lý header Transfer-Encoding
.
Attack Request:
POST / HTTP/1.1
Host: httprequestsmuggling.thm
Content-Length: 160
Connection: keep-alive
Transfer-Encoding: chunked
0
POST /contact.php HTTP/1.1
Host: httprequestsmuggling.thm
Content-Type: application/x-www-form-urlencoded
Content-Length: 500
username=test&query=§
Request thứ hai (smuggled) sẽ được backend xử lý, có thể dùng để lấy thông tin nhạy cảm.
Success
THM{1c4N_$mU66l3!!}
HTTP/2
Với HTTP/2, chúng ta có thể khai thác lỗ hổng H2.CL bằng cách chèn CRLF (\r\n
) vào header. Varnish proxy sẽ chuyển đổi request HTTP/2 thành HTTP/1.1 và không validate đúng các ký tự newline, cho phép chúng ta smuggle một request khác.
Attack Request:
POST / HTTP/2
Host: 10.10.38.110:8000
Cookie: sessid=ba89f897ef7f68752abc
Sec-Ch-Ua: "Not;A=Brand";v="24", "Chromium";v="128"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://10.10.38.110:8000/post/12315198742342
Accept-Encoding: gzip, deflate, br
Priority: u=0, i
Content-Length: 0
GET /post/like/12315198742342 HTTP/1.1
Foo: x
Request này sẽ khiến người dùng khác “like” bài viết của chúng ta.
Success
THM{my_name_is_a_flag}
Tunneling
Leaking Internal Headers
Khai thác CVE-2019-19330 trong HAProxy. Bằng cách chèn CRLF vào giá trị header, chúng ta có thể smuggle một request và làm lộ các header nội bộ mà backend server thêm vào.
Success
THM{not_secret_anymore}
Bypassing Frontend Restrictions
Tương tự như trên, chúng ta có thể smuggle một request để truy cập vào các endpoint bị chặn bởi frontend proxy.
Success
THM{staff_only}
Web Cache Poisoning
Chúng ta có thể smuggle một request để làm nhiễm độc bộ đệm cache của web, khiến người dùng khác khi truy cập vào một tài nguyên (ví dụ: file JS) sẽ nhận được nội dung độc hại từ server của chúng ta.
Success
THM{nom_nom_cookies}
h2c Smuggling
Kỹ thuật này cho phép nâng cấp một kết nối HTTP/1.1 lên HTTP/2 qua cleartext (không mã hóa). Một số proxy sẽ chuyển tiếp các header nâng cấp này đến backend thay vì tự xử lý. Điều này tạo ra một “đường hầm” HTTP/2, cho phép chúng ta gửi các request trực tiếp đến backend, bypass proxy.
Công cụ: h2csmuggler.
Success
THM{walls_are_a_suggestion}
WebSockets
Chúng ta có thể gửi một request nâng cấp WebSocket “giả” với header Sec-WebSocket-Version
không hợp lệ. Một số proxy sẽ tin rằng kết nối đã được nâng cấp và tạo một đường hầm, trong khi backend vẫn xử lý nó như một kết nối HTTP thông thường. Điều này cho phép chúng ta smuggle các request HTTP qua đường hầm này.
Lab 1: Proxy không kiểm tra phản hồi của backend
Proxy (Varnish) không kiểm tra phản hồi từ backend, nên nó sẽ tạo đường hầm ngay cả khi backend từ chối nâng cấp.
Success
THM{bf208caddc31c6bb52621fdc2b3a73e5}
Lab 2: Proxy có kiểm tra phản hồi của backend
Proxy (Nginx) sẽ kiểm tra phản hồi. Chúng ta cần tìm một lỗ hổng khác (ví dụ: SSRF) để ép backend trả về một response 101 Switching Protocols
giả, lừa proxy rằng việc nâng cấp đã thành công.
Success
THM{a87d4e5b777c010ed3266e59fb42ccac}
Browser Desync
Đây là một kỹ thuật tấn công phía client. Chúng ta có thể khai thác sự khác biệt trong cách trình duyệt và server xử lý các request không rõ ràng để thực hiện các cuộc tấn công như cross-site scripting (XSS). Bằng cách gửi một request POST với body chứa một request GET “lồng” vào, chúng ta có thể làm cho server lưu trữ một payload độc hại và thực thi nó trên trình duyệt của người dùng khác.
Success
THM{SMUGGLING_IS_FUN}