Khai thác lỗi Unrestricted File Upload và các kỹ thuật bypass

Tram Ho

Mở đầu

Upload file là một trong nhưng chức năng quan trọng và phổ biến trên hầu hết các website hiện nay. Các trang mạng xã hội cho phép upload ảnh đại diện, hình ảnh, video, các trang web với chức năng quản lý file, các nền tảng CMS (Content Management System) cho phép up load file ảnh, file tài liệu… Hơn nữa việc xử lý các file này được thực hiện trên phía server nên đây là một trong những mục tiêu được các hacker quan tâm tới đầu tiên khi vào một website.

Việc các ứng dụng web không kiểm soát nội dung các file upload từ phía người dùng hoặc kiểm soát thiếu chặt chẽ có thể sẽ bị lợi dụng để tấn công, gây tổn thương hoặc thậm chí nguy hiểm hơn là chiếm quyền điều khiển web server.

Vậy làm thể nào hacker có thể tấn công vào website của bạn thông qua chức năng upload file? Và dù bạn có các biện pháp để bảo vệ thì liệu thực sự đã an toàn? Bài viết dưới đây sẽ giúp các bạn hiểu rõ một phần việc các lỗi upload file được khai thác như thế nào và cách xử lý ra sao.

Khai thác lỗ hổng

Khai thác ứng dụng không thực hiện validate

Lỗi xảy ra khi ứng dụng không thực hiện kiểm tra file upload từ phía người dùng, người dùng có thể upload file bất kỳ lên phía server.
Ví dụ: Ở đây mình khai thác lỗ hổng trên ứng dụng web (DVWA – một ứng dụng web viết bằng php hỗ trợ chúng ta học cách khai thác lỗ hổng) thông qua chức năng upload ảnh:

Khi upload 1 file ảnh, kết quả thành công và trả về đường dẫn của file ảnh. Ồ, vậy là chúng ta có thể biết file chúng ta up lên nằm ở đâu trên server, vậy chúng ta có thể truy cập vào file đó.
Bây giờ, chúng ta thử upload 1 file php lên xem sao

Truy cập vào file đã upload:

Và thực thi lệnh tùy ý trên server.
Vậy là nếu ứng dụng không kiểm soát file upload lên, chúng ta có thể dễ dàng khai thác chiếm quyền điều khiển server

Một số kỹ thuật bypass khi ứng dụng thực hiện validate

Client validation bypass

Một số ứng dụng web sử dụng javascript để ngăn chặn việc người dùng upload những file độc hại lên phía server.
Ví dụ, đối với chức năng upload ảnh, người phát triển ứng dụng mong muốn người dùng chỉ upload các file ảnh có đuôi .jpg, .png, .gif. Do đó, anh ta sử dụng javascript để kiểm tra file được upload lên có phần đuôi là gì, nếu nó là file ảnh thì sẽ không có vấn đề gì, còn nếu là file độc hại ví dụ: .php, .exe thì sẽ pop-up thông báo file không được phép upload. Ở đây mình thử upload một file .php thì ứng dụng trả về pop-up bên dưới

Như vậy liệu thực sự đã an toàn? Câu trả lời là không, hacker có thể dễ dàng sử dụng các kỹ thuật bypass việc chặn bằng javascript ở phía client bằng cách tắt javascript trên trình duyệt hoặc sử dụng các công cụ như burpsuite để bypass việc ngăn chặn.

Bypass check file name

Ứng dụng thực hiện kiểm tra file được upload lên có phải là file ảnh hay không. Chúng ta sẽ thực hiện bypass bằng cách sử dụng ký tự null byte %00, x00 (Ví dụ: test.php%00.png , test.phpx00.png…)
Khi upload lên server ứng dụng sẽ xử lý loại bỏ phần từ ký tự null trở đi khi đó file sẽ trở thành test.php
Upload file test.phpA.png
Dùng burpsuite sửa hex byte ký tự A (41) -> Ký tự null (00)

Upload thành công

Thực thi lệnh RCE

Bypass check content-type

Ứng dụng kiểm tra file upload lên có đúng content type yêu cầu không. Với file ảnh là: Content-Type: image/jpeg hoặc Content-Type: image/png. Lúc này hacker có thể bypass bằng cách chỉnh sửa content-type của file upload trước khi gửi lên server.
Ở ví dụ này mình sẽ upload 1 file php lên server bằng việc chỉnh sửa content-type. Đây là chức năng upload ảnh ở ví dụ khi không validate nhưng đã được sửa code để kiểm tra file upload lên:

Upload file php bị chặn

Upload file php và chỉnh sửa content-type:

Kết quả upload thành công:

Truy cập tới đường dẫn file và RCE:

Vậy rõ ràng việc kiểm tra content-type là chưa đủ vì hacker vẫn có thể bypass để thực hiện upload file lên server thông qua việc chỉnh sửa content-type

Bypass check header

Một ví dụ khác về việc kiểm tra file không an toàn. Ứng dụng cho phép upload avatar là file ảnh, nếu upload file không phải là file ảnh sẽ bị chặn.
Ở đây, ta sẽ bypass cách cách upload một file không phải là file ảnh nhưng với phần header là một file ảnh:
Upload file html với phần header là file jpg, nhưng nội dung là file html

Kết quả upload thành công:

Và javascript được thực thi (Tấn công XSS)

Biện pháp khắc phục

  • Luôn thực hiện input validation: Kiểm tra đồng thời tên file, content-type, header, file size mỗi khi thực hiện kiểm tra các file upload
  • Phân quyền các thư mục upload, nếu là chức năng upload ảnh thì cần chặn quyền thực thi ở thư mục chứa ảnh
  • Tránh để lộ đường dẫn file được upload lên
  • Đổi tên file trên server khi upload thành công,thực hiện hash đường dẫn file đã được upload để chống lại việc đoán được đường dẫn file
  • Sử dụng các trình scan virus trên server để ngăn chặn việc upload các file độc hại

Lời kết

Trên đây mình chia sẻ một trong số các cách mà hacker có thể sử dụng để thực hiện upload file và vượt qua các kiểm tra về bảo mật. Còn vô vàn các cách khác nhau có thể thực hiện, vì vậy nếu website của bạn có chức năng upload file thì cần thực sự quan tâm đến vấn đề bảo mật của chức năng này.
Cảm ơn các bạn đã theo dõi bài viết!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo