HTTP request smuggling
# Lí thuyết
https://xz.aliyun.com/t/6878?time__1311=n4%2BxnD0DRDyB%3Dx053b7e0QKitki%3De%3DD97YD
https://portswigger.net/web-security/request-smuggling
https://www.youtube.com/playlist?list=PLGb2cDlBWRUX1_7RAIjRkZDYgAB3VbUSw

# lab Portswigger
## lab1
- Mô tả:

- Bài này đơn giản thôi như chúng ta thấy lab ghi khá rõ phần front-end sẽ không hỗ trợ chunked encoding nghĩa là nó chỉ cho phép xử lí body với content-lenght. Và để solved được bài này yêu cầu ta phải làm xuất hiện chuỗi **GPOST** bên respone.
- Bước đầu chúng ta sẽ cần detect BE là CL hay là TE chúng ta sẽ gửi reequest theo imgae ở trên. Lưu ý lab dùng http2.0 chúng ta phải giảm xuông 1.1 theo như bài nói.

- Ta có thể thấy server timeout -> server ưu tiên xử lí TE. Do lúc này BE xử lí qua transfer-encoding không nhận được chunk 0 để đánh dấu dữ liệu đã kết thúc nên server cứ chờ đợi và bị timeout. Vậy chúng ta làm sao để trong respone xuất hiện **GPOST**.
- Chúng ta đơn giản sẽ gửi request như sau:

- Reqest này sau khi backend xử lí với TE sẽ dư ra kí tự **G** và kí tự này sẽ được BE cộng vào request tiếp theo khi tới. Và ngay lúc này ngay khi ta gửi 1 request khác tới thì nó sẽ cộng chuỗi G vào và ta được chuỗi **GPOST** theo ý muốn rồi.

## Lab2

- Bài này ngược lại với bài trên thôi front-end sẽ ưu tiên xử lí qua TE, Và chúng ta sẽ phải làm sao cho respone trả về GPOST là được.
- Trước tiên chúng ta sẽ xem BE xử lí ưu tiên CL hay TE. Gửi request đơn giản như sau.

- TimeOut ta xác định ngay là CL vì request khi đi qua front-end sẽ drop kí tự X do ưu tiên xử lí TE, Và khi request tới BE chúng ta chỉ còn 5 kí tự là `0\r\n\r\n` mà nó ưu tiên xử lí qua CL với CL khai báo là 6 mà chỉ có 5 byte tới nó sẽ đợi byte cuối cùng và bị timeout.
- Để giải quyết bài này ta sẽ gửi 1 request như sau:

- Request này chúng ta sẽ gửi 1 cấu trúc gói tin HTTP trong phần chunk. Khi request này tới front-end nó sẽ xử lí qua CL chỉ lấy 4 byte là `5c\r\n` và phần còn lại sẽ được thêm vào request tiếp theo. Chú ý ở đây trong phần request GPOST chúng ta phải khai báo CL lớn hơn giá trị thực thì mới xuất hiện bug do khi ta chỉ khai báo đủ thì khi được cộng vào reqest tới nó sẽ chỉ như request bthg do cộng khá là đầy đủ như 2 request luôn và request tới kia sẽ không bị poison.

## lab3

- Nhìn đề ta cũng đoaán ra được rôi cả BE và FE đều sử ưu tiên dùng TE để truyền dữ liệu. Vậy thì vuln ở đâu tuy cùng ưu tieenn xử lí TE nhưng đôi lúc vẫn có sự khác biệt bài này là ví dụ điển hình, chúng ta có thể làm xáo trộn header TE để cho nó server sẽ bị rối và không xác định chính xác va lúc này nó sẽ ưu tiên dùng CL thay vì TE.
- Mình sẽ làm rối nó như sau:

- Và ta sẽ gửi 1 request khác để test kết quả.

- Như các bạn thấy FE sẽ không bị làm rối nhưng ở BE thì có, vì ta có thể thấy ở reqeust 2 hiện lên **G0POST** có nghĩa là BE bị làm rối TE và ưu tiên dùng CL và phần còn lại sẽ được thêm vào request tiếp theo. Với cách nay để làm xuất hiện chữ GPOST ta đơn giản làm như sau thôi.


## lab4

- Đây là 1 bài dùng http smug để bypass các route bi cấm bởi FE nhưng BE thì không. Chúng ta trước tiên đơnn giản sẽ xác định xem FE và BE thuộc dạng gì.

- Time out chúng ta đơn giản có thể xác định rằng đây là CL.TE. Vây thì h chúng ta đơn giản lam như những baì trên thôi.

- Sau khi truy cập tới route/admin thành công có vẻ ta cần 1 yêu cầu nữa là local user thì cái này có thể server xét thông qua header Host hay gì đó chúng ta có thể thử.

- Khá là ngon rồi h chúng ta chỉ cần truy cập tới route xóa thg user kia thôi.

- Chúng ta phải xuống dòng và thêm 1 tham số x để gửi đi cùng vì server BE không cho phép 2 header cùng name trong 1 reqeust, vì thế chúng ta sẽ ngắt phần header của reqeust smug bằng cách xuống dòng và khiến request tới thành 1 phần giá trị của tham số x.
- kết quả nè...

## lab5

- Thì đây cũng giống như bài trên nhưng à dang TE.CL. Trước tiên ta cứ kiểm tra xem nó là dạng gì là được.

- Sau khi xác định xong chúng ta đơn giản là smug 1 request vào thôi.

- Ở bài nãy cũng yêu cân local user ta thêm header HOST vào là được

- Xóa account theo yêu cầu nữa là được.
