Quyền php shell_exec () trên Linux Ubuntu


13

Tôi đang phát triển một ứng dụng php bằng máy chủ Linux. Vấn đề của tôi là thực thi shell_exec()để gọi một số tệp exe không hoạt động (thực tế không phải exe, đó là loại tệp thực thi linux)

echo shell_exec("whoami");

Tôi có daemon

echo shell_exec("ls")

Tôi có một số tên tệp nhưng

echo shell_exec("php -v")

Tôi không có gì, một trang trống

echo shell_exec("php ....bla bla bla")

một trang trống quá.

Tất cả các lệnh này nếu tôi gõ trên terminal (user hu) sẽ hoạt động. Tôi đã tìm kiếm google trong vài giờ, mọi người nói rằng vì được phép. Tôi không có kinh nghiệm về Linux. Tôi phải làm gì để thực hiện chương trình của mình trong php?

Câu trả lời:


10

Người dùng của Apache www-datacần được cấp đặc quyền để thực thi các ứng dụng nhất định bằng cách sử dụng sudo.

  1. Chạy lệnh sudo visudo. Trên thực tế, chúng tôi muốn chỉnh sửa tệp trong etc/sudoers. Để làm điều đó, bằng cách sử dụng sudo visudotrong thiết bị đầu cuối, nó sao chép sudoerstệp (temp) để chỉnh sửa.
  2. Ở cuối tệp, thêm ví dụ sau: -nếu chúng tôi muốn sử dụng lệnh để restarthút thuốc và ra phplệnh cho một hành động khác trong câu hỏi của bạn,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(Điều này giả sử rằng bạn muốn chạy restartphpra lệnh bằng các đặc quyền siêu người dùng (root). Và bạn sử dụng phplệnh trong usr/bin/đường dẫn)

Tuy nhiên, nếu bạn muốn chạy mọi ứng dụng bằng các đặc quyền siêu người dùng, thì hãy thêm các mục sau thay vì những gì ở trên. Bạn có thể không muốn làm điều đó, không phải cho ALLcác lệnh, rất nguy hiểm.

www-data ALL=NOPASSWD: ALL

