# Write-up ASCIS 2024
## 1. Path Traversal
sử dụng wordlist để Fuzzing và tìm ra file chứa flag


Flag: ASCIS{bWlzb2Z0MjAyNA==}
## 2. SQL
chèn payload vào để bypass login: `admin" OR 1 = 1 — -''`
Flag: ASCIS{s1mpl3st_sql_1n_th3_w0rld}
## 3. DocMan

Nhìn sơ qua giao diện thì mình cũng đoán được ở challenge này chúng ta sẽ cần upload 1 con shell và đọc flag ở `/var/www/data/flag.txt`.
Nói sơ qua chức năng thì ứng dụng này chỉ cho phép chúng ta upload một file `.docx` hoặc `.pdf`.

và có thể xem file được upload thông qua `/g/{givenName}.{ext}`.
Nhưng nếu up một file có size quá lớn thì chương trình sẽ chửi là `Sorry: FORBIDDEN_SIZE`

Sau khi sử dụng cũng như xem các hành vi của chức năng hoạt động như thế nào, thì bây giờ mình sẽ bắt đầu bắt tay vào review source code.
Sau khi down source về thì chúng ta sẽ có những file sau đây:

Sau khi xem qua thì mình focus vào 2 file `action.php` và `lib.php`.
Vì đây là 2 file mấu chốt để xử lý function của chương trình.
Đây là entry point chính. Nó định nghĩa 3 route:
home($p) → Trang chính, cho phép upload file.
upload($p) → Xử lý file upload từ client.
viewOrDownload($p) → Trả nội dung file đã upload thông qua URL /g/{givenName}.{ext}.

**Note**: Source code của `lib.php` khá dài nên mình sẽ copy.
```
<?php
function createGuid() {
if (function_exists('com_create_guid') === true)
return strtolower(str_replace("-", "", trim(com_create_guid(), '{}')));
return strtolower(sprintf('%04X%04X%04X%04X%04X%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)));
}
function checkFileName($name) {
return preg_match("/\.(docx|pdf)$/", strtolower($name));
}
function checkFileType($type) {
return preg_match("/^(application\/vnd\.openxmlformats\-officedocument\.wordprocessingml\.document|application\/pdf)$/", strtolower($type));
}
function checkFileSize($size) {
return ($size >= 1000 && $size <= 100000 ? true : false);
}
function checkFileMagic($fn) {
$handle = fopen($fn, 'r');
$magic = strtoupper(bin2hex(fread($handle, 8)));
fclose($handle);
return ($magic == "504B030414000600" || substr($magic, 0, 8) == "25504446");
}
function sanitizeFileName($fn) {
return preg_replace("/[\s]/", "-", preg_replace("/[\<\'\|\$\_\&\#\.\/\>]/", "", escapeshellarg($fn)));
}
```
Ở đây mình sẽ focus vào chức năng xử lý file upload từ client.
Tóm lại entry point này sẽ nhận file từ client thông qua `$_FILES["newdoc"]`, sau đó sẽ check xem có phải là ext `.docx` hay `.pdf` không.
Tiếp theo sẽ kiểm tra `MIME type` bằng `$file["type"]`
MIME type được accept là :
* application/pdf (`.pdf`)
* application/vnd.openxmlformats-officedocument.wordprocessingml.document (`.docx`)
Và chỉ được upload file với file size từ 1KB đến 100KB.
Sau khi kiểm tra kích thước của file thì chương trình sẽ tiến hành rà soát magic byte
```
else if (!checkFileMagic($file["tmp_name"]))
$err = "FORBIDDEN_TYPE";
```

`fopen($fn, 'r')` sẽ mở file được PHP lưu ở `/tmp/phpXXXX`, sau đó nó sẽ sử dụng hàm `fread()` để đọc 8 byte đầu tiên trong file.
Hàm `bin2hex()` sẽ chuyển 8 byte này sang dạng chuỗi hexa
Ví dụ như:
* Byte `0x50 0x4B 0x03 0x04 0x14 0x00 0x06 0x00` → `504B030414000600`
* Byte `0x25 0x50 0x44 0x46` → `25504446`
Và sau đó kiểm tra, nếu là `504B030414000600` → `.docx` . Nếu bắt đầu bằng `25504446` → `.pdf`.
Dựa vào các dữ kiện trên thì câu hỏi đặt ra là ??
**Sẽ ra sao nếu chúng ta upload một file với `file.php.docx` và chèn code php vào bên trong nội dung của file được upload ??**
Nhưng tại sao mình lại chèn file ext `.php` ở giữa mà không phải ở cuối ???

Nếu để ý thì `sanitizeFileName($arr[1])` nó chỉ lấy phần tử thứ 2 ở vị trí index 1 để xử lý file ext.
Giả sử mình upload file `evil.php.pdf` thì biến `$file` trong hàm `explode()` của mình sẽ là:
```
$arr = explode(".", "evil.php.pdf");
```
Hàm `explode()` sẽ dựa vào dấu chấm và chặt file này ra thành 3 khúc (giống như 1 cây tre chặt 2 nhác thì ra 3 khúc vậy đó).
Và kết quả sẽ như mình nói ở trên, nó sẽ ra:
```
sanitizeFileName($arr[1]) => ".php"
```
=> Bypass thành công!!
Từ những dữ kiện trên cũng như giả thiết mình đưa ra, thì bây giờ mình sẽ đi kiểm chứng và tiến hành Exploit và đọc flag.
Sau khi upload file thì có thể access tới `files/<some-given-name>.php` để xem.



Flag: ASCIS{OhBaby–ChristmasIsComming}