_11_上传漏洞
网盾高级阶段
网 络 安 全 体 系
主 讲: 尹 俊
E-mail:[email protected]
网络安全体系课程 网络安全体系课程
第11讲
上传漏洞的利用 上传漏洞的利用
回顾
PHP注射的基本思路是什么? PHP注射语句有哪些?
本章目标
了解什么是上传漏洞 了解上传漏洞的原理 掌握针对不同的上传漏洞上传木马的方法 了解上传木马的其他方法
一 什么是上传漏洞
上传漏洞,这是一种比注入更有杀伤力的漏洞.通过注 入所得到的往往是数据库中的一些敏感信息,如管理员名 称,密码等等,但上传漏洞就不同了,它可以把ASP, PHP等格式的木马直接上传至网站目录内,一旦上传成功, 可以立刻得到WEBSHELL权限, 而不需要任何用户名和密 码的验证.
注意:上传漏洞是有个发现过程的,也就是有人发现了该漏洞并且 公布出来,那么才有利用价值,否则别人是不知道的,当然我们如果经 常去读代码,做测试,也可以发现上传漏洞.
上传漏洞的产生
1,DVBBS(动网)6.0首先暴出存在上传漏洞. 2,joekoe(乔客)6.0论坛及bbsxp,动感下载,尘缘 雅境等多个知名论坛,整站系统暴出存在上传漏 洞. 3,由于各个系统使用的普遍性,不计其数的网站被 入侵.包括一些门户网站及安全站点. 4,随着时间推移,各种新的上传漏洞将会陆续被公 开.
二 上传漏洞原理
寻找程序上传漏洞,必须从上传页面的源 文件入手,目标有两个:
1,FileName(文件名称)
在上传页面中针对对文件扩展名过滤不严格,从而上传可以执行的木马
2,FilePath(文件路径)
此漏洞是在上传页面中针对文件路径过滤不严格,导致黑客可以修改 上传的相对路径达到上传木马的目的.
1 FileName过滤不严格
以动易文章上传文件Upfile_Article.asp的源码为例:
ConstUpFileType="rar|gif|jpg|bmp|swf|mid|mp3"'//允许的上传文件类型 ConstSaveUpFilesPath="../../UploadFiles"'//存放上传文件的目录 dimupload,oFile,formName,SavePath,filename,fileExt//变量定义 FoundErr=false'//此为是否允许上传的变量,初始化为假,表示可以上传 EnableUpload=false'//此为上传文件扩展名是否合法的变量,初始化为假 SavePath=SaveUpFilesPath'//存放上传文件的目录 subupload_0()'//使用无组件上传 setupload=newupfile_class'//建立上传对象 foreachformNameinupload.file'//用For循环读取上传的文件 setofile=upload.file(formName)'//生成一个文件对象 fileExt=lcase(ofile.FileExt)'//将扩展名转换为小写字符 arrUpFileType=split(UpFileType,"|")'//读取后台定义的允许的上传扩展名 fori=0toubound(arrUpFileType)'//第一关,用FOR循环读取arrUpFileType数组. iffileEXT=trim(arrUpFileType(i))then'//如果fileEXT是允许上传的扩展名 EnableUpload=true'//EnableUpload为真,表示该文件合法
iffileEXT="asp"orfileEXT="asa"orfileEXT="aspx"then' //第二关,验证fileEXT是
否为asp,asa,aspx扩展名. EnableUpload=false' //如果属于这三项之一,那么EnableUpload就定义为假,上传文件扩展名不合法 ifEnableUpload=falsethen'//第三关,验证关.如果传递到此的EnableUpload变 量为假,则说明上传文件扩展名不合法 msg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:"&UpFileType FoundErr=true' //注意:因为文件名不合法,就更改了FoundErr值,由初始的false改为true strJS=""&vbcrlf ifFoundErrtruethen'//第四关,上传关.如果FoundErr不等于true才可以上传. randomize ranNum=int(900*rnd)+100 filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute (now)&second(now)&ranNum&"."&fileExt'//定义filename,其值为固定的路 径名+年月日及随机值生成的名称+传递过来的fileExt扩展名. ofile.SaveToFileServer.mappath(FileName)'//保存文件 msg="上传文件成功!"
FileName过滤不严格
上述代码漏洞: 未对cer后缀的木马做过滤,同时还可以上传asp□ (□在这里表示空格),asp.格式的文件, 因为asp□, asp.后缀不同于asp, 所以可以绕过验证. 根据 Windows文件命名原则,会去除后面的空格和小数点 ,保存的就是asp格式了.
FileName过滤不严格
以动感商务上传文件Upfile.asp的源码为例:
SetFile=UploadObj.File(FormName)'//取得上传文件名 FileExt=FixName(File.FileExt)'//第一步,用FixName函数过滤上传文件的扩 展名 IfCheckFileExt(FileExt)=Falsethen'//第二步,用CheckFileExt检查过滤后 的文件扩展名 ErrCodes=5 EXITSUB'//退出上传 EndIf FileName=FormatName(FileExt)'//符合条件的话,就用FormatName函数 按日期生成文件名 IfFile.FileSize>0Then File.SaveToFileServer.Mappath(FilePath&FileName)'//保存的文件路径及 名称是Filepath+FileName
下面再来看一下上传所涉及到的一些参数. A,FixName()函数: PrivateFunctionFixName(ByvalUpFileExt)' //第一步的过滤函数,过滤特殊扩展名. IfIsEmpty(UpFileExt)ThenExitFunction'//如扩展名为空就退出交互 FixName=Lcase(UpFileExt)' //将扩展名转换为小写字符 FixName=Replace(FixName,Chr(0),"")' //将二进制的00空字符过滤为 空 FixName=Replace(FixName,".","")' //将单引号过滤为空,下同 FixName=Replace(FixName,"'","") FixName=Replace(FixName,"asp","") FixName=Replace(FixName,"asa","") FixName=Replace(FixName,"aspx","") FixName=Replace(FixName,"cer","") FixName=Replace(FixName,"cdx","") FixName=Replace(FixName,"htr","") FixName=Replace(FixName,"shtml","") EndFunction
B,CheckFileExt()函数: PrivateFunctionCheckFileExt(FileExt)' //第二步的判断函数,判断文件类型是否合乎要求 DimForumupload,i CheckFileExt=False' //定义CheckFileExt的初始值为假, IfFileExt=""orIsEmpty(FileExt)Then' //第一次,为空则退出 CheckFileExt=False ExitFunction EndIf IfFileExt="asp"orFileExt="asa"orFileExt="aspx"orFileExt="shtml" Then' //第二次,如果属于这四种类型也退出
交互 CheckFileExt=False Forumupload=Split(InceptFile,",")' //第三次,从InceptFile中提取后台的上传扩展名 Fori=0Toubound(Forumupload)' //用For循环检验 IfFileExt=Trim(Forumupload(i))Then' //如果和后台中的任一上传扩展名相符,则CheckFileExt=True. CheckFileExt=True
FileName过滤不严格
上述代码漏洞:
强制过滤asp,asa等敏感后缀名, 但改成aaspsp, 和aasasa, 过滤后仍然为asp和asa
2 FilePath过滤不严格
以动感商务上传文件Upfile.asp的源码为例:
dimupload,file,formName,formPath,iCount,filename,fileExt//定义上传 变量 setupload=newupload_5xSoft' //建立上传对象JM的测试代码 formPath=upload.form("filepath")'//第一步,获取文件路径,此处是关 键. ifright(formPath,1)"/"thenformPath=formPath&"/" foreachformNameinupload.file'//用For读取上传文件 setfile=upload.file(formName)'//生成一个文件对象 fileExt=lcase(right(file.filename,4))'//从文件名中截取后4位,化为小写 iffileEXT".gif"andfileEXT".jpg"andfileEXT".zip"and fileEXT".rar"andfileEXT".swf"then'//文件扩展名判断 response.write"文件格式不正确[重新上传]"
FilePath过滤不严格
上述代码漏洞:
如果将其FilePath值改为"image/aa.asp□",并使 aa.asp后的"□"表示二进制的00,这样,该变量提交入 upfile.asp后,Filename值就变成了: "image/aa.asp□/[***********].jpg"服务器在 读取这段变量时,因为"□"是二进制的00,认为该变量 语句已经结束了,于是"□"后面的字符也就被忽略掉了 ,这样一来,Filename就成了"image/aa.asp",程序 再用file.SaveAs进行保存的话,这个文件就保存成了 aa.asp文件
三 上传漏洞实战
手工或明小子工具上传:
针对:FileName过滤不严格
动感购物 DEMO 动力文章 DEMO
手工抓包上传:
针对:FilePath过滤不严格
少儿文学网抓包上传
四 上传木马的其他方法
后台数据库备份
潜江水产DEMO
上传数据库文件+一句话木马的图片并备份
动网7.1.0DEMO
利用Win2003文件解析路径漏洞
动易2006DEMO
本章总结
上传木马文件应根据其上传页面的代码进 行判断利用方法. 总结上传方法有:
根据FileName过滤不严格: 修改后缀名为:asp(空)asp. aaspspcer asa等或工具上传 根据FilePath过滤不严格: 工具或手工抓包上传
实验:
上传漏洞演练: 手工上传 明小子工具上传 手工抓包上传 其他上传方法