关于在浏览器中执行*.exe文件的深入探讨

---摘自《ChinaASP》
一：真的能在浏览器中执行命令文件吗？
答案是肯定的。（哇，酷耶！可以......）不过先别高兴，只能执行服务器端的，而且是必须经过授权的。否则服务器想黑你就太容易了。谁敢看我我就格式化谁。（真希望可以，老是黑客黑服务器，也该服务器黑别人了。哈哈！）
二：他是如何实现的。是靠asp文件吗？
在服务器端执行文件是靠SSI来实现的，SSI时服务器端包含的意思（不是SSL），我们经常使用的#include 就是服务
器端包含的指令之一。不过，这次要介绍的就是---------#exec。就是他可以实现服务器端执行指令。
不过，这次他不能用于.asp的文件。而只能用.stm、.shtm 和 .shtml这些扩展名。（很熟悉吧）而能解释执行他们的
就是Ssinc.dll。所以，你写好的代码必须保存成.stm等格式才能确保服务器能执行。
三：如何执行呢？
终于开始讨论实质性问题了。
它的语法是：<!-- #exec CommandType = CommandDescription -->
CommandType是参数，他有两个可选类型：
1.CGI 运行一个应用程序。如 CGI 脚本、ASP 或 ISAPI 应用程序。
CommandDescription 参数是一个字符串。此字符串包含应用程序的虚拟路径， 后跟一个问号以及传送给应用程序的任
一参数，参数之间由加号分隔 (+)。
他可是#exec命令最有用的参数，也是#exec命令存在的大部分理由。他可以处理已授权的CGI脚本，或Isapi应用程序。
微软为了向下兼容一些早期的ISAPI应用程序，而创建了该项命令。我们知道，微软早期的WEB应用程序都是靠ISAPI解释
的，而且也兼容CGI程序。你现在也可以在你的WEB根目录中找到CGI-BIN的目录。
我们可以用一下例子说明。
<!-- #exec cgi="/CGI-BIN/chat.exe?user+passw" -->
这种命令我们在一些UNIX主机上可以经常见到。现在，我们也可以在自己的.shtml中运用他了。当然，如果服务器允许
的话。
还有一种类型的程序：
<!-- #exec cgi="/CGI-BIN/login.dll?name" -->
这种命令方式将启动一个进程外的程序来解释并动态输出信息到网页上。这种方式不常见。但你仍然可以在一些网站中
见到。
2.CMD参数。
他可是#exec命令中最可怕的参数，也是#exec命令禁止使用的大部分理由。他也是我们一些网友实现最终幻想的利器。
可惜。要得到我们幻想的招数有些困难（如de...,fo....）。也几乎是不可能的。
一下是微软关于CMD参数的说明，你一定要读明白在试！
CMD 运行 shell 命令。 CommandDescription 参数是一个字符串，其中包含 shell 命令程序的完整物理路径，后跟由
空格分隔的任何命令行参数。如果没有指定全路经， Web 服务器将搜索系统路径。默认情况下，该指令是被禁用的，这是
因为它会对 Web 站点造成安全方面的危险；例如，用户可能使用 format 命令格式化您的硬盘。
我本人建议关闭，因为现在微软也不推荐用这个命令。
不过，如果你是服务器的管理员，可以试一试。
你可以新建一个test.shtml的文件。
然后在首行设置一个命令。
<!--#exec cmd="c:\winnt\system32\help.exe" --> 'NT中的一个帮助文件（没有危险）。
或试一试！
<!--#exec cmd="c:\windows\command\mem.exe" --> 'window98下的显示内存的一个命令。（没有危险）
然后你在该虚拟目录中将其权限设为脚本，或可执行。
最后，你可以在浏览器中输入该地址http://localhost/xxx/test.shtml
如果你看到浏览器中显示了他们的屏幕输入信息。那么，恭喜你。你试成功了。
四：最终幻想！（最好不要试。如果出了问题与本人无关！本人也不解答相应的问题）
如果我们想执行多的命令呢？那么闭上眼，往下看吧
首先，你打开注册表编辑器（记住要先备份），然后找
KEY_LOCAL_MACHINE\SYSTEM
\CurrentControlSet
\Services
\W3SVC4 '也可能是w3svc
\Parameters
选择新建一个Dword值
SSIEnableCmdDirective
它的两个值为0，1。下面是微软的说明。
服务器端的 #exec cmd 命令包括可执行外壳命令。安全意识强的站点希望通过将此值设置为 0 来关闭 #exec cmd 命令，
并以此作为外加的安全防范，尤其是在允许不受信任的使用者将文件放置到服务器时更是如此。默认状态下，注册表中不
存在此值；要允许该命令执行外壳命令，必须先创建此值并将值设置为 1 。
还可以在添一个Dwordd值
AllowSpecialCharsInShell
它的两个值为0，1。下面是微软的说明。
范围： 0, 1
默认值： 0 (禁用)
本值控制在运行批处理文件（ .bat 和 .cmd 文件）时，是否允许在命令行使用 [ | ( , ; % < > ] 等 Cmd.exe 特殊字
符。这些特殊字符可能引发严重的安全隐患。 如果该项值设置为 1，心怀叵测的用户可以在服务器上随意执行命令。因
此，强力推荐用户保留其默认设置 0。默认情况下，这些特殊字符不能传递到脚本映射 CGI 程序。如果设置为 1，除了管
道符号 | 和标准 I/O 重定向符（< 和 >）之外（这两类字符在命令处理器中具有特殊含义），这些特殊字符都能够传递
到脚本映射 CGI 程序。
哈哈，下面我就不详述了。
不过你要执行一些你希望的命令可不是这么简单
(如：<!--#exec cmd="c:\winnt\system32\format.com /y a:" -->)
你不会成功的，如果死机不要怨我。