对于上传漏洞的查找,仍是从源文件入手,目标有两个,一个是FilePath(文件路径),另一个则是FileName(文件名称)。
一、FilePath
说到FilePath,有些朋友可能感到陌生,但要提到动网6.0的上传漏洞,大家一定不陌生吧!其上传漏洞就是由于FILEPath过滤不严引起的。虽然动网已不存在此漏洞了,但采用此上传源码的程序还是大有人在的,比如我手头这款“万豪下载程序”,其ADS(广告)版块中的Upfile.asp(上传),就有Filepath过滤不严的漏洞,(刺猬2005作品)来分析一下其部分源码:
dim upload,file,formName,formPath,iCount,filename,fileExt '//定义上传变量
set upload=new upload_5xSoft '//建立上传对象JM的测试代码
formPath=upload.form("filepath") '//第一步、获取文件路径,此处是关键。
if right(formPath,1)<>"/" then formPath=formPath&"/"
for each formName in upload.file '//用For读取上传文件
set file=upload.file(formName) '//生成一个文件对象jmdcw
…………………… '//省略部分代码
fileExt=lcase(right(file.filename,4)) '//从文件名中截取后4位,并转换为小写字符。
if fileEXT<>".gif" and fileEXT<>".jpg" and fileEXT<>".zip" and fileEXT<>".rar" and fileEXT<>".swf"then '//文件扩展名判断
response.write "<font size=2>文件格式不正确 [ <a href=# onclick=history.go(-1)>重新上传</a> ]</font>"
response.end
end if
randomize
ranNum=int(90000*rnd)+10000
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&fileExt '//第二步、filename由提交的文件路径+年月日的随机文件名+转换后的扩展名组成
if file.FileSize>0 then
file.SaveAs Server.mappath(FileName) '//保存文件jmdcw
end if
set file=nothing
next
%>
2、filename=formPath&year(now)&month(now)&day(now)&hour (now)&minute(now)&second(now)&ranNum&fileExt
广告插播。变量与常量:所谓变量就是指在程序的运行过程中随时可以发生变化的值;而常量则恰恰相反,指的是在程序的运行过程中始终保持不变的值(刺猬2005作品)。
下面来看一下漏洞是如何形成的。在第一句代码中,从变量filepath中获取文件的保存路径,然后在第二句中,用路径变量formPath加随机生成的数字及经过判断的扩展名合成为一个新的变量,这个变量Filename就是上传文件保存的路径及名称。这样说有些笼统,下面举例说明。比如选择 “111.jpg”文件上传,在上传过程中,随文件一起上传的还有一个FilePath变量,假设其值为“image”,当这些值传到 upfile.asp中,filename就变成了:“image/200512190321944973.jpg”,上传成功后,该111.jpg就被保存到image文件夹内,文件名字也被改成了:“200512190321944973.jpg”。这段流程,看起来无懈可击,但还是被牛人研究出了突破方法,什么方法呢?很简单,突破点就在变量身上,如果将其FilePath值改为“image/aa.asp□”,其后的“□”表示二进制的00(空的意思),这样,该变量提交入upfile.asp后,Filename值就变成了 “image/aa.asp□/200512190321944974.jpg”,服务器在读取这段变量时,因为“□”是二进制的00,认为该变量语句已经结束了,于是“□”后面的字符也就被忽略掉了,这样一来,Filename就成了:“image/aa.asp”,程序再用file.SaveAs进行保存的话,这个文件就保存成了aa.asp文件,瞧!漏洞出现了。
对于这个漏洞的利用,可以使用桂林老兵的上传工具,也可以采取用WinSock抓包,然后用记事本保存提交数据并增加、修改相关内容,再用WinHex修改空格为二进制,最后用NC提交的方法。以上两种的使用方法,请参阅相关的文章(刺猬2005作品)。
您现在的位置: 
