Tổng quan về phương pháp tấn công Deserialization trong PHP (phần cuối)

Tram Ho

Triển khai thực nghiệm tấn công lỗ hổng Deserialization trên nền tảng PHP

  1. Mô tả hoạt động của ứng dụng
  • Mô tả hoạt động của ứng dụng

    • Ứng dụng web thực hiện chức năng đăng nhập và hiển thị. Ứng dụng web có các chức năng chính và luồng hoạt động như sau:

    • Chức năng đăng nhập: Người dùng nhập thông tin tài khoản và mật khẩu để tiến hành
      đăng nhập. Sau khi nhận được thông tin người dùng gửi lên, ứng dụng thực hiện truy vấn cơ
      sở dữ liệu rồi trả về kết quả. Nếu thông tin đúng, đăng nhập thành công, chuyển sang trang
      chính (home.php).

    • Nếu thông tin sai, hiện thông báo sai mật khẩu.

    • Khi đăng nhập thành công, ứng dụng web sẽ tiến hành serialize một số thông tin liên
      quan đến người dùng và gán vào cookie. Khi truy cập vào trang home.php, ứng dụng web dựa
      vào thông tin từ session và cookie để trả về thông tin, đó là nội dung Hello: tên user.
  1. Phân tích lỗ hổng và khai thác
  • Phân tích chức năng khi login thành công. Ứng dụng web sẽ tạo ra cookie và gán cho trình duyệt. Dưới đây là yêu cầu http đăng nhập:

    • Khi đăng nhập thành công, máy chủ trả về một yêu cầu chuyển hướng sang home.php

    • Phân tích kết quả trả về, dựa vào trường cookie mà ứng dụng web gán cho trình duyệt,
      đây chính là đoạn nội dung đã thực hiện url-encode của một đoạn dữ liệu đã được serialize.
      Thực hiện decode cookie:

    • Đoạn dữ liệu được gán ở cookie cung cấp cho ta một số thông tin liên quan đế người dùng. Vì giá trị ở cookie nên người dùng hoàn toàn có thể sửa đổi thông tin ở người dùng và gửi liên máy chủ.
    • Thử nghiệm thay đổi giá trị fullname từ KMA sang KMAAAA với giá trị cookie như sau:

    • Và kết quả là:

    • Chứng tỏ rằng, ứng dụng web đã thực hiện deserialize nội dung từ cookie được gửi từ
      người dùng và dùng để hiển thị ra nội dung trang web. Ở đây, ứng dụng web đã có tồn tại
      điểm yếu: thực hiện deserialize dữ liệu từ người dùng gửi lên mà không thực hiện kiểm tra.
      Người dùng có thể tuỳ ý thay đổi dữ liệu để ứng dụng web thực hiện deserialize dữ liệu. Dẫn
      đến thực hiện deserialize dữ liệu không an toàn, tồn tại nguy cơ có thể bị khai thác.
    • Tiếp tục phân tích mã nguồn của ứng dụng web để kiểm chứng. Khi đăng nhập thành
      công, ứng dụng web đã thực hiện serialize dữ liệu có chứa một số thông tin liên quan đến
      người dùng và gán vào cookie.

    • Sau đó, ứng dụng web thực hiện deserialize dữ liệu từ cookie, và đọc thông tin dữ liệu này, hiển thị fullname của người dùng.

    • Thử chèn với một payload XSS:

    • Kết quả, chứng tỏ website đã thực hiện deserialize dữ liệu không an toàn và có thể dẫn
      đến lỗ hổng XSS.

    • Tiếp tục phân tích mã nguồn chương trình để có thể thực hiện leo thang từ deserialize
      dữ liệu không an toàn đến có thể thực thi mã từ xa.

    • Trong chương trình có chức năng ghi lại nhật ký thời gian người dùng tương tác với
      chương trình.

    • Chương trình thực hiện ghi vào file “log.txt” với nội dung là thời gian cùng tên người
      dùng. Nội dung file log.txt.

    • Kết hợp hai điều kiện:

      • Ứng dụng thực hiện deserialize dữ liệu không an toàn. Dữ liệu thực hiện deserialize
        người dùng có thể kiểm soát.
      • Ứng dụng web có chức năng ghi log dựa vào hàm file_put_contents với hai tham số
        là các thuộc tính của lớp User (thuộc tính $filename và thuộc tính $uname).
    • Với hai điều kiện trên, người dùng có thể thay đổi hai thuộc tính $filename và $uname
      với giá trị mong muốn, quá trình deserialize dữ liệu, ứng dụng web sẽ lấy giá trị mà người
      dùng đã thay đổi để thực hiện ghi file.

    • Ví dụ về ghi một nội dung bất kỳ và một file bất kỳ: Ghi vào file agag.php với nội dung
      agaga, sử dụng payload.

    • Tiến hành encode và gửi lên máy chủ.

    • Kết quả file agag.php đã xuất hiện với nội dung mong muốn

    • Để thực thi mã từ xa, thực hiện ghi một file php với nội dung cho phép thực thi lệnh.

    • Payload ghi file cmd.php với nội dung trên:

    • URL-encode đoạn payload trên:

    • Chèn payload trong yêu cầu http, ở trường Cookie:

    • Kết quả:

    • Thực thi mã từ xa, chạy lệnh whoami:

    • Chạy lệnh systeminfo:

  1. Các biện pháp ngăn chặn
  • Dựa vào hai điểm yếu của ứng dụng web được tận dụng để khai thác là:

    • Ứng dụng thực hiện deserialize dữ liệu không an toàn. Dữ liệu thực hiện deserialize
      người dùng có thể kiểm soát.
    • Ứng dụng web có chức năng ghi log dựa vào hàm file_put_contents với hai tham số
      là các thuộc tính của lớp User (thuộc tính $filename và thuộc tính $uname)
  • Từ đó đưa ra được biện pháp khắc phục, đó là:

    • Không thực hiện deserialize dữ liệu không an toàn. Dữ liệu để thực hiện deserialize
      không cho phép người dùng có thể tuỳ ý thay đổi.
    • Kiểm soát là chức năng ghi log của chương trình.

    3.1 Ngăn chặn deserialize dữ liệu không an toàn

    • Thay đổi cấu trúc chương trình, không thực hiện serialize dữ liệu người dùng và gán vào
      cookie, không thực hiện deserialize dữ liệu từ cookie để lấy dữ liệu. Thay vào đó, sử dụng
      session để nhận dạng người dùng.

    • Nếu bắt buộc phải sử dụng serialize và deserialize dữ liệu từ client gửi lên, có thể sử
      dụng các thuật toán mã hóa HMAC, khóa bí mật để đảm bảo dữ liệu từ client gửi lên không
      bị sửa đổi.

    • Khi dữ liệu thay đổi, sẽ hiện thông báo Invalid Content Verification Signature. Request
      dưới đây thay đổi nội dùng từ log.txt sang log.php và kết quả máy chủ trả về là Invalid Content
      Verification Signature.

    3.2 Kiểm soát chức năng ghi log của chương trình

    • Chức năng ghi log của chương trình đặt trong hàm __destruct() có thể lợi dụng trong tấn
      công Deserialize. Có thể đưa chức năng này ra một hàm riêng biệt và thay đổi lại cấu trúc
      chương trình.
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo