## Level 1: Path traversal + File upload ------------------------------------------------ ### Overview: - Đây là lab đầu tiên trong chuỗi 3 bài bug bounty. - Sơ qua sẽ có các chức năng là comment và upload file như hình ảnh hoặc file text trong comment. - Lỗi path traversal nằm tại chức năng thay đổi ngôn ngữ mà không kiểm tra, khiến cho có thể thực thi 1 file mà ta upload. ------------------------------------------------- ### 1.Path Traversal: - Nằm tại chức năng thay đổi ngôn ngữ tiếng Anh hoặc tiếng Việt. ![](https://hackmd.io/_uploads/ByySg50Fh.png) - Nhìn qua chúng ta có thể thấy sẽ thực thi 1 câu query để chọn lấy 1 file ngôn ngữ trong database với value được lấy từ directory /lang. ![](https://hackmd.io/_uploads/By9Cx90F3.png) - Sau đó chức năng sẽ set lấy file ngôn ngữ đó vào 1 biến cookie là ```lang```. Việc không kiểm soát giá trị của cookie này khiến attacker có thể tấn công path traversal với giá trị cookie (untrusted data) này do việc sử dụng hàm ```include``` trong php. - Về ```include``` trong PHP. ![](https://hackmd.io/_uploads/r1rnZ5AFn.png) ![](https://hackmd.io/_uploads/Hy66-5RY2.png) - Hàm này sẽ lấy 1 file mà ta truyền vào, sau đó thực thi file đó -> Việc này khá nguy hiểm do hàm này không quan trọng file extension, mà chỉ thực thi những gì bên trong file đó yêu cầu. #### Preventations: - Sanitize giá trị của cookie ```lang``` để tránh việc nó được điều khiển bởi người dùng. - Sử dụng các hàm đọc khác như realpath() hoặc nếu muốn output file có thể sử dụng readfile(). #### Poc ![](https://hackmd.io/_uploads/Bya9Sq0Yh.png) ### 2. File upload - Về file upload thì khá đơn giản, upload 1 file có đuôi .jpg hoặc png hoặc txt không quan trọng vì như đã nói, ```include``` vẫn sẽ thực thi dù không phải là php. ![](https://hackmd.io/_uploads/Sy_SIq0Yn.png) - Developer đã tăng việc bảo mật bằng cách chỉ sử dụng những whitelist extension, nếu như đuôi extension khác 3 extension kia, thì sẽ trả về ```File extension is not allowed```, nhưng developer lại quên rằng nếu sử dụng ```include``` trong php thì việc file extension không quan trọng. - File sẽ được upload vào directory ```upload/' . bin2hex(random_bytes(16))```. Việc random này developer cũng đã sử dụng để có thể tăng cường bảo vệ nhằm tránh attacker có thể tìm ra được directory mà file mình đã upload, thế nhưng do việc sử dụng include file comments.php vào trong index.php, qua đoạn code này lại bỗng nhiên dump ra cho chúng ta file path của tất cả những file mà đã được upload. ![](https://hackmd.io/_uploads/S1ezvY9AFn.png) ![](https://hackmd.io/_uploads/HJWKt5Cth.png) - Việc này khiến cho attacker biết được đường dẫn của file expxloit mà mình đã upload và hoàn toàn kiểm soat được mọi thứ. ### 3. Exploit (Path traversal via file upload to RCE) - Đầu tiên attacker up 1 file lên để có thể bắt burp và sử dụng request đó để upload 1 file với nội dung mà attacker mong muốn (ở đây là thực hiện command). ![](https://hackmd.io/_uploads/rkRDA5RK3.png) - Sau đó sử dụng value của cookie ```lang``` và gọi tới directory của file đã được upload, hàm ```include``` của php sẽ thực thi file đó. ![](https://hackmd.io/_uploads/Bk0yyjAt3.png) - Và chỉ cần upload 1 file thực thi lệnh cat flag chúng ta sẽ có kết quả. ## Level 2: Path traversal + SQLi ------------------------------------------------ ### Overview: - Đây là lab thứ hai trong chuỗi 3 bài bug bounty. - Sơ qua sẽ có các chức năng là comment và upload file như hình ảnh hoặc file text trong comment. - Lỗi path traversal nằm tại chức năng thay đổi ngôn ngữ mà không kiểm tra, khiến cho có thể thực thi 1 file mà ta upload. - Thêm vào đó là chức năng xem file hoặc hình ảnh được upload ở comment được thực thi bằng 1 query không an toàn. ------------------------------------------------- ### 1.Path Traversal: - Nằm tại chức năng thay đổi ngôn ngữ tiếng Anh hoặc tiếng Việt. ![](https://hackmd.io/_uploads/HkEJei0Yh.png) - Nhìn qua chúng ta có thể thấy sẽ thực thi 1 câu query để chọn lấy 1 file ngôn ngữ trong database với value được lấy từ directory /lang. ![](https://hackmd.io/_uploads/By9Cx90F3.png) - Sau đó chức năng sẽ set lấy file ngôn ngữ đó vào 1 biến cookie là ```lang```. Việc không kiểm soát giá trị của cookie này khiến attacker có thể tấn công path traversal với giá trị cookie (untrusted data) này do việc sử dụng hàm ```include``` trong php. - Ở đây developer đã sử dụng việc thêm vào đuôi của value một extension .html, nhưng việc sử dụng hàm ```include``` vẫn là nguyên nhân gây ra lỗi này #### Preventations: - Sanitize giá trị của cookie ```lang``` để tránh việc nó được điều khiển bởi người dùng. - Sử dụng các hàm đọc khác như realpath() hoặc nếu muốn output file có thể sử dụng readfile(). ### 2. File upload to SQLi - Đọc qua đoạn code sau chúng ta có thể thấy: ![](https://hackmd.io/_uploads/HyCpxoCt2.png) - Chúng ta ở đây sẽ không còn được lưu file trên server như trước nữa, chỉ được upload file và sẽ được hiện lên màn hình chính thông qua việc include file comment.php. - Thế nhưng lại có 1 chức năng khác đó là view file ảnh. Việc này được thực thi khi người dùng bấm vào 1 bức ảnh và thông qua 1 query. ![](https://hackmd.io/_uploads/rJOu7jCt3.png) - Nhưng query này lại không kiểm soát id -> SQLi với untrusted data là id có thể kiểm soát bởi attacker. - Bằng việc SQLi, attacker có thể inject vào 1 query mà nhờ đó upload 1 file để RCE lên server - Có thể tham khảo ở đây: ```https://viblo.asia/p/efiens-ctf-2019-write-up-tu-sql-injection-toi-rce-va-get-root-oOVlYom4K8W``` ### 3. Exploit (Path traversal via SQLi to RCE) - Đầu tiên attacker up 1 file lên để có thể bắt burp và sử dụng request đó để upload 1 file với nội dung mà attacker mong muốn (ở đây là thực hiện SQLi to command). ![](https://hackmd.io/_uploads/SyPFNoRFh.png) - Sau đó sử dụng value của cookie ```lang``` và gọi tới directory của file đã được upload, hàm ```include``` của php sẽ thực thi file đó. Dù đó là file html. ![](https://hackmd.io/_uploads/H1-CVjRt3.png) - Và chỉ cần upload 1 file thực thi lệnh cat flag chúng ta sẽ có flag. #### Preventions - Sanitize biến truyền vào khi sử dụng query, hoặc sử dụng prepared statement để ngăn chặn SQLi. Hiện nay prepared statement đang được sử dụng để giúp tăng cường bảo mật, tránh dẫn đến SQLi khi thực thi các câu query - Tham khảo: - https://www.w3schools.com/php/php_mysql_prepared_statements.asp - https://stackoverflow.com/questions/8263371/how-can-prepared-statements-protect-from-sql-injection-attacks