DamCTF-2021
Dạng bài: sqli
Bắt đầu challenge, chúng ta sẽ thấy một form đăng nhập:

Ở bước này, chúng ta có thể thực hiện sql injection bằng một payload đơn giản:

Thử click vào free flag, và tất nhiên không thể get flag, đời không như mer. Lại một form đăng nhập nữa mình hiện ra:

Mình thử một vài payload sqli cơ bản nhưng không có gì bất thường, có lẽ chúng ta cần phải lấy được password để đăng nhập. But how??
Câu trả lời nằm ở form đăng nhập đầu tiên, ở đây chúng ta có thể sử dụng blind sqli lên form đăng nhập đầu tiên để lấy mật khẩu:
Code cùi bắp để lấy password do mình viết:
Kết quả:

Thực hiện đăng nhập với password vừa tìm được và username là boxy_mcbounce và get flag.
Flag: dam{b0uNCE_B0UNcE_b0uncE_B0uNCY_B0unce_b0Unce_b0Unc3}
Dạng bài: SSTI
Docker file:

Theo như docker file thì chúng ta đều có thể xem được nội dung của file app.py, check.py, filters.py và limit.py
check.py:
filters.py
limit.py:
Ngoài ra file docker còn cho chúng ta biết được là flag đang ở /flag
Nhìn vào file filters.py, trong hàm e chúng ta sẽ thấy sự xuất hiện của eval().
Mục tiêu của chúng ta là gọi được eval, sau đó thực hiện: open('/flag').read()
kiểm tra trong file check.py, chỉ có nhưng kí tự trong allowlist được phép sử dụng.
Nhưng trong payload của chúng ta sử dụng có những kí tự không được phép: p, n, /, f, a, g, ., r
Lúc này chúng ta có thể sử dụng hàm character trong filters để đổi từ giá trị hex sang ascii để lấy kí tự mong muốn. (Ở đây có một lưu ý là chỉ có số 6, 1, 4 là được phép sử dụng).
p = chr(112) = chr(66+46)
n = chr(110) = chr(66+44)
/ = chr(47) = chr(46+1)
f = chr(102) = chr(44+46+6+6)
a = chr(97) = chr(16*6+1)
g = chr(103) = chr(16*6+6+1)
. = chr(46)
r = chr(114)
Vậy:
Nhưng trong hàm e kiểm tra xem 4 kí tự đầu tiên của tham số truyền vào có phải là open hay không. Nếu là open thì việc gọi eval sẽ thất bại. Vậy nên chúng ta cần sửa đổi một tý để payload trở thành:

Cuối cùng, gọi hàm e để call eval:

Flag: dam{p4infu1_all0wl1st_w3ll_don3}
Thank you for your reading!
Last updated