- UID
- 173
- 在线时间
- 0 小时
- 积分
- 756
- 金币
- 0
- 性别
- 男
- 注册时间
- 2007-8-25
- 最后登录
- 2008-8-22
Lv.3 平民
- 积分
- 756
- 在线时间
- 0 小时
|
<p>今天我为大家讲解网站入侵之上传漏洞的形成,虽然这已经很好了,但是为个人认为还是不错的</p><p>需要用到的软件:winsock expert抓包工具 nc(瑞士军刀)</p><p>内容:</p><p> 上传是一种比注入更具杀伤力的漏洞。通过注入所得到的往往是数据库中的一些敏感数据,如管理员名称、密码等,但上传漏洞就不同了,</p><p>它可以把ASP、JSP、CGI、PHP等格式的木马上传至网站目录内,所得到的权限最低也是WebShell。</p><p> 对于上传漏洞的查找,仍是从源文件入手,目标有两个,一个是FilePath(文件路径),另一个则是FileName(文件名称)。</p><p><br/>FilePath</p><p> 说到FilePath,有些朋友可能会感到陌生;但要提到动网6.0的上传漏洞,大家一定都很熟悉吧?上传漏洞本质上是由于FilePath过滤不</p><p>严而引起的。虽然现在动网已不存在此漏洞,但采用此上传源码的程序还是非常多的。“万豪下载程序”ADS(广告)版块中的Upfile.asp就存</p><p>在FilePath过滤不严的漏洞,下面让我们一起来分析下它的源码:</p><p><%</p><p>dim upload,file,formName,formPath,iCount,filename,fileExt '//定义上传变量</p><p>set upload=new upload_5xSoft '//建立上传对象</p><p>formPath=upload.form("filepath") <br/> '//第一步,获取文件路径,此处是关键。</p><p>if right(formPath,1)<>"/" then formPath=formPath&"/" </p><p>for each formName in upload.file '//用For读取上传文件(列出所有上传了的文件)</p><p>set file=upload.file(formName) '//生成一个文件对象</p><p><br/>.................................................... '//省略部分代码</p><p>fileExt=lcase(right(file.filename,4)) '//从文件名中截取后4位,并转换为小写字母。</p><p>if fileEXT<>".gif" and fileEXT<>".jpg" and fileEXT<>".zip" and fileEXT<>".rar" and fileEXT<>".swf" then '//文件扩展名判断</p><p>response.write "<font size=2>文件格式不正确 [<a href=# onclick=history.go(-1)>重新上传</a> ]</font>"</p><p>response.end</p><p>end if</p><p>randomize</p><p>ranNum=int(90000*rnd)+10000</p><p>filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranMum&fileExt</p><p>'//第二步,filename由提交的文件路径+年月日的随机文件名+转换后的扩展名组成</p><p>if file.FileSize>0 then</p><p>file.SaveAs Server.mappath(FileName) '//保存文件</p><p>end if</p><p>set file=nothing</p><p>next</p><p>%></p><p>在这段源码中,最关键的是这两句:</p><p>1.formPath=upload.form("filepath")</p><p>2.filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&fileExt</p><p><br/>下面让我们来看一下漏洞是如何形成的。</p><p>1.从变量Filepath中获取文件的保存路径。</p><p>2.用路径变量FormPath加随机生成的数字及经过判断的扩展名合成一个新的变量,变量Filename就是上传文件保存的路径及文件名称。</p><p><br/>这里举例说明:我们选择“111.jpg“上传,在上传过程中,随文件一起上传的还有FilePath变量,假设其值为“image“,当这些值传到</p><p>upfile.asp中,Filename就变成了:“image/200709050321944973.jpg”。这些流程看起来无懈可击,但还是被牛人研究出了突破方法。什</p><p>么方法呢?很简单,突破点就在变量身上。如果将其FilePath值改为“image/aa.asp ”,其中“ ”辨识二进制的00(空的意思),这样该变</p><p>量提交给upfile.asp后,Filename值就变成了“image/aa.asp /200709050321944973.jpg”。服务器在读取变量时,因为“ ”是二进制的</p><p>00,所以它认为该变量语句已经结束,“ ”后的字符自然也就被忽略了。这样一来Filename就成了:“image/aa.asp”。这样,漏洞就出现</p><p>了。</p><p> 关于此漏洞的利用,我们可以使用桂林老兵的上传工具,或者用WinSock抓包,之后用记事本保存提交数据并增加、修改相关内容。之后</p><p>用WinHex或UltraEdit32修改空格为二进制,最后用NC提交即可。</p><p><br/>FileName</p><p>介绍过FilePath(上传路径)过滤不严的漏洞,再来看一看FileName(上传文件名)过滤不严造成的漏洞,上传文件名过滤不严的形式是多种多</p><p>样的,这里介绍一种。</p><p>1.动易文章</p><p>我们来看一下它的上传文件“Upfile_Article.asp”中的部分源码:</p><p><%</p><p>Const UpFileType="rar|gif|jpg|bmp|swf|mid|mp3" '//允许的上传文件类型</p><p>Const SaveupFilesPath="../../UploadFiles" '//存放上传文件的目录</p><p>dim upload,oFile,formName,SavePath,filename,fileExt '//变量定义</p><p>....................................................</p><p>FoundErr=false '//此为是否允许上传的变量,初始化为假,表示可以上传。</p><p>EnableUpload=false '//此为上传文件扩展名是否合法的变量,初始化为假,表示的是不合法。</p><p>SavePath=SaveUpFilesPath '//存放上传文件的目录</p><p>....................................................</p><p>sub upload_0() '//使用化境无组件上传</p><p>set upload=new upfile_class '//建立上传对象</p><p>....................................................</p><p>for each formName in upload.file '//用For循环读取上传的文件</p><p>set ofile=upload.file(formName) '//生成一个文件对象</p><p>....................................................</p><p>fileExt=lcase(ofile.FileExt) '//将扩展名转换为小写字母</p><p>arrUpFileType=split*UpFileType,"|") '//读取后台定义的允许上传的扩展名</p><p>for i=0 to ubound(arrUpFileType) '//第一关,用FOR循环读取arrUpFileType数组。</p><p>if fileEXT=trim(arrUpFileType(i)) then '//如果fileEXT是允许上传的扩展名</p><p>EnableUpload=true '//EnableUpload为真,表示该文件合法</p><p>exit for</p><p>end if</p><p>next</p><p>if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then '//第二关,验证fileEXT是否为asp、asa、aspx扩展名</p><p>EnableUpload=false '//如果属于这三项之一,那么EnableUpload就定义为假,上传文件扩展名不合法。</p><p>end if</p><p>if EnableUpload=false then '//第三关,验证关。如果传递到此的EnableUpload变量为假,则说明上传文件扩展名不合法。</p><p>msg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:" & UpFileType</p><p>foundErr=true '//注意:因为文件名不合法,就更改了FoundErr值,由初始的false改为true</p><p>end if</p><p>strJS="<SCRIPT language=javascript>" & vbcrlf</p><p>if FoundErr<>true then '//第四关,上传关。如果FoundErr不等于true才可以上传</p><p>randomize</p><p>ranNum=int(900*rnd)+100</p><p>filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt</p><p>'//定义filename,其值为固定的路径名+年月日随机值生成的名称+传递过来的fileExt扩展名</p><p>ofile.SaveToFile Server.mappath(FileName) '//保存文件</p><p>msg="上传文件成功"</p><p>....................................................</p><p>next</p><p>set upload=nothing</p><p>end sub</p><p>%></p><p>在这段源码中,用到了两个FOR循环,两个逻辑变量。"for each formName in upload.file"用于取得所有上传的文件名;"for i=0 to </p><p>ubound(arrUpFileType)用于检测文件扩展名。而两个逻辑变量是EnableUpload和FoundErr。EnableUpload用于表示文件扩展名的合法性,</p><p>True表示合法,而FoundErr则用于表示文件是否可以上传,False表示可以上传。如果我们上传的是一个文件,那此段代码是无懈可击的。但</p><p>要上传两个呢?下面让我们看一下上传多个文件的流程:</p><p>首先,构造一个有两个上传框的本地HTM文件。</p><p>HTM代码如下:</p><p><form action="<a href="http://www.***.com/admin/Article/Upfile_Adpic.asp">http://www.***.com/admin/Article/Upfile_Adpic.asp</a>" method="post" name="form1"></p><p><input name="Filename1" type="File" class="tx1" size="40"></p><p><input name="Filename2" type="File" class="tx1" size="40"></p><p><input type="submit" name="Submit" value="上传"></p><p></form></p><p>运行此HTM,在第一个框内选择一个JPG图片,文件名为“111.jpg”,在第二个框内选择一个Cer文件,文件名为“222.cer”,点“上传”把这</p><p>两个文件同时提交给程序。接着到Upfile_AdPic.asp中观察这两个文件的上传流程(注意其中逻辑变量的变化)。</p><p>(1)在进入第一个FOR(读取文件名)之前,程序先将变量FoundErr定义为False、EnableUpload定义为False,然后读取文件名。先验证第一个</p><p>文件111.jpg,在验证的第一关,".jpg"属于允许上传的类型,变量EnableUpload=true。</p><p>(2)接着到第二关卡,检验是否属于三种禁传类型,因为不属于,变量EnableUpload仍为true。</p><p>(3)再到第三关卡,如果EnableUpload=false,那么FoundErr仍为进入第一个FOR循环之前的False。</p><p>(4)最后进入第四关,此关的验证是:如果FoundErr<>true就可以通过,看一下从第三关传递过来的FoundErr的值,是false那么就可以上</p><p>传。这里请注意,在111.jpg上传后,EnableUpload的值保持为True,FoundErr的值是False。</p><p>(5)接着程序读取第二个文件222.cer,进入第一关验证是否为允许上传类型,如果Cer属于此范围就将EnableUpload定义为True,而Cer不属</p><p>于,所以就保持原值。EnableUpload的原值是什么?看一下111.jpg上传后的变量值:“EnableUpload的值保持为True”,那么此时Cer文件</p><p>的EnableUpload的值就是True了。</p><p>(6)再到第二关,Cer同样不属于此限制范围,又跳过IF语句,再看EnableUpload的值,仍保持为True。</p><p>(7)又到第三关了,因为EnableUpload=true,跳过了此关验证。直接进入第四关,这时回头看一下FoundErr的值,自Cer进行上传验证开始,</p><p>一直未出现FoundErr,FoundErr的值到现在还是False。接下来是第四关的验证。这里只要FoundErr不是True就可以上传,所以Cer文件就这</p><p>样通过了层层关卡,进入到服务器。</p><p>除了Cer格式,还可以上传asp 、asp.的文件,方法很简单,将上传框中的asp名称加入空格或小数点。而上传到服务器中的asp 或asp.的扩</p><p>展名,因为Windows文件命名规则,会自动去除后面的空格和小数点,保存的就是ASP格式了。<br/></p>
|
|