Overview - Java Deserialization

 1. Giới thiệu

Nếu một ngôn ngữ cần truyền thông tin trên mạng, nó thường sử dụng một số dữ liệu được định dạng chẳng hạn như: JSON hay XML

Cả hai định dạng dữ liệu này đều gặp một vấn đề: Chỉ hỗ trợ các kiểu dữ liệu cơ bản như integer, floating, string, Boolean

Và ví dụ chúng ta có một class Person gồm tên tuổi với method ăn uống các kiểu, thì JSON và XML bó tay nếu muốn trao đổi dữ liệu object của class này ➜ Cần có một cơ chế khác để trao đổi và đó là Serialization – Deserialization

Serialization là một cơ chế chuyển đổi trạng thái của một Object thành một luồng byte. Deserialization là quá trình ngược lại trong đó luồng byte được sử dụng để tạo lại Object đó trong bộ nhớ.

Để dễ hình dung thì chúng ta chạy code thử nhé, ở đây mình sài sẵn template serialize – deserialize từ PortSwigger, và để cho tiện thì mình merge code luôn thành một file cho dễ debug



Lưu ý là chỉ có class implements Serializable interface mới có thể serialize (Line 10)

Sau khi chạy thì ta sẽ có kết quả như hình:


2. Deserialization

Là quá trình ngược lại Serialize để tái tạo lại object, và nếu như chúng ta control được input vào deserialize(), chúng ta có thể lợi dụng nó để tạo ra object của class khác để exploit

Đặt breakpoint ở dòng 42 và run debug, chúng ta có thể thấy rằng sau khi call readObject(), một object đã được tạo ra


Như vậy, nếu bạn review source code Java thấy class nào có method readObject() thì hãy tìm đường input đến class.

Ngoài readObject(), chúng ta cũng nên tìm thêm: readExternal(), readResolve(), toString(), hashCode(), finalize(), ...

Nhận xét