ASP网络安全手册（二）

---摘自《CPCW》

五 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的。