# KCSC CTF 2023 WRITEUP
---
###### tags: `CTF` `Writeup`
## 1. Bypass Captcha
### Đề bài
https://bypass-captcha.kcsc.tf/

- Bài cũng cho ta source của server:

### Tìm Hiểu Source Code
- Đầu tiên em đã để ý đến đoạn code này:
```php!=
if ($data->success == 1 && $now - $challenge_ts <= 5)
{
if ($passwd === $PASSWD) {
die($FLAG);
} else {
die('Wrong password!');
}
} else {
die('Verify captcha failed!');
}
```
- Đoạn code PHP này cho ta thông tin về cách để Flag hiện ra, đó là captcha được set up thành công và thời gian captcha tồn tại không quá 5 giây, nếu lúc đó $passwd(thứ ta nhập vào) giống với $PASSWD(thứ có trong server) thì flag sẽ hiện ra
- Câu hỏi đặt ra bây giờ là làm như thế nào để biết được giá trị của $PASSWD??
### Phương Hướng Giải Quyết
#### Sau khi đọc về đoạn source code, em nhận ra 2 điểm bất thường của trang web:
- Đầu tiên là dòng code ở phần config.php:
```php!=
parse_str($_SERVER['QUERY_STRING']);
```
+ Đầu tiên ta cần phải biết về biến `$_SERVER['QUERY_STRING']`, nó là một biến siêu toàn cục trong PHP chứa chuỗi query, giả dụ như URL là: http://kcsc.tf/index.php?name=bruh&age=18 thì giá trị của `$_SERVER['QUERY_STRING']` là `name=bruh&age=18`
+ Dòng code này sẽ thực hiện chức năng lấy những giá trị và tên biến được gán trên URL và đưa chúng vào những biến tương ứng trong code, đồng nghĩa với việc phân tích chuỗi đưa vào thành các cặp biến-giá trị.
+ Vấn đề ở đây là, khi ta chỉ sử dụng 1 tham số truyền vào parse_str, nó sẽ coi những biến ở chuỗi đó là biến ở code, giả sử ở đây ta gán `?name=123` thì **$name** sẽ được set giá trị là `123`, nghĩa là ta hoàn toàn có thể thay đổi giá trị của biến ở trong code bằng URL thông qua chức năng parse str
- Tiếp theo là dòng code html ở trong index.php:
```html!=
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST">
```
+ Dòng code này cho ta thấy khi em nộp form này, nó sẽ trả về chính trang web trên(index.php)
+ Tuy nhiên tại sao khi nộp thì họ lại cho em được nhìn thấy địa chỉ trang web?
#### Liên kết dữ liệu, em đã nghĩ ra được hướng giải quyết
- Đầu tiên là em phải làm như nào để có được captcha sao cho nó hợp lệ và tồn tại dưới 5 giây
- Sau đó là thực hiện việc thêm vào URL là `?PASSWD=123` và truyền vào biến $passwd giá trị tương ứng là được
- Vấn đề là giờ khi em thêm vào URL `?PASSWD=123`, khi nộp trang web nó sẽ tự thêm dấu `\` vào trước nên việc sửa trực tiếp là không thể, hơn thế nữa khi em vào trang web trang web lại luôn verify sẵn, nên việc chỉnh sửa là không thể, hoặc là tay em không đủ to :(
- Nhưng sau khi F5 vài lần thì trang web đã cho em tick để verify captcha, thời đã tới, nếu em không thể thêm trực tiếp, em sẽ thêm bằng cách F12
#### Tiến Hành
- Đầu tiên em sẽ sửa đoạn action của form này bằng F12, là địa chỉ mà sau khi submit form sẽ forward đến này thành `/index.php?PASSWD=123`

- Sau đó nhập mật khẩu là 123 và verify captcha, rồi nộp thật nhanh trước khi nó hết hạn là em đã có flag =)):

- Flag của challenge là: `KCSC{Bypass_Turnstile_Cloudflare_1e22c0f8}`
- Tài liệu tham khảo:
+ https://ctftime.org/writeup/11034
+ https://developers.cloudflare.com/turnstile/
## 2. Valentine (stolen)
### Đề bài
https://valentine.kcsc.tf/

- Challenge cũng cho ta writeup của 1 challenge tương tự (chắc chắn không phải là stolen):https://maoutis.github.io/writeups/Web%20Hacking/valentine/
- Đồng thời là file source của challenge

### Phân Tích
- Đầu tiên em đã làm thử theo wu =))), và chắc chắn là không được, nên em đi xem thêm những writeup về challenge 'Valentine' này ở hxp CTF 2022 và nhận ra rằng challenge này đã thay đổi src code, có một đoạn làm em chú ý:
```js!=
app.post('/template', function (req, res) {
let tmpl = req.body.tmpl;
let blacklist = ['<%', '%>', '[.', '.]', '(.', '.)', '{.', '.}', ',', '?', '!', '@', '#', '$', '%', '^', '&', '*', '-', '\\'] // safed keke
blacklist.forEach(e => {
if (tmpl.includes(e)) {
res.status(400).send({ message: "don't hack me" })
}
})
if (tmpl.includes('{{ name }}')) {
tmpl = tmpl.replace(/\{\{/g, '<%=')
tmpl = tmpl.replace(/\}\}/g, '%>')
}
```
- Đây là đoạn mà em thấy đã có sự thay đổi so với hxp CTF, khi mà giờ đã blacklist và không thể sử dụng được payload của writeup đó do dấu `-` đã bị blacklist rồi, nhưng em lại thấy đoạn code này sẽ thay thế dấu `{{` bằng `<%=` và `}}` bằng `%>`, nên em đã nghĩ đến việc chỉ cần thay dấu `<. -` bằng `{{` là sẽ được.
### Tiến Hành
- Em đưa trang web vào Burpsuite để tiến hành thực hiện tấn công SSTI
- Em vẫn sẽ sử dụng payload ở https://hxp.io/blog/101/hxp-CTF-2022-valentine/, nhưng thay đổi ở 2 dấu đầu cuối thành `{{`
- Việc thực hiện SSTI đã thành công, follow direction và em có được flag =))


- Flag của challenge: `KCSC{https://www.youtube.com/watch?v=A5OLaBlQP9I}`
- Tài liệu tham khảo:
+ https://maoutis.github.io/writeups/Web%20Hacking/valentine/
+ https://hxp.io/blog/101/hxp-CTF-2022-valentine/
+ https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection