Có thể tiêm PHP không?

Có nhiều cách để kẻ xấu lợi dụng các trang web dễ bị tấn công. Một trong số đó được gọi là tiêm lệnh

Hôm nay, bạn sẽ tìm hiểu command injection là gì, cách kẻ tấn công có thể sử dụng nó để gây nguy hiểm cho ứng dụng web của bạn và cách bạn có thể ngăn điều đó xảy ra trong các ứng dụng PHP của mình

Hãy bắt tay ngay vào vấn đề

Một cuộc tấn công chèn lệnh dựa trên việc thực thi mã tùy ý (và rất có thể là mã độc) trên hệ thống đích

Tiêm lệnh là gì?

Một cuộc tấn công chèn lệnh dựa trên việc thực thi mã tùy ý (và rất có thể là mã độc) trên hệ thống đích

Nói cách khác, đó là cách sử dụng một ứng dụng được thiết kế để làm một việc cho một mục đích hoàn toàn khác

Hãy lấy ví dụ về một biểu mẫu liên hệ đơn giản. Mục đích của một ứng dụng như vậy là đơn giản. để cho phép mọi người để lại thông tin liên lạc của họ cho ai đó trong công ty để liên lạc. Ví dụ, kẻ tấn công có thể muốn sử dụng ứng dụng để đánh cắp thông tin về những ứng viên khác. Và họ có thể đạt được mục tiêu đó bằng cách tiêm mã độc

Việc tiêm lệnh được thực hiện như thế nào?

Để một cuộc tấn công tiêm lệnh xảy ra, ba điều phải xảy ra cùng một lúc

  1. Một ứng dụng đang sử dụng một số chức năng để thực hiện cuộc gọi đến trình bao hệ thống

  2. Ứng dụng đang chuyển dữ liệu không an toàn/không hợp lệ cho một cuộc gọi như vậy

  3. Kẻ tấn công nhận thức được thực tế này và hành động dựa trên kiến ​​​​thức này

Ví dụ về lệnh tiêm trong PHP

Ba hàm PHP này nếu không được sử dụng an toàn có thể dẫn đến sự hiện diện của lỗ hổng này

  • giám đốc điều hành

  • đi qua

  • hệ thống

Vấn đề nằm ở chỗ tất cả chúng đều lấy một chuỗi tùy ý làm tham số đầu tiên và chỉ cần chuyển tiếp nó tới hệ điều hành bên dưới

Điều này không bao hàm bất kỳ rủi ro nào nếu chuỗi được viết bởi lập trình viên (hay còn gọi là bạn), như thế này

PHP



$command = "ls -l";

$output = exec($command);

Tuy nhiên, vì biến 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
3 là một chuỗi nên không có gì ngăn cản bạn viết nội dung như bên dưới

PHP



$command = "ls ".$_GET['modifiers'];

$output = exec($command);

Tất nhiên, điều này sẽ tạo ra kết quả chính xác như nhau (vì giá trị của 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
3 sẽ là “ls -l”)

Cho đến nay, rất tốt, phải không?

Bây giờ, hãy xem ví dụ sau

PHP



$command = "ls ".$_GET['modifiers'];

$output = exec($command);

Ở đây lệnh đang được tạo từ hai nguồn. một chuỗi cố định (“ls”) và một tham số URL (



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
0)

Điều này có nghĩa là lệnh thực tế sắp được thực thi phụ thuộc vào đầu vào của người dùng

Giả sử ai đó đưa ra yêu cầu chẳng hạn như 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
1

Khi mã được thực thi, giá trị của 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
2 sẽ là “-l”, điều này sẽ dẫn đến lệnh “ls -l”

Không có hại gì, phải không?

Nhưng nếu người dùng không tốt như vậy thì sao?

Điều gì sẽ xảy ra nếu họ đưa ra yêu cầu chẳng hạn như 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
3?

Lệnh kết quả sẽ là “ls -l;

Bạn nào biết chút ít về Linux console thì nhận ra câu lệnh “rm * -Rf” … và sợ lắm. (Trong trường hợp bạn không quen với bảng điều khiển Linux, lệnh đó có nghĩa là “xóa mọi tệp trong thư mục này và các thư mục con của nó. ”)

Rất khó có khả năng ai đó sẽ đưa ra yêu cầu như vậy do nhầm lẫn

Nhưng nếu ai đó muốn phá trang web của bạn và họ biết một chút PHP (hoặc bất kỳ ngôn ngữ lập trình nào khác), thì thật dễ dàng để tạo một chuỗi như vậy

