# FileUpload 💾 ## Lý thuyết ![image](https://hackmd.io/_uploads/BJOgpgycC.png) $\to$ User phải giao tiếp với WEB SERVER thông qua trình duyệt $\to$ cần có nhà kho (database) để lưu trữ dữ liệu $\to$ có cơ chế bảo vệ ![image](https://hackmd.io/_uploads/B1oZ1Z1cA.png) ![image](https://hackmd.io/_uploads/SJUFZby5R.png) **khi nhận được request httpd sẽ đi đọc file config đến thư mục root và trả về file home cho người dùng** - ![image](https://hackmd.io/_uploads/S11AZb15A.png) **đọc file conf** - ![image](https://hackmd.io/_uploads/S1PpWsJc0.png) ![image](https://hackmd.io/_uploads/H1xggdii0.png) ## Level 1 1. kiểm tra thực hiện đuôi php - đổi tên đuôi file submit bằng php - lấy ra hai phương thức POST GET cho vào Repeat - ![image](https://hackmd.io/_uploads/rkUwtg7cR.png) - đổi đuôi ở cả hai phương thức sau đó send - ![image](https://hackmd.io/_uploads/BkFiYxm50.png) $\to$ Render hiện như trên ở phương thức GET là trình duyệt đã chạy php thành công 2. Remote Code Execution để lấy flag - thực thi lệch sau ở POST - ![image](https://hackmd.io/_uploads/H1-DqgmqR.png) - ![image](https://hackmd.io/_uploads/HkB-olXqR.png) - + hoặc %20 cũng được - phần Respone sẽ hiện ra như sau ![image](https://hackmd.io/_uploads/BJlDog790.png) - cat file secret là được ![image](https://hackmd.io/_uploads/Bywjog7qA.png) ![image](https://hackmd.io/_uploads/HyeholXc0.png) **phải decode bằng + hoặc %20 nếu không thì** ![image](https://hackmd.io/_uploads/S1a-heX5R.png) $\to$ ![image](https://hackmd.io/_uploads/SkkQng7cC.png) ## level 2 **ở level 2 ta thấy có hàm filter để ngăn chặn việc thực thi php khi upload** ![image](https://hackmd.io/_uploads/Bk_6gI7q0.png) $\to$ để né filter được thì ta vẫn thực thi đuôi php nhưng sẽ không ở vị trí 1 ![image](https://hackmd.io/_uploads/ryf--UQc0.png) **kết quả đã upload thành công với đuôi .php** ![image](https://hackmd.io/_uploads/rJazZLQ5A.png) sau khi vượt qua thì thực thi như sau ![image](https://hackmd.io/_uploads/SkKBMU79A.png) ![image](https://hackmd.io/_uploads/rk_UfLQqA.png) **kết quả** ![image](https://hackmd.io/_uploads/rJ_wGIXc0.png) $\to$ như vậy đã thực hiện id thành công ![image](https://hackmd.io/_uploads/HkXjMImc0.png) **FLAG**![image](https://hackmd.io/_uploads/Byx3zUmcA.png) ## level 3 **làm thế nào để nhận dạng đuôi php vậy liệu còn đuôi nào khác cũng có thể thực thi được câu lệnh trong php không** **ta có regular expression(biểu thức chính quy)** : dùng để định nghĩa các quy chuẩn thành các kí tự đặc biệt ![image](https://hackmd.io/_uploads/B1tx3Pm9A.png) **ở đây ta không thể vượt qua filter được như bài hai bởi đã gắn giá trị ở cuối cùng chứ không xác định vị trí 1 cụ thể như bài 2** $\to$ như vậy phải thay đổi đuôi của file ![image](https://hackmd.io/_uploads/BJb32PQc0.png) ta sẽ tìm hiểu về [biểu thức hậu tố](https://regex101.com/) ![image](https://hackmd.io/_uploads/ryFJaDmc0.png) $\to$ ta đã tìm thấy ngoài đuôi php còn đuôi phtml hoặc phar $\to$ đổi thành đuôi phtml là có thể thực thi được php và làm như level 1 ## level 4 **chúng ta sẽ thao túng lại hành vi của apache2** $\to$ upload file .htaccess lên cùng với file txt để nó có thể thực thi php ngay trong file txt ![image](https://hackmd.io/_uploads/ryx-EeDcR.png) **chỉnh đuôi tùy theo ý muốn.Ngoài txt ta có thể dùng txtml hoặc txar** ![image](https://hackmd.io/_uploads/r1Ng4lv5R.png) ## level 5 ![image](https://hackmd.io/_uploads/SJ4GclwqC.png) $\to$ sau khi var_dump mime_type thì ta thấy có thể kiểm soát được type ![image](https://hackmd.io/_uploads/BycD5ew90.png) **chỉ cần thay đổi content type** ![image](https://hackmd.io/_uploads/Syh1oeDqA.png) - $\to$ vậy sau khi đổi đuôi ta đã upload thành công ![image](https://hackmd.io/_uploads/SyzQjgv5R.png) $\to$ viết php ngay trong file ảnh luôn **FLAG** ![image](https://hackmd.io/_uploads/HycSogvcR.png) ## level 6 **chèn php vào gif** 1. vượt qua filter bằng đuôi gif 2. thực thi php ![image](https://hackmd.io/_uploads/B1-iDqw5R.png) **GET** ![image](https://hackmd.io/_uploads/H10PDcD5C.png) # Tổng kết bí kíp 1. tại sai chỉ có php, asp,jsp bị fileupload . vì nó file-base web ![image](https://hackmd.io/_uploads/BJ7k7iqsA.png) 2. python, NodeJS, Golang là Route-base ![image](https://hackmd.io/_uploads/Hk1G7sqi0.png) ## XSS nâng cao [lab](https://inloop.github.io/sqlite-viewer/) đăng file lên như bình thường để .html thực thi javascript trên html dựa vào tag script ![image](https://hackmd.io/_uploads/SkULpTqoC.png) - ở đây dùng hình ảnh để lấy cú request đến server - tuy nhiên thêm vào cú request đó là extension thêm cả cookie - để lấy được request ta có [webhook](https://webhook.site/#!/view/d9299ba6-ba0e-498c-9d62-9cf92ba2edd1/12fdf6bc-0c9b-46cf-a8a3-ef2bee179424/1) - script sẽ chứa đường dẫn dến URL mà webhook cấp riêng cho bạn **khi người dùng click vào link** đồng nghĩa với việc truy cập đến webhook và cũng trả về cookie của phiên đó ![image](https://hackmd.io/_uploads/HyNsAa9iC.png) vậy là đã lấy được cookie của người dùng bên phía client