一.概述 My动力文章管理系统是由asp163.net开发的一套文章管理系统,最近由于要做个网站就对他的代码研究了一下,呵呵,虽然webboy对My动力做了不少安全措施,防止了可能的sqlinjection攻击,但这样似乎给人一种非常安全的错觉,我们一起来分析一下吧。 我们先到网站上面注册一个用户,进入用户的文章管理看看,可以添加软件,添加图片……,看看可以上传东西吧,但是My动力文件管理系统似乎限制只允许已定义的文件后缀上传,如软件只允许rar|zip|exe|mpg|rm|wav|mid格式,有没有办法突破呢? 二.漏洞详细分析过程 其实仔细研究一下是发现有可能上传ASP文件的!大家看Upfile_Soft.asp的这一段代码(其他用于上传的文件类似): const UpFileType="rar|zip|exe|mpg|rm|wav|mid" "定义了可以上传的文件类型 ... dim EnableUpload "定义了是否允许上传的关键变量 ... FoundErr=false "默认FoundErr变量为假,即没有发现错误(哈哈,关键变量哦,看下面) EnableUpload=false "默认EnableUpload变量为假,即不能上传(哈哈,关键变量哦) ... for each formName in upload.file"列出所有上传了的文件(!关键,注意这个FOR循环!) set ofile=upload.file(formName) "生成一个文件对象 ... arrUpFileType=split(UpFileType,"|") "取得定义的可以上传的后缀名 for i=0 to ubound(arrUpFileType) if fileEXT=trim(arrUpFileType(i)) then EnableUpload=true "hoho,EnableUpload变量改变了! exit for end if next if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then "呵呵,只要是ASP,ASA,ASPX的后缀就废掉了,难怪海洋顶端上不去阿! EnableUpload=false end if if EnableUpload=false then msg="这种文件类型不允许上传!
只允许上传这几种文件类型:" & UpFileType FoundErr=true "hoho,FoundErr变量改变了! end if ... if FoundErr<>true then "又是一个重要地方,看来FoundErr变量是能否上传的关键,那如何决定FoundErr变量呢?(草草虫ps:偶可以瞪大了眼睛看啊) randomize ranNum=int(900*rnd)+100 "生成一个随机数 filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt "没有改变上传文件的后缀,爽阿 ... ofile.SaveToFile Server.mappath(FileName) "保存文件 response.write "软件上传成功!软件大小为:" & cstr(round(oFileSize/1024)) & "K" strJS=strJS & "parent.document.myform.DownloadUrl1.value="" & fileName & "";" & vbcrlf "晕拉~还返回上传后改的名字,这回好了,不用猜了。 strJS=strJS & "parent.document.myform.SoftSize.value="" & cstr(round(oFileSize/1024)) & "";" & vbcrlf 注:...表示省略了部分代码 大家研究一下这段代码会发现,My动力使用了化境无组件上传类来上传,而化境的无组件上传类可以上传多个文件,for each formName in upload.file这一句就是用于取得所有form中取得的文件名。第二个for循环for i=0 to ubound(arrUpFileType)用于检测文件类型,如果不满足条件则关键变量EnableUpload为默认值false,而EnableUpload为默认值false时又导致关键变量FoundErr值得改变为true,我们的目的就是想办法避免FoundErr值的改变,让他保持默认值false,我们注意到if fileEXT=trim(arrUpFileType(i)) then这一句如果满足条件则EnableUpload为真,那么当有多个文件用于上传时,作者考虑到了么?显然是没有的,虽然各上传界面的都是只有一个上传提交框,但我们可以在本地自己构造阿~,如下图: