Task 5 hỏi về lỗi Command Injection của đoạn code sau :

<?php
if (isset($_GET["conmandString"])) { $conmand_string = $_GET["conmandString"];
try {
passthru($conmand_string);
} catch (Error $error) {
echo "<p class=mt-3><b>$error</b></p>"
}
}
?>

Command Injection là một lỗ hổng bảo mật xảy ra khi ứng dụng cho phép người dùng nhập dữ liệu và truyền nó trực tiếp vào một lệnh hệ thống mà không kiểm tra hoặc xử lý hợp lệ. Trong trường hợp này, ứng dụng có lỗ hổng cho phép người dùng nhập một lệnh, sau đó lệnh này được thực thi trên phía máy chủ bằng cách sử dụng hàm passthru() trong PHP. Kết quả từ lệnh hệ thống được hiển thị trực tiếp trong phản hồi HTML trả về cho người dùng.

Cụ thể, đoạn mã PHP trên thực hiện các bước sau:

  1. Kiểm tra xem tham số “commandString” đã được thiết lập hay chưa bằng cách sử dụng isset($_GET["conmandString"]).
  2. Nếu tham số đã được thiết lập, biến $command_string sẽ nhận giá trị được nhập vào từ trường nhập liệu trên giao diện.
  3. Tiếp theo, chương trình thực hiện lệnh trong một khối try để thực thi hàm passthru($command_string). Hàm passthru() thực thi lệnh được nhập vào từ trường nhập liệu và trả lại kết quả trực tiếp cho trình duyệt.
  4. Nếu thực thi lệnh bị lỗi, thông báo lỗi sẽ được hiển thị trên trang. Tuy nhiên, thông thường điều này không được hiển thị vì lỗi từ lệnh thực thi (stderr) không thể được đưa ra trực tiếp vào trang web.

Ways to Detect Active Command Injection:

Chúng ta biết rằng Active Command Injection xảy ra khi bạn có thể thấy kết quả từ lệnh hệ thống. Trong mã trên, hàm passthru() làm việc này. Kết quả từ lệnh hệ thống được truyền trực tiếp vào tài liệu HTML, do đó người dùng có thể nhìn thấy kết quả ngay trên trang web. Vì vậy, chúng ta có thể thử các lệnh sau để kiểm tra và liệt kê các thông tin về máy chủ:

Các lệnh dành cho Linux: • whoami: Hiển thị tên người dùng hiện tại đang đăng nhập vào hệ thống. • id: Hiển thị thông tin về người dùng và nhóm người dùng. • ifconfig/ip addr: Hiển thị thông tin về các giao diện mạng và địa chỉ IP của máy chủ. • uname -a: Hiển thị thông tin về hệ điều hành và phiên bản kernel. • ps -ef: Liệt kê các tiến trình đang chạy trên máy chủ.

Các lệnh dành cho Windows: • whoami: Hiển thị tên người dùng hiện tại đang đăng nhập vào hệ thống. • ver: Hiển thị thông tin về phiên bản hệ điều hành Windows. • ipconfig: Hiển thị thông tin về các giao diện mạng và địa chỉ IP của máy chủ. • tasklist: Liệt kê các tiến trình đang chạy trên máy chủ. • netstat -an: Hiển thị thông tin về các kết nối mạng đang hoạt động.

Để thực hiện các thử nghiệm nêu trên, bạn cần truy cập vào trang web http://MACHINE_IP/evilshell.php.

Vậy đoạn code trên có lỗi gì ?

Đoạn mã PHP trên chứa một lỗi bảo mật nghiêm trọng liên quan đến việc thực thi lệnh từ các tham số GET của người dùng. Đây là một lỗ hổng thực thi lệnh không an toàn có thể dẫn đến các cuộc tấn công nguy hiểm như Remote Code Execution (RCE) và gây nguy hiểm đến hệ thống.

Lỗi bảo mật trong đoạn mã như sau:

  1. isset($_GET["conmandString"]): Trong điều kiện này, kiểm tra xem tham số conmandString đã được truyền vào trong yêu cầu GET hay không. Nếu có, sẽ thực hiện việc thực thi lệnh.
  2. $conmand_string = $_GET["conmandString"];: Tham số GET conmandString được gán trực tiếp vào biến $conmand_string mà không kiểm tra, loại bỏ, hoặc xử lý bất kỳ kiểm tra bảo mật nào.
  3. passthru($conmand_string);: Hàm passthru được sử dụng để thực thi lệnh, nhưng biến $conmand_string không được làm sạch hoặc kiểm tra an toàn, do đó người dùng có thể thực thi bất kỳ lệnh nào trên hệ thống máy chủ.
  4. catch (Error $error) { ... }: Không nên sử dụng catch để xử lý lỗi ở đây. Vì đây là một lỗi bảo mật nghiêm trọng, hệ thống không nên tiếp tục chạy như bình thường, mà nên ghi log lỗi và ngừng việc thực thi lệnh ngay lập tức.

Để khắc phục lỗi bảo mật này, bạn nên:

  1. Không thực thi lệnh từ các tham số người dùng mà không kiểm tra và xử lý an toàn. Tránh sử dụng hàm như exec, passthru, shell_exec, system, … trong các ứng dụng web nếu không cần thiết.
  2. Nếu bạn cần thực hiện các lệnh từ người dùng, hãy đảm bảo rằng bạn sử dụng các hàm thích hợp như escapeshellarg hoặc escapeshellcmd để làm sạch các tham số trước khi thực thi.
  3. Luôn luôn kiểm tra và xử lý đầu vào của người dùng một cách cẩn thận và chính xác để tránh các cuộc tấn công injection và lỗ hổng thực thi mã không an toàn.

Khai thác @ Đoạn mã này chứa lỗi bảo mật Command Injection, cho phép người dùng thực thi các lệnh hệ thống trên máy chủ mà không có bất kỳ kiểm tra hoặc xử lý bảo mật nào. Để khai thác lỗi này, kẻ tấn công có thể nhập các lệnh nguy hiểm vào trường “conmandString” và gửi yêu cầu HTTP GET đến tệp evilshell.php trên máy chủ.

Ví dụ, nếu kẻ tấn công gửi yêu cầu như sau:

bashCopy code

http://MACHINE_IP/evilshell.php?conmandString=whoami

Thì máy chủ sẽ thực thi lệnh “whoami” thông qua hàm passthru($conmand_string) và trả lại kết quả trực tiếp cho trình duyệt. Nếu kết quả của lệnh này là “root” hoặc quyền cao hơn, kẻ tấn công có thể có quyền điều khiển hoặc thực thi các hành động nguy hiểm trên máy chủ.

Kẻ tấn công có thể sử dụng các lệnh hệ thống khác nhau để thu thập thông tin quan trọng, thay đổi cấu hình hệ thống, truy cập vào dữ liệu nhạy cảm hoặc thậm chí chiếm quyền điều khiển toàn bộ máy chủ.

Để bảo vệ ứng dụng khỏi lỗi Command Injection, cần phải kiểm tra và xử lý cẩn thận dữ liệu đầu vào của người dùng trước khi thực thi các lệnh hệ thống. Một phương pháp hữu ích là sử dụng hàm escapeshellarg() hoặc escapeshellcmd() để làm sạch và đảm bảo tính an toàn của dữ liệu đầu vào trước khi thực thi lệnh.

Vậy làm sao trả lời câu hỏi What strange text file is in the website root directory?

— Có lẽ phải khai thác và tìm file lạ !

Bình luận về bài viết này

Thịnh hành