Vì sao phải ngăn chặn thực thi một số hàm PHP trên máy chủ Hosting?

  • Saturday 01/02/2020

Như đã biết, ngôn ngữ PHP là một trong những ngôn ngữ lập trình web phổ biến bậc nhất hiện nay. Đây là ngôn ngữ được hỗ trợ rất nhiều thư viện hàm, module mở rộng, …
Chính vì PHP được mở rộng bởi những hàm (functions) có thể can thiệp và thực thi trực tiếp đến hệ thống máy chủ cho nên chúng tiềm ẩn những mối nguy hiểm mà nếu các System Admin không xem trọng việc bảo mật sẽ dẫn đến hậu quả đáng tiếc.
Hầu hết tất cả các nhà cung cấp dịch vụ lưu trữ Hosting trên thế giới buộc phải ngăn chặn thực thi một số hàm của PHP vì lý do bảo mật (phát tán mã độc, local attack, botnet, dos, …), đây là những hàm được các nhà cung cấp dịch vụ lưu trữ Hosting trên toàn thế giới đánh giá mức độ cực kỳ nguy hiểm.
Để hiểu rõ vấn đề và nguyên nhân tại sao họ lại ngăn chặn các hàm này, những hàm nào buộc phải ngăn chặn thực thi, bạn xem mô tả trong bảng sau nhé:

STT

Name

Tính năng

Mô tả

1

system

Thực hiện một chương trình bên ngoài và hiển thị đầu ra

System () giống như phiên bản C của hàm trong đó nó thực thi lệnh đã cho và đưa ra kết quả. Cuộc gọi system () cũng cố gắng tự động xóa bộ đệm đầu ra của máy chủ web sau mỗi dòng đầu ra nếu PHP đang chạy như một mô-đun máy chủ. Nếu bạn cần thực thi một lệnh và có tất cả dữ liệu từ lệnh được truyền trực tiếp trở lại mà không có bất kỳ sự can thiệp nào, hãy sử dụng hàm passthru ().

2

exec

Thực hiện một chương trình bên ngoài

Cho phép thực hiện 1 chương trình từ bên ngoài. Dễ bị lợi dụng để thao tác chiếm quyền, thực thi các chương trình độc hại.

3

shell_exec

Thực thi lệnh thông qua shell và trả về đầu ra hoàn chỉnh dưới dạng chuỗi

Thực thi lệnh bằng command và trả kết quả là chuỗi. Tương tự như exce, dễ bị lợi dụng và khai thác nhầm mục đích xấu.

4

proc_close

Đóng một quy trình được mở bởi Proc_open () và trả lại mã thoát của quy trình đó

Proc_close () tương tự như pclose () ngoại trừ việc nó chỉ hoạt động trên các quy trình được mở bởi Proc_open (). Proc_close () chờ quá trình kết thúc và trả về mã thoát của nó. Nếu bạn có các đường ống mở cho quy trình đó, bạn nên dùng fclose() để đóng chúng trước khi gọi hàm này để tránh nghẽn – quá trình con có thể không thể thoát trong khi các đường ống đang mở.

5

proc_get_status

Nhận thông tin về một quy trình được mở bởi Proc_open ()

Proc_get_status () tìm nạp dữ liệu về một quy trình được mở bằng cách sử dụng Proc_open ().

6

proc_nice

Thay đổi mức độ ưu tiên của quy trình hiện tại

Thay đổi mức độ ưu tiên của quy trình hiện tại. Điều này sẽ gây ra vấn đề leo thang tài nguyên.

7

popen

Mở con trỏ tệp quá trình

popen tương tự với proc_open nhưng được sử dụng ít hơn.

8

proc_terminate

Đóng một tiến trình được mở bởi Proc_open

Tín hiệu một quá trình (được tạo bằng cách sử dụng Proc_open ()) mà nó sẽ chấm dứt. Proc_terminate () trả về ngay lập tức và không chờ quá trình kết thúc. Proc_terminate () cho phép bạn chấm dứt quá trình và tiếp tục với các nhiệm vụ khác. Bạn có thể thăm dò quá trình (để xem nó đã dừng chưa) bằng cách sử dụng hàm Proc_get_status ().

Điều này dễ gây ra việc các tiến trình quan trọng đang thực hiện nhưng lại bị ngắt bởi function này. Gây ảnh hưởng khá nghiêm trọng, cũng như gây ra các vấn đề liên quan đến bảo mật dữ liệu.

9

escapeshellcmd

Thoát shell metacharacters

