PHP 提供exec()
/system()
等函数去执行 shell ,那么 PHP 通过这些函数执行 shell 的时候会存在哪些风险,又该如何避免呢?有什么好的解决方案吗?
1
ids 2016-10-28 19:21:05 +08:00 via Android
不用安全
|
2
EDDYCJY 2016-10-28 19:23:02 +08:00 via iPhone
其他语言也存在的问题
|
4
nfroot 2016-10-28 19:36:29 +08:00
和 sql 一样防止注入
|
5
a15819620038 2016-10-28 19:37:52 +08:00 via iPhone
php 执行 shell 没什么问题。
不安全的是怕你的 php 脚本有漏洞,被别有用心的人利用了,后果严重程度不一。 |
6
HarveyDent 2016-10-28 19:40:08 +08:00
应该有其他方案吧,不建议这么搞
|
7
minbaby 2016-10-28 19:46:41 +08:00 1
执行的命令写死,不接受外界接受动态参数,做好过滤
|
8
invalidtoken 2016-10-28 19:53:08 +08:00 via iPhone
外部程序漏洞被利用然后提权?
|
9
Kokororin 2016-10-28 19:57:49 +08:00 via iPhone
如果参数写死的话没有问题
|
10
slixurd 2016-10-28 20:02:21 +08:00 2
不要用 root 跑 php 。
|
11
kfll 2016-10-28 20:02:28 +08:00
能写 extension 就写 extension
|
12
billlee 2016-10-28 20:06:11 +08:00 1
主要是要防止
I. 任意命令执行 II. 利用被执行的程序进行攻击 任意命令执行也可以分两种情况 1. 直接从外界接受命令名,这是一定要避免的 2. shell 语言注入。理想情况下,如果能直接用 execve 搞定的事情,就不要调用 shell, 这样就不会有注入问题。我写 python 的时候也是这样做的。可 php 这智障没有 execve 接口,只能调用 shell. 一定要调用就做好 escape 啦。 第 II 点就是说,你调用的外部程序可能设计和编写的时候没考虑那么多安全问题。尤其是 DOS 攻击,面向本地用户的程序是不会考虑这个问题的。 |
16
billlee 2016-10-28 20:19:38 +08:00
@xiaoz 转义,把 | 换成 \|, $ 换成 \$ 等。我记得 php 里面自带了转义函数,但具体效果怎么样不清楚
另外看到你上面说用 root 执行外部程序,最好不要这样做,很危险。除非你的 php 程序就是用来修改系统配置的(如路由器的 web 配置界面) |
17
xiaoz OP @billlee 服务器上会去读一个 json 文件, php 修改这个 json 后我需要服务器去重启某个服务重新载入 json 生效。
|
18
loveyu 2016-10-28 21:08:28 +08:00 via Android
最近要用 root 执行些脚本!然后没辙,只能 php 了
|
19
gouchaoer 2016-10-28 21:17:57 +08:00 via Android 1
你需要用 php-cli 去重启服务,不用在 php-fpm 里执行 shell
|
20
gouchaoer 2016-10-28 21:18:41 +08:00 via Android 1
在 cron 里面定期调用 php-cli 脚本。。。或者你 php-cli 做成一个 daemon 也行啊
|
21
justyy 2016-10-28 21:21:19 +08:00 1
escapeshellarg + esacepshellcmd
|
22
greenskinmonster 2016-10-28 21:27:28 +08:00 via Android 1
用 inotify 监控文件更新,符合条件就重启服务好了。
|
24
billlee 2016-10-28 21:50:17 +08:00 1
@xiaoz 把那个配置文件的 group 改成运行 php 的 group, 权限改成 0664 。然后另外用 inotify 监视文件,重启服务就好了。不需要给 php 用户 sudo 权限。
|
26
XiaoxiaoPu 2016-10-28 22:03:55 +08:00
@xiaoz 另一个思路:写一个 setuid 程序专门去执行重启服务的操作,这样就不需要 sudo 了
|
27
xiaoz OP @gouchaoer 您看我这样的思路可行吗?
写一个 1.php 文件去检测 abc.json 文件是否更新,如果有更新的话,就通过 system()函数去重启服务,这个 php 文件不对外访问。然后 crontab 使用 php-cli 每隔 5 分钟执行 1.php |
29
Tink 2016-10-28 22:14:31 +08:00
我就在微信公众号上直接用 php 执行 shell 了,没啥问题
|
30
moult 2016-10-28 22:19:46 +08:00
1 、如果你执行 system(sprint_f("rm -rf %s", $_GET['path'])) 肯定是存在安全隐患的,类似 SQL 注入一样
2 、如果你执行 system('/sbin/service restart nginx') 那一般不会有安全问题的,但是一般情况下你 PHP 肯定执行在非 root 用户下面吧,所以其实这个根本执行不了,所以你要加上 sudo ,然后把这条命令加到 sudo 的白名单就好了。千万不要把 php 所在的整个用户加到白名单! |
33
fuxkcsdn 2016-10-29 00:46:16 +08:00 via iPhone
|
34
fuxkcsdn 2016-10-29 00:53:38 +08:00 via iPhone
https://linux.die.net/man/1/inotifywait
Example 2 A short shell script to efficiently wait for httpd-related log messages and do something appropriate. #!/bin/sh while inotifywait -e modify /var/log/messages; do if tail -n1 /var/log/messages | grep httpd; then kdialog --msgbox "Apache needs love!" fi done 参考这例子写一个就 OK 了 |