What is Browser-Powered Request Smuggling?
Bên cạnh các lỗ hổng HTTP request smuggling cổ điển, có một số biến thể dựa trên việc sử dụng trình duyệt web để đưa request prefix độc hại vào chuỗi server ứng dụng.
Các kỹ thuật này có thể hữu ích trong các tình huống sau:
- Chúng ta không thể kiểm soát trực tiếp request header liên quan đến smuggling, nhưng có thể kiểm soát chúng gián tiếp thông qua trình duyệt.
- Các kỹ thuật smuggling cổ điển bị chặn bởi một lớp bảo vệ, nhưng chúng ta có thể vượt qua bằng cách sử dụng trình duyệt để khởi tạo kết nối độc hại.
H2C Upgrade Request Smuggling
HTTP/2 không được hỗ trợ rộng rãi ở cấp độ mạng, nhưng nhiều web server hỗ trợ nó ở cấp độ ứng dụng. Do đó, các trình duyệt hiện đại hỗ trợ một cơ chế gọi là “H2C upgrade” để nâng cấp kết nối từ HTTP/1 sang HTTP/2 nếu server hỗ trợ.
Quá trình nâng cấp diễn ra như sau:
- Client gửi một request HTTP/1.1 với các header sau:
Upgrade: h2c
Connection: Upgrade
- Nếu server hỗ trợ H2C, nó trả về response 101 Switching Protocols và kết nối được nâng cấp sang HTTP/2 cho các request tiếp theo.
- Nếu server không hỗ trợ, nó bỏ qua header Upgrade và xử lý request như bình thường.
Trong một số trường hợp, có thể khai thác cơ chế này để thực hiện request smuggling bằng cách sử dụng trình duyệt để khởi tạo kết nối H2C upgrade đến front-end, sau đó sử dụng kết nối này để gửi request prefix độc hại đến back-end.
How to Exploit H2C Upgrade Request Smuggling
Giả sử front-end hỗ trợ H2C upgrade nhưng back-end không hỗ trợ. Chúng ta có thể thực hiện smuggling như sau:
- Sử dụng trình duyệt để gửi request H2C upgrade đến front-end. Front-end nhận response 101 và nâng cấp kết nối sang HTTP/2.
- Sử dụng kết nối đã nâng cấp để gửi request HTTP/2 chứa prefix của request smuggling, ví dụ với
Content-Length
lớn. - Front-end chuyển đổi request HTTP/2 thành HTTP/1 và chuyển tiếp đến back-end.
- Vì back-end không hỗ trợ HTTP/2, nó xử lý request như HTTP/1 thông thường, dẫn đến desync trong việc diễn giải request.
Kỹ thuật này có thể được sử dụng để khai thác các lỗ hổng như bypassing front-end security controls hoặc revealing request của người dùng khác.
WebSocket Request Smuggling
WebSocket là giao thức hai chiều trên một kết nối TCP duy nhất, thường bắt đầu bằng request HTTP với header Upgrade: websocket
.
Tương tự H2C, chúng ta có thể khai thác sự khác biệt trong cách front-end và back-end xử lý upgrade WebSocket để thực hiện request smuggling.
Exploiting WebSocket Request Smuggling
Nếu front-end hỗ trợ WebSocket nhưng back-end không, chúng ta có thể:
- Gửi request upgrade WebSocket từ trình duyệt.
- Front-end nâng cấp kết nối và gửi request đến back-end.
- Back-end từ chối upgrade, nhưng front-end vẫn giữ kết nối như WebSocket.
- Gửi dữ liệu smuggling qua kết nối WebSocket, mà front-end sẽ diễn giải khác với back-end.
Điều này có thể dẫn đến smuggling request prefix vào back-end.
Potential Limitations and Mitigations
- Không phải tất cả trình duyệt hỗ trợ đầy đủ các kỹ thuật này.
- Các WAF hoặc security controls có thể chặn request upgrade.
- Để giảm thiểu, đảm bảo front-end và back-end đồng bộ trong việc xử lý upgrade protocols.