Trong trường hợp bạn đang thắc mắc "-l%3B+rm+%2A+-Rf" đến từ đâu, thì đó là kết quả của những điều sau đây



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
4

Làm thế nào một kẻ tấn công có thể tạo một yêu cầu tiêm lệnh?

Có lẽ cách dễ nhất là sử dụng các biểu mẫu của riêng bạn

Trong ví dụ trên, hãy tưởng tượng có một trang trước trông như thế này

HTML

________số 8

Tất cả những gì kẻ tấn công phải làm là điền vào trường 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
5 với “-l%3B+rm+%2A+-Rf” và nhấn “Lấy tên tệp. ”

Không quá phức tạp đúng không?

Nếu muốn chuyển từ dòng lệnh, họ có thể sử dụng một công cụ đơn giản như cURL, như thế này



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
6

Lợi thế cho kẻ tấn công khi sử dụng cơ chế này là bằng cách sử dụng loại công cụ này, việc tự động hóa cuộc tấn công thực sự dễ dàng.

Dữ liệu không an toàn đến từ đâu?

Dữ liệu không an toàn có thể đến từ nhiều nguồn khác nhau. Cho đến nay, chúng ta đã thảo luận về các tham số URL, nhưng kẻ tấn công có thể sử dụng bất kỳ cách nào có sẵn để chuyển thông tin đến ứng dụng của bạn, chẳng hạn như cách sau

  • 
    
    $command = "ls ".$_GET['modifiers'];
    
    $output = exec($command);
    7

  • BÁNH QUY

  • tiêu đề HTTP

  • Tệp đã tải lên

Ví dụ 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
7 sẽ thực sự giống với ví dụ 


$command = "ls ".$_GET['modifiers'];

$output = exec($command);
9, vì vậy tôi sẽ bỏ qua phần này để chỉ cho bạn cách cuộc tấn công này có thể được thực hiện bằng cách sử dụng các tiêu đề HTTP

Tất cả bắt đầu với mã của bạn bằng cách sử dụng thông tin đó để tập hợp một lệnh sẽ được cấp cho hệ điều hành

PHP



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
4

Bây giờ, tất cả những gì cần thiết để cuộc tấn công thành công là bổ sung một yêu cầu được soạn thảo cẩn thận như yêu cầu này



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
0

Có thể tìm thấy một tình huống tương tự nếu bạn có một tập lệnh giống như thế này

PHP



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
6

Và ai đó tải lên một tệp có nội dung như thế này



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
1

Bây giờ bạn có thể thấy mô hình. mù quáng tin tưởng vào đầu vào của người dùng là một ý tưởng tồi

Vì vậy, bây giờ bạn đã biết kẻ tấn công có thể gây khó khăn cho bạn như thế nào, hãy xem bạn có thể làm gì để ngăn điều đó xảy ra

Cách khắc phục lỗ hổng chèn lệnh

Như bạn đã thấy trong các phần trước của bài viết này, vấn đề xuất phát từ việc kết hợp thực thi shell trực tiếp và sử dụng dữ liệu không an toàn

Vì vậy, để ngăn điều này xảy ra, có hai chiến lược bạn có thể sử dụng

  1. Không sử dụng các chức năng thực thi shell trực tiếp

  2. Tránh sử dụng dữ liệu không an toàn kết hợp với các chức năng thực thi shell trực tiếp

Không sử dụng chức năng thực thi Shell trực tiếp

Bất cứ khi nào có thể, bạn nên sử dụng các chức năng tích hợp sẵn hơn là các lệnh của hệ điều hành

Chẳng hạn, nếu bạn cần xóa các tệp khỏi đĩa, bạn có thể sử dụng



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
2

Hoặc sử dụng cái này



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
3

Bằng cách sử dụng chức năng hủy liên kết, bạn đang loại bỏ hiệu quả khả năng ai đó đưa vào các lệnh độc hại

PHP có khá nhiều hàm mà bạn có thể sử dụng để che dấu các lệnh gọi của hệ điều hành, chẳng hạn như các hàm sau

  • rmdir để xóa một thư mục

  • chmod để thao tác quyền tập tin

  • glob để lặp lại các tệp trong một đường dẫn nhất định

Và một số khác bạn có thể tìm thấy tại đây (chỉ kể tên những cái liên quan đến hệ thống tệp)

Một tác dụng phụ thú vị khác của việc sử dụng các chức năng này là tính di động của mã của bạn tăng lên

Nếu bạn sử dụng các hàm thực thi shell, lệnh sẽ được chính hệ điều hành diễn giải thay vì trình thông dịch PHP

