### ASP 网络安全手册

一 前言
Microsoft Active Server Pages（ASP）是服务器端脚本编写环境，使用它可以创建和运行动态、交互的 Web 服务器应用程序。使用 ASP 可以组合 HTML 页 、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web 的功能强大的应用程序。
现在很多网站特别是电子商务方面的网站，在前台上大都用 ASP 来实现。以至于现在 ASP 在网站应用上很普遍。
ASP 是开发网站应用的快速工具，但是有些网站管理员只看到 ASP 的快速开发能力，却忽视了 ASP 安全问题。ASP 从一开始就一直受到众多漏洞，后门的困扰，包括%81 的噩梦，密码验证问题，IIS 漏洞等等都一直使 ASP 网站开发人员心惊胆跳。
本文试图从开放了 ASP 服务的操作系统漏洞和 ASP 程序本身漏洞，阐述 ASP 安全问题，并给出解决方法或者建议。
二 关键字
ASP，网络安全，IIS，SSL，加密。
三 ASP 工作机理
Active Server Page 技术为应用开发商提供了基于脚本的直观、快速、高效的应用开发手段，极大地提高了开发的效果。在讨论 ASP 的安全性问题之前，让我们来看看 ASP 是怎么工作的。ASP 脚本是采用明文（plain text）方式来编写的。
ASP 脚本是一系列按特定语法（目前支持 vbscript 和 jscript 两种脚本语言）编写的，与标准 HTML 页面混合在一起的脚本所构成的文本格式的文件。当客户端的最终用户用 WEB 浏览器通过 INTERNET 来访问基于 ASP 脚本的应用时，WEB 浏览器将向 WEB 服务器发出 HTTP 请求。WEB 服务器分析、判断出该请求是 ASP 脚本的应用后，自动通过 ISAPI 接口调用 ASP 脚本的解释运行引擎（ASP.DLL）。ASP.DLL 将从文件系统或内部缓冲区获取指定的 ASP 脚本文件，接着就进行语法分析并解释执行。最终的处理结果将形成 HTML 格式的内容，通过 WEB 服务器"原路"返回给 WEB 浏览器，由 WEB 浏览器在客户端形成最终的结果呈现。这样就完成了一次完整的 ASP 脚本调用。若干个有机的 ASP 脚本调用就组成了一个完整的 ASP 脚本应用。
让我们来看看运行 ASP 所需的环境：
Microsoft Internet Information Server 3.0/4.0/5.0 on NT Server
Microsoft Internet Information Server 3.0/4.0/5.0 on Win2000
Microsoft Personal Web Server on Windows 95/98
WINDOWS NT Option Pack 所带的 Microsoft IIS 提供了强大的功能，但是 IIS 在网络安全方面却是比较危险的。因为很少有人会用 Windows 95/98 当服务器，因此本文我更多的从 NT 中的 IIS 安全问题来探讨。
四 微软自称的 ASP 的安全优点
虽然我们本文的重点是探讨 ASP 漏洞和后门，但是有必要谈谈 ASP 在网络安全方面的"优点"，之所以加个""，是因为有时这些微软宣称的"优点"恰恰是其安全隐犯。
微软称 ASP 在网络安全方面一大优点就是用户不能看到 ASP 的源程序，从 ASP 的原理上看，ASP 在服务端执行并解释成标准的 HTML 语句，再传送给客户端浏览器。"屏蔽"源程序能很好的维护 ASP 开发人员的版权，试想你辛辛苦苦做了一个很优秀的程序，给人任意 COPY，你会怎么想？而且黑客还能分析你的 ASP 程序，挑出漏洞。更重要的是有些 ASP 开发者喜欢把密码，有特权的用户名和路径直接写在程序中，这样别人通过猜密码，猜路径，很容易找到攻击系统的"入口"。但是目前已经发现了很多能查看 ASP 源程序的漏洞，后面我们还要讨论。
IIS 支持虚拟目录，通过在"服务器属性"对话框中的"目录"标签可以管理虚拟目录。建立虚拟目录对于管理 WEB 站点具有非常重要的意义。虚拟目录隐藏了有关站点目录结构的重要信息。因为在浏览器中，客户通过选择"查看源代码"，很容易就能获取页面的文件路径信息，如果在 WEB 页中使用物理路径，将暴露有关站点目录的重要信息，这容易导致系统受到攻击。其次，只要两台机器具有相同的虚拟目录，你就可以在不对页面代码做任何改动的情况下，将 WEB 页面从一台机器上移到另一台机器。还有就是，当你将 WEB 页面放置于虚拟目录下后，你可以对目录设置不同的属性，如：Read、Excute、Script。读访问表示将目录内容从 IIS 传递到浏览器。而执行访问则可以使在该目录内执行可执行的文件。当你需要使用 ASP 时，就必须将你存放.asp 文件的目录设置为"Excute（执行）"。建议大家在设置 WEB 站点时，将 HTML 文件同 ASP 文件分开放置在不同的目录下，然后将 HTML 子目录设置为"读"，将 ASP 子目录设置为"执行"，这不仅方便了对 WEB 的管理，而且最重要的提高了 ASP 程序的安全性，防止了程序内容被客户所访问。
五 ASP 漏洞分析和解决方法
有人说一台不和外面联系的电脑是最安全的电脑，一个关闭所有端口，不提供任何服务的电脑也是最安全的。黑客经常利用我们所开放的端口实施攻击，这些攻击最常见的是 DDOS（拒绝服务攻击）.下面我会列出 ASP 的二十几个漏洞，每个漏洞都会有漏洞描述和解决方法。
1 在 ASP 程序后加个特殊符号，能看到 ASP 源程序
受影响的版本：
win95+pws
IIS3.0
98+pws4 不存在这个漏洞。
IIS4.0 以上的版本也不存在这个漏洞。
问题描述：
这些特殊符号包括小数点，%81, ::$DATA。比如：
http://someurl/somepage.asp.
http:// someurl/somepage.asp%81
http:// someurl/somepage.asp::$DATA
http:// someurl/somepage.asp %2e
http:// someurl/somepage %2e%41sp
http:// someurl/somepage%2e%asp
http:// someurl/somepage.asp %2e
http://someurl/msadc/samples/selector/showcode.asp?source=/msadc/samples/../../../../../../boot.ini （可以看到 boot.ini 的文件内容）
那么在安装有 IIS3.0 和 win95+PWS 的浏览中就很容易看到 somepage.asp 的源程序。究竟是什么原因造成了这种可怕的漏洞呢？究其根源其实是 Windows NT 特有的文件系统在做怪。有一点常识的人都知道在 NT 提供了一种完全不同于 FAT 的文件系统：NTFS，这种被称之为新技术文件系统的技术使得 NT 具有了较高的安全机制，但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道， NTFS 支持包含在一个文件中 的多数据流，而这个包含了所有内容的主数据流被称之为"DATA"，因此使得在浏览器 里直接访问 NTFS 系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而 直接导致 ::$DATA 的原因是由于 IIS 在解析文件名的时候出了问题，它没有很好地规范文件名。
解决方法和建议：
如果是 Winodws NT 用户，安装 IIS4.0 或者 IIS5.0，Windows2000 不存在这个问题。如果是 win95 用户，安装 WIN98 和 PWS4.0。
2 ACCESS mdb 数据库有可能被下载的漏洞
问题描述：
在用 ACCESS 做后台数据库时，如果有人通过各种方法知道或者猜到了服务器的 ACCESS 数据库的路径和数据库名称，那么他能够下载这个 ACCESS 数据库文件，这是非常危险的。比如：如果你的 ACCESS 数据库 book.mdb 放在虚拟目录下的 database 目录下，那么有人在浏览器中打入：
http:// someurl/database/book.mdb
如果你的 book.mdb 数据库没有事先加密的话，那 book.mdb 中所有重要的数据都掌握在别人的手中。
解决方法：
(1) 为你的数据库文件名称起个复杂的非常规的名字，并把他放在几目
录下。所谓"非常规"，打个比方：比如有个数据库要保存的是有关书籍的信息，可不要把他起个"book.mdb"的名字，起个怪怪的名称，比如 d34ksfslf.mdb，再把他放在如./kdslf/i44/studi/ 的几层目录下，这样黑客要想通过猜的方式得到你的 ACCESS 数据库文件就难上加难了
。
(2)不要把数据库名写在程序中。有些人喜欢把 DSN 写在程序中，比如：
DBPath = Server.MapPath("cmddb.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
假如万一给人拿到了源程序，你的 ACCESS 数据库的名字就一览无余。因此建议你在 ODBC 里设置数据源，再在程序中这样写：
conn.open "shujiyuan"
(3)使用 ACCESS 来为数据库文件编码及加密。首先在选取"工具->安
全->加密/解密数据库，选取数据库（如：employer.mdb），然后接确定，接着会出现"数据库加密后另存为"的窗口，存为：employer1.mdb。接着 employer.mdb 就会被编码，然后存为 employer1.mdb..

要注意的是，以上的动作并不是对数据库设置密码，而只是对数据库文件加以编码，目的是为了防止他人使用别的工具来查看数据库文件的内容。
接下来我们为数据库加密，首先以打开经过编码了的 employer1.mdb，在打开时，选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码"，接着输入密码即可。
为 employer1.mdb 设置密码之后，接下来如果再使用 ACCEES 数据库文件时，则 ACCESS 会先要求输入密码，验证正确后才能够启动数据库。
不过要在 ASP 程序中的 connection 对象的 open 方法中增加 PWD 的参数即可，例如：
param="driver={Microsoft Access Driver (*.mdb)};Pwd=yfdsfs"
param=param&";dbq="&server.mappath("employer1.mdb")
conn.open param
这样即使他人得到了 employer1.mdb 文件，没有密码他是无法看到 employer1.mdb 的。
五 ASP 漏洞分析和解决方法
3 code.asp 文件会泄漏 ASP 代码
问题描述：
举个很简单的例子，在微软提供的 ASP1.0 的例程里有一个 .asp 文件，专门用来查看其它 .asp 文件的源代码，该文件为 ASPSamp/Samples/code.asp。如果有人把这个程序上传到服务器，而服务器端没有任何防范措施的话，他就可以很容易地查看他人的程序。例如 :
code.asp?source=/directory/file.asp
不过这是个比较旧的漏洞了，相信现在很少会出现这种漏洞。
下面这命令是比较新的：
http://someurl/iissamples/exair/howitworks/code.asp?/lunwen/soushuo.asp=xxx.asp
最大的危害莫过于 asa 文件可以被上述方式读出；数据库密码以明文形式暴露在黑客眼前;
问题解决或建议：
对于 IIS 自带的 show asp code 的 asp 程序文件，删除该文件或者禁止访问该目录即可
4、filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞
问题描述：
IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject 实现，包括文本文件的读写目录操作、文件的拷贝改名删除等，但是这个强大的功能也留下了非常危险的 "后门"。利用 filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs 分区，如果权限没有设定好的话，同样也能破坏，一不小心你就可能遭受"灭顶之灾 "。遗憾的是很多 webmaster 只知道让 web 服务器运行起来，很少对 ntfs 进行权限 设置，而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此，如果你是 Webmaster，建议你密切关注服务器的设置，尽量将 web 目录建在 ntfs 分区上，目录不要设定 everyone full control，即使是是管理员组的成员一般也没什么必要 full control，只要有读取、更改权限就足够了。 也可以把 filesystemobject 的组件删除或者改名。
5、输入标准的 HTML 语句或者 javascript 语句会改变输出结果
问题描述：
在输入框中打入标准的 HTML 语句会得到什么相的结果呢？
比如一个留言本，我们留言内容中打入：
<font size=10>你好！</font>
如果你的 ASP 程序中没有屏蔽 html 语句，那么就会改变"你好"字体的大小。在留言本中改变字体大小和贴图有时并不是什么坏事，反而可以使留言本生动。但是如果在输入框中写个 javascript 的死循环，比如：<a herf="http://someurl" onMouseover="while(1){window.close('/')}">特大新闻</a>
那么其他查看该留言的客人只要移动鼠标到"特大新闻"，上就会使用户的浏览器因死循环而死掉。
解决方法和建议：
编写类似程序时应该做好对此类操作的防范，譬如可以写一段程序判断客户端的输入，并屏蔽掉所有的 HTML、 Javascript 语句