5

问题

我有一个shell_exec用于运行 pdf 到文本转换器的 PHP 脚本。为了简化问题,我创建了一个简短的脚本,用于shell_exec回显dir命令的输出。

<?php
$cmd = 'C:\\WINDOWS\\system32\\cmd.exe /c ';
echo shell_exec($cmd.' dir');
?>

当我在我的 Apache 服务器上运行它时,一切都按预期工作。当我切换到 IIS 时,就好像完全跳过了该行:没有错误、没有输出、没有日志、什么都没有。

不幸的是,我需要使用 IIS,因为我要针对 Active Directory 对我的用户进行身份验证。


这是我到目前为止所尝试的:

  • 通过发出命令cmd.exe /c而不是直接发出命令
  • 授予“C:\WINDOWS\system32\cmd.exe”Read & Execute权限SERVICE
  • 授予“C:\WINDOWS\system32\cmd.exe”Read & Execute权限NETWORK SERVICE
  • 授予“C:\WINDOWS\system32\cmd.exe”Read & Execute权限IUSR_MACHINENAME
  • 授予“C:\WINDOWS\system32\cmd.exe”Read & Execute权限Everyone(别担心,它不会长时间保持这种状态,哈哈)
  • 将 PHP 作为 ASAPI 模块运行
    • 这是我的标准配置
  • 将 PHP 作为 CGI 扩展运行
    • 这不起作用,我收到一个错误:CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers.
  • 在 IIS 管理器中,在您的网站上设置Execute PermissionsScripts and Executables
  • 在脚本中添加了 html 标记和其他 php 函数,以查看是否得到处理;确实如此。就好像这shell_exec一位被跳过了一样。

非常感谢您查看这个问题,我现在正在解决这个问题

干杯,伊恩


更新 1

我真的不想这样做,但作为一个权宜之计,直到我找到一个合适的解决方案,我在 Web 服务器上运行 Apache(它运行 shell_exec 很好)并通过 cURL 调用我的 apache 脚本。这很丑陋,但它有效:)。


更新 2

我开始认为这不是 IIS 或权限本身的问题,而是我们网络上的某些策略的结果 - 尽管我无法想象是什么。左派有什么想法吗?

4

6 回答 6

3

下面是一个更系统的方法来确定哪些用户需要被授予权限

确认您在 C:\WINDOWS\SYSTEM32(或更一般的 %systemroot%\system32)中有以下可执行文件

cmd.exe  
whoami.exe  

检查这些可执行文件的当前 ACL

c:\windows\system32> cacls cmd.exe  
c:\windows\system32> cacls whoami.exe  

如果未授予用户“Everyone”读取 (R) 访问权限,则临时授予如下

c:\windows\system32> cacls cmd.exe /E /G everyone:R  
c:\windows\system32> cacls whoami.exe /E /G everyone:R  

使用以下内容创建 whoami.php

<?php  
$output = shell_exec("whoami");  
echo "<pre>$output</pre>";  
?>  

在网络浏览器上加载 whoami.php 并记下显示的用户名,例如在我的例子中它显示

ct29296\iusr_template

如果必须在上述步骤中添加,请撤销“所有人”权限

c:\windows\system32> cacls cmd.exe /E /R everyone  
c:\windows\system32> cacls whoami.exe /E /R everyone  

仅将步骤 5 中找到的具有读取+执行权限 (R) 的用户名授予 cmd.exe

c:\windows\system32> cacls cmd.exe /E /G ct29296\iusr_template:R  

请记住为您自己的系统使用正确的用户名。

见:http ://www.myfaqbase.com/index.php?q=php+shell_exec&ul=0&show=f

于 2011-05-23T05:33:09.287 回答
2

这里有几点:

  • 关于 PHP 跳过该shell_exec功能,请确保 PHP 未在安全模式下运行。从 PHP 手册 - 在shell_exe 页面上

注意:当 PHP 在安全模式下运行时,此功能被禁用。

这似乎也是在 Windows 中从 PHP 执行 shell 命令的一个众所周知的问题。共识似乎是让它工作的最好方法是让 PHP 在 FastCGI 模式下运行(我知道你已经尝试过这个并且说你无法让它工作 - 因此我的第二点)。您可能会发现此Microsoft IIS 论坛线程很有帮助。


  • 现在,就必须在 Windows 上运行 PHP 以针对 Active Directory 进行身份验证而言 -您不必这样做!

Apache 通过mod_auth_ldap提供 LDAP 身份验证。而 PHP 通过以下函数提供 LDAP 支持:

Active Directory 是 LDAP 的一种实现。因此,您可以使用任何 LDAP 客户端对 Active Directory 执行身份验证。

PS 你可以使用 Apache mod_auth_ldap 或 PHP LDAP 函数——你不需要同时使用这两个函数来完成这项工作。Apache mod_auth_ldap 在 HTTP 协议级别工作,而 PHP LDAP 函数让您可以更好地控制身份验证和授权过程。

于 2010-03-01T15:06:27.803 回答
1

几个笔记

如果你想直接执行 .exe,你可以使用 proc_open() 和 $other_options=array('bypass_shell'=>TRUE)

procmon.exe (sysinternals) 也是你在研究这类问题时最好的朋友

于 2010-02-24T09:49:07.240 回答
0

我会对Read & Execute运行 IIS 的用户说权限(如果那不是 IUSR_MACHINENAME)

于 2010-02-23T04:08:12.300 回答
0

我使用 READ & EXECUTE, READ 将用户 NETWORK SERVICE 添加到我的应用程序的可执行文件所在的目录中。自从有了这个改动,问题就消失了。尽管如此,还需要将 READ & EXECUTE、READ for IUSR_ 的权限授予 cmd.exe。

我从这里得到的解决方案http://forums.iis.net/t/1147892.aspx

于 2011-04-25T09:19:59.217 回答
0

不幸的是,我需要使用 IIS,因为我要针对 Active Directory 对我的用户进行身份验证。

将应用程序基于 IIS 的前提是有缺陷的。没有什么可以阻止您使用 Apache 执行此操作。事实上,您甚至不需要在 MS-Windows 操作系统上运行它。

有一个谷歌如何设置这一切。

请注意,对于可能使用 NTLM 的 IIS 和本地客户端,安全策略会被抛到窗外。IIS 处理程序线程可以使用 NTLM MSIE 客户端的凭据运行。或不。调试这些东西会让你发疯!

C。

于 2010-02-28T22:41:09.183 回答