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
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
Đăng nhận xét
Toản Đăng ơi! Có nhật xét mới