Trong bài viết này, chúng tôi sẽ phân tích các hàm thực thi lệnh trong PHP và cách chúng có thể bị khai thác để gây ra các cuộc tấn công như Command Injection.
Giới thiệu về Command Injection
Command Injection là một kỹ thuật tấn công mà trong đó kẻ tấn công đưa vào các chuỗi lệnh độc hại thông qua dữ liệu đầu vào của ứng dụng web, khiến cho ứng dụng thực thi các lệnh hệ thống không mong muốn. Điều này thường xảy ra khi các hàm thực thi lệnh trong PHP được sử dụng mà không có kiểm tra dữ liệu đầu vào đầy đủ.
Các hàm liên quan đến việc thực thi lệnh trong PHP bao gồm: system, exec, passthru, và shell_exec. Dưới đây là cách mỗi hàm có thể bị lợi dụng.
Sử dụng Hàm Thực Thi Lệnh
1. Hàm system
Hàm system thực thi lệnh hệ thống và hiển thị kết quả trực tiếp. Xem xét đoạn mã sau:
<?php
$command = $_GET['cmd'];
if (isset($command)) {
system('whoami ' . $command);
}
?>
Nếu kẻ tấn công thêm vào tham số ?cmd=;ls -la, họ có thể liệt kê tất cả các tệp và thư mục trong thư mục hiện tại.
2. Hàm exec
Hàm exec thực thi lệnh và trả về dòng cuối cùng của kết quả. Đoạn mã dưới đây cho thấy cách sử dụng:
<?php
$cmd = $_GET['cmd'];
$output = [];
exec($cmd, $output);
foreach ($output as $line) {
echo htmlspecialchars($line) . "<br>";
}
?>
Bằng cách truyền tham số ?cmd=ls -la, kẻ tấn công có thể lấy danh sách các tệp và thư mục.
3. Hàm passthru
Hàm passthru tương tự như system, nhưng nó hiển thị tất cả đầu ra từ lệnh. Ví dụ:
<?php $cmd = $_GET['cmd']; passthru($cmd); ?>
Kẻ tấn công có thể thực thi bất kỳ lệnh nào bằng cách truyền tham số ?cmd=ls -la.
4. Hàm shell_exec
Hàm shell_exec thực thi lệnh và trả về toàn bộ kết quả dưới dạng chuỗi. Đoạn mã dưới đây minh họa việc sử dụng:
<?php $cmd = $_GET['cmd']; echo shell_exec($cmd); ?>
Bằng cách truyền tham số ?cmd=ls -la, kẻ tấn công có thể xem danh sách các tệp và thư mục.
Khai thác Hàm eval
Hàm eval thực thi một chuỗi như là mã PHP. Nó cực kỳ nguy hiểm vì nó có thể thực thi bất kỳ mã PHP nào. Đoạn mã dưới đây cho thấy cách sử dụng:
<?php $cmd = $_GET['cmd']; eval($cmd); ?>
Kẻ tấn công có thể thực thi bất kỳ mã PHP nào bằng cách truyền tham số ?cmd=phpinfo();.
Lời Khuyên Phòng Ngự
Một cách phòng thủ phổ biến là vô hiệu hóa các hàm nguy hiểm trong file php.ini bằng cách chỉnh sửa dòng disable_functions.