Điều này có nghĩa là nếu bạn đang viết mã trong môi trường Windows nhưng máy chủ sản xuất là Linux hoặc tương tự, mọi thứ sẽ không hoạt động

Tất nhiên, sẽ có những trường hợp bạn cần chạy các lệnh cụ thể không phải là một phần của lõi PHP, chẳng hạn như một chương trình nhị phân cụ thể hoặc một tập lệnh mà bạn đã tạo

Hãy xem làm thế nào để đối phó với những tình huống như vậy

Không sử dụng dữ liệu không an toàn kết hợp với chức năng thực thi Shell trực tiếp

Nếu bạn thực sự cần sử dụng lệnh gọi hệ thống, thì bạn phải sử dụng quy trình xác thực phù hợp trên dữ liệu của mình

Chẳng hạn, nếu bạn định đưa ra một lệnh chẳng hạn như lệnh này

PHP



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
0

Bạn nên đảm bảo rằng 



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
4 thực sự là một địa chỉ IP

Để thực hiện quy trình xác thực như vậy, PHP cung cấp một hàm tích hợp có tên là filter_input, bạn có thể sử dụng hàm này như thế này

PHP



$command = "ls ".$_GET['modifiers'];

$output = exec($command);
2

Các chức năng tương tự tồn tại để xác thực các nguồn dữ liệu khác (đồng thời, có một số loại bộ lọc khác nhau mà bạn có thể sử dụng để đáp ứng các nhu cầu cụ thể của mình)

Bạn có thể quét mã của mình theo cách thủ công để tìm mã nguy hiểm hoặc bạn có thể xem xét sử dụng một công cụ tự động có thể được đưa ngay vào quy trình làm việc của nhóm bạn

Có thể tiêm PHP không?

Có thể tiêm PHP không?

Bảo vệ mã của bạn khỏi bị tiêm

Hôm nay, bạn đã biết thế nào là tấn công chèn lệnh, ứng dụng PHP có thể có những tính năng nào để dễ bị tấn công như vậy và phải làm gì để vô hiệu hóa mối đe dọa như vậy trong ứng dụng của bạn

Bây giờ bạn có một số bài tập về nhà để làm

Bạn có thể quét mã của mình theo cách thủ công để tìm mã nguy hiểm hoặc bạn có thể xem xét sử dụng một công cụ tự động có thể được đưa ngay vào quy trình làm việc của nhóm bạn. Một công cụ như vậy là StackHawk, công cụ này có thể giám sát mọi yêu cầu kéo và cung cấp cho bạn thông tin chi tiết về cách giải quyết chúng trước khi chúng được đưa vào sản xuất

Bạn có thể đọc thông tin chi tiết về cách triển khai tại đây

Bài đăng này được viết bởi Mauro Chojrin. Mauro giúp các nhà phát triển PHP trau dồi kỹ năng của họ thông qua các khóa đào tạo, sách, hội thảo và các công cụ khác của anh ấy. Anh ấy làm việc trong ngành CNTT từ năm 1997 và đã giữ các vai trò như nhà phát triển, kiến ​​trúc sư và trưởng nhóm kỹ thuật. Mauro cũng thích viết và vlog

Tiêm lệnh PHP là gì?

Chèn lệnh là gì? . Nói cách khác, đó là cách sử dụng một ứng dụng được thiết kế để làm một việc cho một mục đích hoàn toàn khác. based on the execution of arbitrary (and most likely malicious) code on the target system. In other words, it's a way to use an application designed to do one thing for a completely different purpose.

Làm cách nào để đưa PHP vào HTML?

Để thêm thuộc tính bằng PHP, xác định vị trí bạn muốn thêm giá trị, mở thẻ PHP, lặp lại biến hoặc giá trị và đóng thẻ PHP. You can inject attributes into HTML, Cascading Style Sheets, or CSS, and even directly into JavaScript code.

Tại sao PHP dễ bị tấn công?

Lỗ hổng mã PHP là kết quả của những khoảng trống còn lại trong khi viết mã ban đầu . Bạn có thể nói rằng 'lỗ hổng' xảy ra do đầu vào của người dùng 'không được vệ sinh'.

PHP có an toàn không?

Các ứng dụng PHP giống hệt nhau thường được triển khai rộng rãi, do đó, một lỗ hổng trong một ứng dụng có thể dẫn đến một số lượng lớn máy chủ không an toàn, có thể truy cập công khai. Trên thực tế, 30% tất cả các lỗ hổng trong Cơ sở dữ liệu về lỗ hổng quốc gia được liên kết với PHP