VNG Cloud Logo

[Advisory] OS command injection

OS command injection là gì?
OS command injection là lỗ hổng bảo mật web, cho phép kẻ tấn công có thể thực thi trái phép command trên ứng dụng web. Thông thường, kẻ tấn công có thể tận dụng lỗi này để đánh cắp mã nguồn, cấu hình và dữ liệu của hệ thống. Không những thế, kẻ tấn công có thể chiếm quyền điều khiển hệ thống và tiếp tục tấn công sâu và các hệ thống lân cận.

Thực thi OS command
Sau đây là ví dụ một đoạn code bị lỗi

vuln.php

<?php

$command = "ping -c5 ".$_GET['ip'];
exec($command, $output, $retval);
echo "Returned with status $retval and output:\n";
print_r($output);

?>


Người sử dụng có thể nhập tham số ip bất kỳ để thực thi lệnh ping từ máy chủ. Với request

http[:]//host//vuln.php?ip=8.8.8.8

Máy chủ sẽ thực thi command "ping -c5 8.8.8.8" và trả về output.

Vì đoạn ứng dụng không có cơ chế nào để chống lại command injection, nên kẻ tấn công có thể nhập vào chuỗi command.

http[:]//host//vuln.php?ip=8.8.8.8; pwd

Như vậy, trên máy chủ sẽ thực thi 2 command "ping -c5 8.8.8.8; pwd" và trả về output của cả 2 command trên.

Các cách inject OS command
Có thể sử dụng nhiều shell metacharacters khác nhau, thực thi chuỗi các command để khai thác lỗi command injection:

  • &
  • &&
  • |
  • ||
  • ;
  • Newline (0x0a or \n)
  • `injected command `
  • $(injected command )

     


Cách phòng tránh OS command injection
Không tin tưởng vào bất kỳ dữ liệu đầu vào từ người dùng là yếu tố tiên quyết. Luôn luôn thẩm định dữ liệu đầu vào là cần thiết. Một số điều kiện thẩm định như:

  • kiểm tra input với danh sách cho phép (whitelist)
     
  • input chỉ có thể là dữ liệu loại số, ip, domain name, ....
     
  • input không chứa các ký tự đặc biệt nào, khoảng trắng....


Đối với php, có thể xem xét hàm build-in filter_input với nhiều loại thẩm định khác nhau.

<?php 
if ($ip = filter_input(INPUT_GET,'ip',FILTER_VALIDATE_IP))
{
   $command = "ping -c5 ".$ip; 
   exec($command, $output, $retval); 
   echo "Returned with status $retval and output:\n"; 
   print_r($output);
} else { 
   die("Please provide a valid IP address"); 
}
References:

https://portswigger.net/web-security/os-command-injection

https://portswigger.net/web-security/os-command-injection