Professional Documents
Culture Documents
De Serialization
De Serialization
DESERIALIZATION
1. Serialization là gì?
Serialization là quá trình xử lý, chuyển đổi các thuộc tính của một đối tượng thành
một định dạng dữ liệu ví dụ như binary fomat, từ đó có thể lưu trên ổ đĩa, hoặc sử
dụng vào các mục đích cần thiết khác, còn quá trình Deserialization là quá trình
ngược lại
Xét vd: http://210.2.88.252/web1/index.php
Source: http://210.2.88.252/web1/source1.php
if (isset ($_COOKIE['leet_hax0r'])) {
$sess_data = unserialize (base64_decode ($_COOKIE['leet_hax0r']));
try {
if (is_array($sess_data) && $sess_data['ip'] != $_SERVE
R['REMOTE_ADDR']) {
die('CANT HACK US!!!');
}
} catch(Exception $e) {
echo $e;
}
} else {
$cookie = base64_encode (serialize (array ( 'ip' => $_SERVER['REMOTE_
ADDR']))) ;
1
setcookie ('leet_hax0r', $cookie, time () + (86400 * 30));
}
ta thấy: nếu chưa có cookie thì web sẽ tạo cookie bằng hàm serialize() và lưu trữ
trong trình duyệt.
cookie:
leet_hax0r=YToxOntzOjI6ImlwIjtzOjE0OiIxNC4xODcuMjMxLjEyNSI7fQ==
2
[s:2: "ip"] là string với 2 ký tự
[s:14: "x.x.x.x"] là string với 14 ký tự (x: ip tượng trưng)
3
hình 2: ví dụ về magic method
4
Như vâ ̣y, các hàm magic method sẽ được gọi ngầm các magic method mà không
cần gọi trong chương trình.
POP chain trong đoạn code trên: _destruct() => shutdown() => send() =>$callable
và $to
5
Nếu chúng ta điều khiển được $callable và $to thì sẽ thay đổi được luồng thực thi
chương trình.
Sơ đồ thực thi như sau:
Đầu tiên chúng ta chèn một đối tượng “Mail” vào thuộc tính “$writer”
, tại dòng code số 8 sẽ gọi đến phương thức “shutdown()” của lớp
“Mail”
Tương tự chèn một đối tượng “Sendmail” vào thuộc tính “$transport”
, tại đó dòng code số 18 sẽ gọi đến phương thức “send()” của lớp
“Sendmail
Ta thay đổi giá trị của hai thuộc tính “$callable = exec” và “$to =
calc”
6
Cuối cùng hàm call_user_func() được gọi như sau call_user_func
(“exec”, “calc”) và ứng dụng Calculator trong hệ điều hành Window
được tự động mở lên
7
hình 6:manifest của một Phar
Ta quan tâm đến dòng được bôi vàng cho biết phần manifest này sẽ giữ các META-
DATA ĐÃ ĐƯỢC SERIALIZE. Một điều thú vị là nếu một filesystem function gọi
đến một Phar file thì tất cả các Meta-data trên sẽ được tự động unserialize
Danh sách các filesystem function có thể bị Deserialization:
Như vâ ̣y thì: nếu mà các Magic method được sử dụng để gọi đến các Filesystem
function thì rất có thể xảy ra deserialization.
Tóm lại thì để có thể xảy ra deserialization thì cần phải có các điều kiê ̣n như sau.
o Tìm được POP chain trong trong source code cần khai thác
8
o Đưa được Phar file vào đối tượng cần khai thác (thường là các magic
method hoă ̣c các hàm được gọi đến filesystem được chạy ngầm)
o Tìm được entry point, đó là những chỗ mà các filesystem function gọi
tới các Phar file do người dùng kiểm soát
thì còn mô ̣t tính năng unserialize của filesystem function trong manifest của
metadata, vì trong manifest có 4 byte format serialize nên các format serialize sẽ
được decode ra.
Deserialization cookie,
leet_hax0r=YToxOntzOjI6ImlwIjtzOjE0OiIxNC4xODcuMjMxLjEyNSI7fQ==
class SQL {
9
public $query = 'SELECT password AS username FROM users WHERE id=1';
public $conn;
?>
if (isset ($_COOKIE['leet_hax0r'])) {
$sess_data = unserialize (base64_decode ($_COOKIE['leet_hax0r']));
try {
if (is_array($sess_data) && $sess_data['ip'] != $_SERVE
R['REMOTE_ADDR']) {
die('CANT HACK US!!!');
}
} catch(Exception $e) {
echo $e;
}
với đoạn check cookie này có tham số “ip” thì chương trình mới kiểm tra. Thành ra
nếu “query” thì nó sẽ bỏ qua và chạy xuống chương trình. Đoạn này filter không kỹ
Luồng chạy của chương trình
10
Biến query được gọi và gán giá trị id vào $query.
Chương trình chỉ gọi đến connect(), nhưng trong chương trình lại sử dụng
_destruct() để tự đô ̣ng execute() trước khi kết thúc.
Trong destruct() thì chương trình gọi đến mô ̣t filesystem function execute(). Tại đây
meta-data của Phar file sẽ tự đô ̣ng decode serialize và ghi đè nó với biến $query.
Như vâ ̣y $query=”<inject từ biến cookie đã serialize>” và thực hiên truy vẫn xuống
database.
11