3. Sau khi chỉnh sửa tệp sudoers (bằng cách visudochúng tôi chỉnh sửa tệp tạm thời sudoersđể lưu và thoát tệp tạm thời (visudo) để ghi vào sudoerstệp. ( wq!)

4. Đó là nó, bây giờ sử dụng exec()hoặc shell_exectheo cách sau trong xxx.phptập lệnh của bạn . hãy nhớ sử dụng sudotrước khi sử dụng lệnh trong tập lệnh php.

Ví dụ:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

hoặc là

shell_exec("sudo php -v"); 

Vì vậy, trong vấn đề của bạn, hãy thêm các lệnh mà bạn muốn sử dụng vào step no (2.)khi tôi thêm và thay đổi tập lệnh php của bạn như những gì bạn muốn.

đây là vấn đề tương tự như của bạn /programming//a/22953339/1862107


Câu hỏi này không phải là về việc sử dụng sudo.
tricasse

Điều này được nói rất tệ
Barney Chambers

5

Hãy thử chỉ định toàn bộ đường dẫn đến nhị phân php .. Ví dụ: /usr/bin/php

Nếu bạn không biết, hãy tìm nó bằng cách sử dụng: which php


echo shell_exec ("/ usr / bin / php -v"); không hoạt động.
ngoaho91

Khi bạn nói 'không hoạt động', bạn nhận được gì? Tức là có lỗi gì không? Bất cứ điều gì trong bản ghi lỗi php / apache của bạn? Nếu trang trống, xem nguồn cung cấp cho bạn bất cứ điều gì để làm việc với? Thật không may, thuật ngữ 'không hoạt động' cho chúng ta không có gì để làm việc với ...
Keiran Holloway

@ ngoaho91 - thông thường là các bản ghi /var/log/httpd/error*.
slm

: D tôi có trang trống, không có gì để xem. Tệp nhật ký lỗi php / apache ở đâu?
ngoaho91

@ ngoaho91 - Bản phân phối Linux này là gì? CentOS, Ubuntu?
slm

4

Bạn thường muốn chỉ định đường dẫn đầy đủ đến các ứng dụng như whoami, ls, và php. Nếu bạn không chắc vị trí của chương trình là gì (đường dẫn đầy đủ), bạn có thể tìm hiểu như vậy:

$ type php
php is /usr/bin/php

Sau đó chỉ định nó như vậy trong kịch bản của bạn.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

tôi chạy lệnh của bạn gõ php => php là / usr / bin / php. nhưng lệnh đường dẫn đầy đủ vẫn trả lại cho tôi một trang trống.
ngoaho91

Điều gì nếu bạn làm điều này : echo shell_exec("/usr/bin/php somefile.php 2>&1")?
slm

echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: lỗi di dời: / usr / bin / php: ký hiệu X509_free, phiên bản OPENSSL_1.0.0 không được xác định trong tệp libcrypto. so.1.0.0 với tham chiếu thời gian liên kết
ngoaho91

OK, máy chủ web (Apache) thường chạy như một người dùng khác, không phải hu. Vì vậy, bạn cần đảm bảo rằng tập lệnh phpđang cố chạy được đặt như thế này : chmod 755 somescript.php. Điều này sẽ cho phép người dùng mà Apache đang chạy, để có thể thực thi và đọc .phptệp của bạn .
slm

1
@ ngoaho91 - mọi thứ sẽ ổn ngay bây giờ, lỗi đó cho tôi biết có gì đó không đúng với thiết lập Apache / PHP của bạn. freetutorialssubmit.com/php-relocation-error/2221
slm

2

Liệu php.ini của bạn có hạn chế tập lệnh có sẵn không?

Đây là từ của tôi /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =

không, ini của tôi giống như của bạn
ngoaho91

2

Cách gỡ lỗi các vấn đề shell_exec

OK, ở đây chúng tôi có một vấn đề: một số thứ hoạt động trong thiết bị đầu cuối và không hoạt động trong shell_exec của php (hoặc exec, spawn, bất cứ điều gì). Hãy nghĩ xem: sự khác biệt giữa Bạn và php là gì? Đây là ba:

PHP được thực thi từ các quy tắc máy chủ HTTP

Thật vậy, thiết bị đầu cuối của bạn đang chạy từ yournamengười dùng và php được thực thi từ www-data. Vì vậy, ý tưởng đầu tiên là mở terminal từ www-datangười dùng và thử cùng một lệnh. Vì thế....

  • Mở /etc/passwdtệp, tìm dòng với www-datangười dùng và thay đổi vỏ đăng nhập (cái cuối cùng) từ /bin/false(hoặc bất cứ thứ gì) thành /bin/bash.
  • Mở www-datathiết bị đầu cuối:su www-data
  • Hãy thử php -v hoặc bất cứ điều gì bạn không thể thực hiện từ php. Nếu nó không hoạt động - Bạn sẽ thấy các bản ghi đẹp và sẽ có thể gỡ lỗi.
  • Đừng quên sửa lại /etc/passwdtệp trong khi bạn đã hoàn tất

PHP được thực thi từ PHP .

PHP là enogh hoang tưởng và có rất nhiều tùy chọn trong cấu hình apache / nginx và php.ini có thể phá vỡ nỗ lực của bạn.

Đây là một chút phức tạp để gỡ lỗi. Có hai lựa chọn ở đây:

  • Kích hoạt nhật ký trong trình duyệt và xem vấn đề. Chỉnh sửa của bạn php.ini, bật display_errorsvà tất cả các cờ khác để xem lỗi trong trình duyệt. Họ Bạn có thể đọc và gỡ lỗi chúng.

  • Lấy www-datashell của nó (xem phần đầu tiên) và thực hiện một cái gì đó như

echo '<?php shell_exec("php -v"); ?>' | php

sẽ thực thi cùng một mã php trong bảng điều khiển và bạn sẽ có thể thấy lỗi và gỡ lỗi.

PHP được thực thi từ SELinux / apparmor

Selinux và apparmor là những thứ bảo mật cấm các ứng dụng thực hiện các hành động cụ thể (ví dụ: sinh ra các ứng dụng khác hoặc một số ứng dụng cụ thể khác). Có lẽ nó được kích hoạt trên máy chủ của bạn.

Để kiểm tra - vô hiệu hóa selinux / apparmor và kiểm tra xem có vấn đề gì không.

Để khắc phục - đọc hướng dẫn thích hợp và sửa các quy tắc cho phép đối với trường hợp của bạn.


0

Đối với tôi cách đơn giản nhất là vào bên trong php.ini và nhận xét dòng bắt đầu bằng

disable_functions
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.