PHP: vấn đề về hàm unserialize - không truyền được giá trị cho thuộc tính của class

Xin chào các bác, chuyện là mình đang có một bài tập về exploit bằng cách sử dụng hàm unserialize của php, tuy nhiên trong quá trình tìm hiểu về hàm này mình gặp vấn đề như sau:

Khi mình sử dụng một biến $data để lưu giá trị serialize của $construct và khi mình unserialize($data) thì thuộc tính name của User được gán giá trị bình thường.

Tuy nhiên khi mình lấy chuỗi được lưu trong biến $data để đưa vào hàm unserialize thì thuộc tính name lại không nhận được kết quả.

Cho mình hỏi là tại sao vậy mọi người, và mình phải tùy biến cái chuỗi như thế nào để nó có thể gán giá trị cho biến name.

Mình cám ơn

trong doc của PHP có ghi rõ mà.

Returns a string containing a byte-stream representation of value that can be stored anywhere.
Note that this is a binary string which may include null bytes, and needs to be stored and handled as such. For example, serialize() output should generally be stored in a BLOB field in a database, rather than a CHAR or TEXT field.

Chú ý những chỗ mình bôi đậm nhé. Những điều trên ám chỉ rằng cái chuỗi mà bạn in ra chưa chắc đã hiển thị đúng kết quả của function serialize. Rất có thể còn các kí tự/byte ẩn không thể in ra được. Do đó cái chuỗi mà bạn tự gõ truyền vào function unserialize với biến $data sẽ không giống nhau -> kết quả khác nhau

6 Likes

$name của bạn là private, nên k phải chỉ đơn giản copy từ echo vào là xong đâu.
Bạn thử var_dump($data);var_dump(chuỗi bạn copy) sẽ thấy độ dài nó khác nhau.

Đổi thành public là ok. Nhưng mà public thì ai cần đến serialize làm gì nữa :smiley:
Nên bạn đọc tiếp bài này để làm private nhé: https://insomniasec.com/cdn-assets/Practical_PHP_Object_Injection.pdf

4 Likes

Cám ơn bạn, mình thử rồi, đúng như bạn nói luôn thì ra class có member là private thì khi serialize sẽ có thêm ký tự ‘\x00’ giữa class name và tên private member đó. Mãi mới được :grin:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?