Windows 上 PHP 中的 Exec() 无需打开 cmd.exe 安全漏洞?
我需要一个 Web 脚本来执行 exe 文件,然后返回结果 在 exe 上发送到网络请求。
我可以回显 exe 的结果,也可以修改 exe 以将其结果保存到文件中,然后读取该文件以回显 Web 请求。
问题是在 IIS 下使用 php 所有 exec() shell_execute() system() 类型函数都会错误并显示“无法分叉”,因为 IIS 匿名用户 IUSER_%COMPUTER_NAME% 无权访问 C:\windows\system32\cmd .exe
这可以通过更改此 IIS 匿名用户对 cmd.exe 的权限来修复,但是 这是严重的安全削弱(我相信)。
有什么办法可以让 IIS 下的 PHP 脚本调用 Exe,而无需向 IIS 匿名用户打开 cmd.exe 吗?
帮助表示赞赏。
为什么我需要这样做? 我有一个序列密钥生成器,当有人通过信用卡购买我的产品时,我的支付处理器需要调用一个 URL,将许可证名称作为参数传递,并返回该许可证名称的序列号。
我的许可证密钥生成器是 WinLicense,我有一个 exe。
我需要运行类似
shell_exec("C:\inetpub\wwwroot\test.com\testLicense.exe \"".$regName."\""); 的命令 // 或 exec() 或 system()
(testLicense.exe 将结果存储在一个文件中,然后我的 php 脚本可以回显)
I have the requirement for a web script to execute an exe file and then return the results
on the exe to the web request.
I can either echo back the result of the exe or modify the exe to save it's results to a file, and then read the file to echo back the web request.
The problem is that using php under IIS all exec() shell_execute() system() type functions error out with 'Unable to fork' because the IIS anonymous user IUSER_%COMPUTER_NAME% does not have access to C:\windows\system32\cmd.exe
This can be fixed by changing this IIS anonymous user's permissions for cmd.exe but
this is significant security weakening (I believe).
Is there any way I can have by PHP script under IIS call an Exe without opening up cmd.exe to the IIS anonymouse user ?
Help appreciated.
Why do I need to do this ? I have a serial key generator, when somone buys my product via credit card my payment processor needs to call a url passing the license name as a parameter and having a serial number for that license name returned.
My license key generator is WinLicense, which I have an an exe.
I need to run something like
shell_exec("C:\inetpub\wwwroot\test.com\testLicense.exe \"".$regName."\"");
// or exec() or system()
(testLicense.exe stores the result in a file which my php script can then echo)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
非常仔细地过滤您提供给 exec() 的变量。
则仅使用整数表示数字信息;
如果是文件名,
如果是字符串,则使用 file_exists() 来确认它是真实的文件名;使用正则表达式并删除诸如 ' 和 " 和 \ 之类的字符;因此其中的任何命令都不会运行。
Filter the variables you feed to exec() very carefully.
use integers only for numerical information
if it's a filename use file_exists() to confirm it's a real filename
if it's a string use regex and remove characters like ' and " and \ and ; so any commands in it wont run.