Command Injection - Series Web Application Security
1. Nội dung
- Giới Thiệu
- Command Injection
- Cách Phòng Chống
- Các Bài Viết Liên
2. Giới thiệu
-
Theo Wiki của OWASP:
https://www.owasp.org/index.php/Command_Injection Command injection is an attack in which the goal is execution of arbitrary commands on the host operating system via a vulnerable application. Command injection attacks are possible when an application passes unsafe user supplied data (forms, cookies, HTTP headers etc.) to a system shell. In this attack, the attacker-supplied operating system commands are usually executed with the privileges of the vulnerable application. Command injection attacks are possible largely due to insufficient input validation. This attack differs from Code Injection, in that code injection allows the attacker to add his own code that is then executed by the application. In Code Injection, the attacker extends the default functionality of the application without the necessity of executing system commands. -
Như vậy tóm lại là dựa vào sơ hơ của Web Application, Hacker - kẻ tấn công có thể thực hiện các câu lệnh, dòng code của OS để thực hiện các hành vi không tốt đối với hệ thống. Việc tiêm thêm (injection) vào ứng dụng để thực thi hành vi không tốt là một lỗi vô cùng nguy hiểm. Có thể gây lỗi cho host, lấy cắp thông tin, thậm trí chiếm quyền quản lý server.
3. Command Injection
Xem xét cách thức lợi dụng lỗ hổng bảo mật
-
Ví dụ về một ứng dụng web:
-
Web Application trên là một ứng dụng ping một địa chỉ IP hoặc website nào đó. Kết quả của việc
[ping google.com.vn]
được hiển thị kết quả như màn hình trên. -
Mọi sự chẳng có gì nếu gặp một ai đó sử dụng đúng mục đích.
-
Hãy xem trong trường hợp level security thấp thì hệ thống sẽ xử lý ra sao:
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
} else {
// Unix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
-
Nếu kẻ tấn công thử với vài câu lệnh nho nhỏ:
-
Như kế quả trên thì hệ chức năng Ping này quả thật là nguy hiểm. Nó có thể hiển thị được tất cả nội dung trong file
/etc/passwd
. File lưu thông tin vềaccount, password
của server. -
Kẻ gây hại có thể xem hết nội dung của các file trong hệ thống. Có thể tạo ra 1
shell script
thực hiện một hành vi gây hại nào đó rồi dùng các command của linux để nạp, chạy, thậm trí xóa dữ liệu của server. Nếu user chạy Web có khả năng quyền root nữa thì lỗ hổng trên trở lên vô cùng nghiêm trọng -
Nguyên nhân của việc trên là các chức năng thực thi các câu lệnh của OS mà không hề kiểm tra tính đúng đắn của input đầu vào.
4. Cách Phòng chống
- Không bao giờ tin tưởng giá trị đầu vào của người dùng.
- Loại bỏ các ký tự đặc biệt bên server như các chuyển hướng, điều kiện của command hệ thống
- Với mỗi loại command muốn chạy thì kiểm tra chặt chẽ đầu vào. Như ứng dụng trên kiểm tra việc nhập vào có đúng format của địa chỉ IP:
{digit}.{digit}.{digit}.{digit}
- Cách phòng chống của bên DVAW cung cấp với mức level imposible của ứng dụng PING:
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
} else {
// Unix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
} else {
// Ops. Let the user name theres a mistake
$html .= '<pre>ERROR: You have entered an invalid IP.</pre>';
}