WANNAGAME CHAMPIONSHIP2021
Last updated
Last updated
Type: SSTI
Ở bài này cơ bản trang web sẽ có hai tính năng chính là thực hiện encode và decode base64:
SSTI xảy ra ở phần decode
Sau vài lần thử thì mình phát hiện ra có rất nhiều kí tự và chữ bị filter.
Mình sẽ liệt kê lại một số kí tự theo những gì mình nhớ: +, -, *, /, _, lipsum, request, p, khoảng trắng…
Ngoài ra các kí tự như ., [, không được dùng quá một lần. Okay, công việc chúng ta cần làm là tìm ra một payload thích hợp sao cho có thể né hết những kí tự bị tác giả filter.
Đầu tiên không thể dùng nhiều hơn 1 kí tự ., [,… thì chúng ta có thể sử dụng |attr để thay thế. Từ đây chúng ta có thể list class bằng payload:
Tìm được vị trí của os._wrap_close là 132:
Chúng ta có thể sử dụng hàm getitem() để gọi tới os._wrap_close, nhưng có một vấn đề là chữ “g” đã bị filter. Chúng ta sẽ giải quyết vấn đề này bằng cách thay thế chữ g thành \x67:
Đến đây, hầu hết các khó khăn đều đã được giải quyết, payload hoàn chỉnh sẽ là:
Thực hiện cat file flag, nhưng như mình cũng đã nói ở trên, khoảng trắng đã bị filter nên chúng ta cần thay thể khoảng trắng bằng ${IFS}.
Final payload to get flag:
Flag: Wanna.One{we_wish_u_a_merry_ch1rsmas:3}
Type: SQLI
Vào getmission.phps để xem source code:
Sau khi test một vài lần thì mình thấy một vài kí tự cần thiết bị tác giả filter: and, or, select, sleep, benchmark,…
Trong mysql, chúng ta hoàn toàn có thể sử dụng || để thay cho or và && để thay cho and.
Đến đây thì bài này trở thành một bài blind sqli đơn giản. Khi thực hiện câu query cho ra kết quả một dòng, nếu mission nhập đúng thì sẽ in ra flag, ngược lại sẽ in ra dòng chữ “Mission failed”. Ngược lại nếu câu query cho ra kết quả khác một dòng thì sẽ in ra dòng chữ “Mission failed!!!”. Chúng ta sẽ lợi dụng sự khác nhau giữa “Misstion failed” và “Mission failed!!!” để thực hiện blind lấy misson.
Code tìm mission:
Kết quả:
Flag: Wanna.One{U_1s_r3al_h4ck3rxD:))}