escapeshellcmd () thoát bất kỳ ký tự nào trong chuỗi có thể được sử dụng để lừa lệnh shell để thực thi các lệnh tùy ý. Hàm này nên được sử dụng để đảm bảo rằng mọi dữ liệu đến từ đầu vào của người dùng đều được thoát trước khi dữ liệu này được chuyển đến các hàm exec () hoặc system () hoặc cho toán tử backtick. Các ký tự sau được bắt đầu bằng dấu gạch chéo ngược: & #; `| *? ~ <> ^ () [] {} $ , X0A và xFF. ‘và “chỉ được thoát nếu chúng không được ghép nối. Trong Windows, tất cả các ký tự này cộng với% và! được thay thế bằng khoảng trắng thay thế.

10

escapeshellcmd

Thoát một chuỗi được sử dụng làm đối số shell

escapeshellarg () thêm các trích dẫn đơn xung quanh một chuỗi và trích dẫn / thoát khỏi mọi trích dẫn đơn hiện có cho phép bạn chuyển một chuỗi trực tiếp đến hàm shell và để nó được coi là một đối số an toàn duy nhất. Hàm này nên được sử dụng để thoát các đối số riêng lẻ sang các hàm shell đến từ đầu vào của người dùng. Các hàm shell bao gồm exec (), system () và toán tử backtick. Trên Windows, escapeshellarg () thay thế thay thế các dấu phần trăm, dấu chấm than (thay thế biến bị trì hoãn) và dấu ngoặc kép bằng dấu cách và thêm dấu ngoặc kép quanh chuỗi.

11

dl

 Tải một phần mở rộng PHP khi chạy

Tải phần mở rộng PHP được cung cấp bởi thư viện tham số. Sử dụng extension_loaded () để kiểm tra xem một tiện ích mở rộng đã có sẵn hay chưa. Điều này hoạt động trên cả các tiện ích mở rộng tích hợp và các tiện ích được tải động (thông qua php.ini hoặc dl ()).

12

show_source

Trả về một tệp có cú pháp PHP được tô sáng. Cú pháp được tô sáng bằng cách sử dụng các thẻ HTML.

In ra hoặc trả về một phiên bản được tô sáng bằng cú pháp của mã có trong tên tệp bằng cách sử dụng các màu được xác định trong công cụ tô sáng cú pháp tích hợp cho PHP. Nhiều máy chủ được cấu hình để tự động làm nổi bật các tệp có phần mở rộng phps. Ví dụ: example.phps khi xem sẽ hiển thị cú pháp tô sáng nguồn của tệp

13

ini_alter

Hàm này là bí danh của: ini_set ()

Đặt giá trị của tùy chọn cấu hình đã cho. Tùy chọn cấu hình sẽ giữ giá trị mới này trong quá trình thực thi tập lệnh và sẽ được khôi phục ở cuối tập lệnh.

14

virtual

Thực hiện một yêu cầu phụ của Apache

Thực hiện một yêu cầu phụ của Apache

15

openlog

Mở một kết nối đến bộ ghi hệ thống cho một chương trình

Mở một kết nối đến bộ ghi hệ thống cho một chương trình

16

mail

Gửi mail không cần chứng thực

Gửi mail không cần chứng thực

17

symlink

Tạo  symbolic link

Tạo  symbolic link

Bảng bên trên liệt kê những hàm PHP đã bị vô hiệu hoá (disable functions). Vậy, những hàm nào và những modules nào của PHP/ Apache được hỗ trợ. Bảng sau đây sẽ liệt kê chi tiết:

STT

Apache Module

PHP Extention

1

config

libc-client

2

config-runtime

pear

3

devel

php-bcmath

4

mod-alt-passenger

php-bz2

5

mod_bwlimited

php-calendar

6

mod_cache

php-cli

7

mod_cgid

php-common

8

mod_charset_lite

php-curl

9

mod_deflate

php-dba

10

mod_env

php-devel

11

mod_evasive

php-enchant

12

mod_expires

php-exif

13

mod_file_cache

php-fileinfo

14

mod_headers

php-fpm

15

mod_hostinglimits

php-ftp

16

mod_http2

php-gd

17

mod_imagemap

php-gettext

18

mod_lsapi

php-gmp

19

mod_macro

php-iconv

20

mod_mime_magic

php-imap

21

mod_mpm_event

php-intl

22

mod_proxy

php-ioncube

23

mod_proxy_fcgi

php-litespeed

24

mod_proxy_http

php-mbstring

25

mod_proxy_wstunnel

php-mcrypt

26

mod_remoteip

php-mysqlnd

27

mod_reqtimeout

php-odbc

28

mod_security2

php-pdo

29

mod_speling

php-phalcon

30

mod_ssl

php-posix

31

mod_substitute

php-soap

32

mod_suexec

php-sockets

33

mod_unique_id

php-sourceguardian

34

mod_version

php-suhosin

35

mod_vhost_alias

php-tidy

36

Tools

php-xml

37

 

php-zendguard

38

 

php-zip

39

 

runtime