File upload vulnerabilities
Server Side Vul
Trong bài viết này chúng ta sẽ nghiên cứu về cách để tấn công một trang web bằng upload file và cách ngăn chặn tấn công đó. Để bắt đầu lỗ hổng upload file thì chúng ta phải biết web shell là gì đã...
WebShell là 1 dạng mã độc, backdoor có nhiều chức năng để hỗ trợ các hacker chiếm quyền quản lý các hệ thống website. WebShell thường được viết bằng nhiều loại ngôn ngữ và thường thì chính là ngôn ngữ mà website đó đang sử dụng. Chức năng cơ bản là tải tệp tin lên máy chủ, kết nối đến cơ sở dữ liệu, vượt qua các cơ chế bảo mật, cấu hình, tấn công bruteforce, Get Root, Local Attack… chỉ cần hacker có thể tải được các tệp tin webshell này lên hệ thống của website thì xem như hacker đã có toàn quyền kiểm soát website đó, cho dù không biết tài khoản và mật khẩu của máy chủ này là gì.
Làm thể nào để tải lên và sử dụng một web shell
Kẻ tấn công có thể lợi dụng các lỗ hổng phổ biến để tải webshell lên như:
Cross-site Scripting.
SQL injection.
Lỗ hổng trong các ứng dụng/dịch vụ (ví dụ: wordpress hoặc các ứng cụng CMS khác).
Lỗ hổng xử lý tệp (ví dụ: lọc tải lên hoặc những quyền được chỉ định)
Lỗ hổng về Remote File Include (RFI) và Local File Include (LFI)
Web shells được sử dụng để
Thu thập và lọc dữ liệu nhạy cảm, các thông tin quan trọng.
Tải lên các phần mềm độc hại, VD: Một lỗ hổng có khả năng lây lan và scan các nạn nhân tiếp theo.
Đóng vai trò như một điểm tự để tạo ra các lệnh cho các hosts trong mạng mà không cần phải truy cập internet trực tiếp.
Có chức năng như một cơ sở hạ tầng điều khiển và kiểm soát, có khả năng như một bot trong một mạng botnet.
Mặc dù webshell thường không được sử dụng cho các cuộc tấn công DoS, nhưng nó vẫn có thể hoạt động như một platform để tải lên các công cụ khác, bao gồm cả DoS.
Tới đây là ổn rồi nếu muốn đọc chi tiết hơn thì có thể đọc ở đây
Lỗ hổng Upload file là gì ?
Lỗ hổng Upload file là khi máy chủ web cho phép người dùng tải tệp lên filesystem của nó mà không xác nhận đầy đủ những thứ như tên, loại, nội dung hoặc kích thước của chúng. Không thực thi đúng các hạn chế đối với những điều này có thể có nghĩa là ngay cả một 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 nguy hiểm. Điều này thậm chí có thể bao gồm các tệp kịch bản phía máy chủ cho phép thực thi mã từ xa.
Trong một số trường hợp, bản thân hành động tải tệp lên đã đủ để gây ra thiệt hại. Các cuộc tấn công khác có thể liên quan đến một yêu cầu HTTP tiếp theo cho tệp, thường là để kích hoạt việc thực thi của nó bởi máy chủ.
Ảnh hưởng của lỗ hổng Upload file
Tác động của các lỗ hổng Upload file thường phụ thuộc vào hai yếu tố chính:
Phần nào của tệp mà trang web không thể xác thực đúng cách, cho dù đó là kích thước, loại, nội dung....
Những hạn chế nào được áp dụng cho tệp sau khi nó đã được tải lên thành công.
Trong trường hợp xấu nhất, loại tệp không được xác thực đúng cách và cấu hình máy chủ cho phép một số loại tệp nhất định (chẳng hạn như .php
và .jsp
) được thực thi dưới dạng code
. Trong trường hợp này, kẻ tấn công có thể tải lên tệp mã phía máy chủ có chức năng như một trình bao web, cấp cho chúng toàn quyền kiểm soát máy chủ một cách hiệu quả.
Nếu tên tệp không được xác thực đúng cách, điều này có thể cho phép kẻ tấn công ghi đè các tệp quan trọng chỉ bằng cách tải lên tệp có cùng tên. Nếu máy chủ cũng dễ bị truy cập thư mục , điều này có nghĩa là những kẻ tấn công thậm chí có thể tải tệp lên các vị trí không lường trước được.
Không đảm bảo rằng kích thước của tệp nằm trong ngưỡng dự kiến cũng có thể kích hoạt một hình thức tấn công từ chối dịch vụ (DoS
), theo đó kẻ tấn công lấp đầy không gian đĩa có sẵn.
Khai thác tải lên tệp không bị filter để triển khai web shell
Nếu bạn có thể tải lên web shell thành công, bạn có toàn quyền kiểm soát máy chủ. Điều này có nghĩa là bạn có thể đọc và ghi các tệp tùy ý, tách dữ liệu nhạy cảm, thậm chí sử dụng máy chủ để xoay trục các cuộc tấn công chống lại cả cơ sở hạ tầng nội bộ và các máy chủ khác bên ngoài mạng.
Ví dụ: một lớp lót PHP sau đây có thể được sử dụng để đọc các tệp tùy ý từ hệ thống tệp của máy chủ:
Một script khác như như sau:
Code trên sẽ được hiểu hệ thống sẽ lấy đầu vào url từ tham số trên
Khi đó trang web sẽ trả về file php mà bạn đã upload như sau:
Khai thác bypass xác thực upload file
Thường thì chúng ta không dễ để upload file php..... lên dễ như thế được. Các trang web sẽ phòng chống bằng cách sử dụng một số filters để ngăn chặn khả năng tải lên mã độc. Do đó , để có thể khai thác được lỗ hổng này , chúng ta cần phải vượt qua các filters đó:
Khai thác lỗ hổng Upload file
Content/type Vertification
Khi gửi biểu mẫu HTML, trình duyệt thường gửi dữ liệu được cung cấp trong một POST
yêu cầu với loại nội dung application/x-www-form-url-encoded
. Điều này phù hợp để gửi văn bản đơn giản như tên, địa chỉ của bạn, v.v., nhưng không phù hợp để gửi một lượng lớn dữ liệu nhị phân, chẳng hạn như toàn bộ tệp hình ảnh hoặc tài liệu PDF. Trong trường hợp này, loại nội dung multipart/form-data
là cách tiếp cận ưu tiên.
Hãy xem xét một biểu mẫu chứa các trường để tải lên một hình ảnh, cung cấp mô tả về nó và nhập tên người dùng của bạn. Việc gửi một biểu mẫu như vậy có thể dẫn đến một yêu cầu giống như sau:
Đây là kiểu xác thực mà nhà phát triển yêu cầu file upload trong trường hợp này bắt buộc phải là kiểu image thì mới được chấp thuận . Tuy nhiên , Content/type lại có thể thay đổi trước khi đến server cho nên chúng ta chỉ cần đổi từ type application/octet-stream sang image/(kiểu định dang ảnh của bạn) ví dụ như là image/jpeg
Ngăn chặn thực thi tệp trong thư mục người dùng có thể truy cập
Mặc dù rõ ràng tốt hơn là ngăn chặn các loại tệp nguy hiểm được tải lên ngay từ đầu, nhưng tuyến phòng thủ thứ hai là ngăn máy chủ thực thi bất kỳ tập lệnh nào lọt qua mạng.
Để đề phòng, các máy chủ thường chỉ chạy các tập lệnh có kiểu MIME mà chúng đã được định cấu hình rõ ràng để thực thi. Nếu không, chúng có thể chỉ trả lại một số loại thông báo lỗi hoặc trong một số trường hợp, phân phát nội dung của tệp dưới dạng văn bản thuần túy thay thế:
Khi đó chúng ta vẫn truy cập được file nhưng nó sẽ không hiện gì hoặc hiện file của mình như văn bản bình thường, trong trường hợp này chúng ta hãy truyền thêm cho nó ../
trong kỹ thuật tấn công lỗ hổng directory traversal, nên encode nó rồi truyền nó vào filename
Insufficient blacklisting of dangerous file types
Như trên bạn có thể thấy rằng black list tức là 1 danh sách đen các shell bị các nhà phát triển web chặn nhằm chống việc tải shell lên trang web. Nhưng trong blacklist ấy là một insufficiet blacklist - danh sách đen thiếu extensions(phần mở rộng như đuôi .php
.png
....)
Ghi đè cấu hình server
Các máy chủ thường sẽ không thực thi các tệp trừ khi chúng đã được định cấu hình để làm như vậy.
Ví dụ: trước khi máy chủ Apache thực thi các tệp PHP do máy khách yêu cầu, các nhà phát triển có thể phải thêm các lệnh sau vào /etc/apache2/apache2.conf
tệp của họ:
Nhiều máy chủ cũng cho phép các nhà phát triển tạo các tệp cấu hình đặc biệt trong các thư mục riêng lẻ để ghi đè hoặc thêm vào một hoặc nhiều cài đặt chung. Ví dụ, máy chủ Apache sẽ tải một cấu hình dành riêng cho thư mục từ một tệp được gọi .htaccess
nếu có.
Các nhà phát triển có thể tạo cấu hình theo thư mục cụ thể trên máy chủ IIS bằng cách sử dụng một file web.config
. Điều này có thể bao gồm các lệnh như sau, trong trường hợp này cho phép các tệp JSON được phân phát cho người dùng:
Máy chủ web sử dụng các loại tệp cấu hình này khi có mặt, nhưng bạn thường không được phép truy cập chúng bằng các yêu cầu HTTP. Tuy nhiên, đôi khi bạn có thể tìm thấy các máy chủ không ngăn bạn tải lên tệp cấu hình độc hại của riêng mình. Trong trường hợp này, ngay cả khi phần mở rộng tệp bạn cần bị đưa vào danh sách đen, bạn có thể lừa máy chủ bằng cách tùy chỉnh một phần mở rộng tệp, tùy ý sang kiểu MIME có thể thực thi.
Ở đây nếu các bạn chưa biết kiểu MIME là gì có thể xem ở đây
Ở đây chúng ta có thể up file cấu hình .htaccess
lên, sau đó thêm AddType application/x-httpd-php .l33t
vào file cấu hình tiếp đó tải file chứa code php lên và thay đổi extension thành .l33t
Nhờ file .htaccess
, nên ghi đè lên cấu hình server nhờ đó file .l33t
đã được thực thi như thể nó là một file .php
.
Obfuscating file extensions
Có thể hình dung nó như bypass extensions của file. Giả sử mã xác thực có phân biệt chữ hoa chữ thường và không thể nhận ra đó exploit.pHp
thực sự là một file .php
.
Chúng ta có thể sử làm như này:
Tùy thuộc vào thuật toán được sử dụng để phân tích cú pháp tên tệp, tệp sau có thể được hiểu là tệp PHP hoặc hình ảnh JPG:
exploit.php.jpg
Thêm ký tự ở cuối. Một số thành phần sẽ loại bỏ hoặc bỏ qua khoảng trắng ở cuối, dấu chấm, và những thứ tương tự như vậy:
exploit.php.
Hãy thử sử dụng mã hóa URL (hoặc mã hóa URL kép) cho dấu chấm, dấu gạch chéo lên và dấu gạch chéo ngược. Nếu giá trị không được giải mã khi xác thực phần mở rộng tệp, nhưng sau đó được giải mã phía máy chủ, điều này cũng có thể cho phép bạn tải lên các tệp độc hại mà nếu không sẽ bị chặn:
exploit%2Ephp
Thêm dấu chấm phẩy hoặc ký tự byte rỗng được mã hóa URL trước phần mở rộng tệp. Ví dụ: nếu xác thực được viết bằng ngôn ngữ cấp cao như PHP hoặc Java, nhưng máy chủ xử lý tệp bằng cách sử dụng các hàm cấp thấp hơn trong C / C ++, điều này có thể gây ra sự khác biệt về những gì được coi là phần cuối của tên tệp:
exploit.asp;.jpg
hoặcexploit.asp%00.jpg
Hãy thử sử dụng các ký tự unicode nhiều byte, có thể được chuyển đổi thành byte và dấu chấm rỗng sau khi chuyển đổi hoặc chuẩn hóa unicode. Các chuỗi giống như
xC0 x2E
hoặcxC4 xAE
cóxC0 xAE
thể được dịch sangx2E
nếu tên tệp được phân tích cú pháp thành chuỗi UTF-8, nhưng sau đó được chuyển đổi thành các ký tự ASCII trước khi được sử dụng trong một đường dẫn.Nếu bị file bị lọc ký tự như lọc
.php
bằng cách xóa nó đi thì chúng ta có thể thêm như sauwebshell.p.php.hp
khi đó chúng ta vẫn có thể exploit như thường
Flawed validation of the file's contents
Thay vì hoàn toàn tin tưởng vào thông tin Content-Type
được chỉ định trong một yêu cầu, các máy chủ an toàn hơn cố gắng xác minh rằng nội dung của tệp thực sự khớp với những gì được mong đợi.
Tương tự, một số loại tệp nhất định có thể luôn chứa một chuỗi byte cụ thể trong đầu trang hoặc chân trang của chúng. Chúng có thể được sử dụng như dấu vân tay hoặc chữ ký để xác định xem nội dung có khớp với loại mong đợi hay không. Ví dụ: các tệp JPEG luôn bắt đầu bằng các byte FF D8 FF
.
Đây là một cách xác thực loại tệp mạnh mẽ hơn nhiều, nhưng ngay cả điều này cũng không dễ dàng chút nào. Bằng cách sử dụng các công cụ đặc biệt, chẳng hạn như ExifTool, việc tạo một file polyglot JPEG có chứa mã độc hại.
Oke nếu chưa hiểu thì chúng ta sẽ phân tích lab này nhé.
Lab này tất nhiên chúng ta không thể upload file php lên được vậy chúng ta sẽ sử dụng tool Exiftool để thêm Comment vào file ảnh jpg hoặc png..
Ở đây chúng ta sẽ phân tích câu lệnh trên như sau: -Comment thì để ghi vào file ảnh gốc của bạn và -o có nghĩa đặt tên file hoặc thư mục đầu ra của bạn, ở đây là webshell.php
Khi xem chi tiết file webshell.php thì nó vẫn là file ảnh => upload thành công.
Exploiting file upload race conditions
................................................Mình sẽ update cái này sau....................................................
Uploading files using PUT
Ngoài POST chúng ta có thể dùng PUT để up file lên:
Cách ngăn chặn lỗ hổng upload file
Việc cho phép người dùng tải tệp lên là điều phổ biến và không nguy hiểm miễn là bạn thực hiện đúng các biện pháp phòng ngừa. Nói chung, cách hiệu quả nhất để bảo vệ các trang web của bạn khỏi những lỗ hổng này là thực hiện tất cả các phương pháp sau:
Kiểm tra phần mở rộng tệp với danh sách trắng gồm các phần mở rộng được phép thay vì danh sách đen gồm các phần mở rộng bị cấm. Việc đoán những tiện ích mở rộng nào bạn có thể muốn cho phép dễ dàng hơn nhiều so với việc đoán những tiện ích mở rộng mà kẻ tấn công có thể cố gắng tải lên.
Đảm bảo rằng tên tệp không chứa bất kỳ chuỗi con nào có thể được hiểu là thư mục hoặc chuỗi truyền tải (
../
).Đổi tên tệp đã tải lên để tránh va chạm có thể khiến tệp hiện có bị ghi đè.
Không tải tệp lên hệ thống tệp vĩnh viễn của máy chủ cho đến khi chúng đã được xác thực hoàn toàn.
Càng nhiều càng tốt, hãy sử dụng một khuôn khổ đã thiết lập để xử lý trước quá trình tải lên tệp thay vì cố gắng viết các cơ chế xác thực của riêng bạn.
Tổng kết
Cảm ơn các bạn đã đọc bài viết, trong những bài viết của mình những bài về phần EXPERT
- Chuyên gia thì mình sẽ viết lại sau, vì phần này mình cần học kỹ hơn để đọc hiểu rõ, chứ chúng ta không nên xem solution và áp luôn payload mà không hiểu rõ những cái trong phần đó.
Last updated