PHP 8中exec命令完全无法执行,需调整哪些权限?
问题描述
当通过浏览器访问http://example.com/exec.php时,PHP的exec命令始终无法返回有效结果。测试代码如下:
<?php set_error_handler(function(int $errno, string $errstr, ?string $errfile = null, ?int $errline = null, ?array $errcontext = null) { throw new \ErrorException($errstr, $errno, E_ERROR, $errfile, $errline); }, E_ALL); ini_set('display_errors', 'On'); error_reporting(E_ALL); $command = 'echo "Hello"'; $command = 'dir'; $command = '"C:\\path\\to\\specific.exe"'; $command = 'whoami'; $result = exec($command . ' 2>&1', $output, $return_var); var_dump($command); var_dump($output); var_dump($return_var); var_dump($result);
浏览器中运行后返回结果:
string(6) "whoami" array(0) { } int(1) string(0) ""
直接在命令行执行PHP脚本可正常返回预期结果,且已确认:
- php.ini中
disabled_functions为空 open_basedir已禁用get_current_user()返回IUSR- 已为目标程序分配
IUSR和IIS_IUSRS的读取与执行权限
权限调整方案
1. 配置应用程序池身份权限
浏览器访问时,PHP通过IIS应用程序池运行,默认身份为ApplicationPoolIdentity(而非IUSR),需给该身份分配权限:
- 打开IIS管理器,找到对应网站的应用程序池,右键选择「高级设置」,查看「标识」字段(格式为
IIS AppPool\[应用程序池名称]) - 给该身份添加以下权限:
- 目标程序所在目录的读取、列出文件夹内容、执行权限
- 系统命令(如
whoami)所在的C:\Windows\System32目录的读取、执行权限
2. 确保命令路径完整或加载用户配置文件
浏览器环境的系统环境变量可能缺失,导致无法找到系统命令:
- 直接使用命令的完整路径,比如将
whoami改为C:\\Windows\\System32\\whoami.exe - 或在应用程序池高级设置中勾选「加载用户配置文件」,确保环境变量正常加载
3. 调整临时目录权限
PHP执行exec时依赖临时目录,需给IUSR或应用程序池身份分配临时目录的读写权限:
- 临时目录通常为
C:\Windows\Temp或PHP配置的sys_temp_dir - 右键目录→属性→安全→编辑→添加对应身份,分配读取、写入、修改权限
4. 排查UAC限制
若服务器开启UAC,可能限制IIS进程执行命令:
- 可临时将应用程序池身份改为
LocalSystem测试,若能正常执行,说明是UAC或权限限制问题 - 生产环境建议保留
ApplicationPoolIdentity,通过本地安全策略调整UAC对IIS进程的限制
内容的提问来源于stack exchange,提问作者radar33
相关产品推荐
相关产品推荐

