对于上传漏洞的查找,仍是从源文件入手,目标有两个,一个是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 "文件格式不正确 [ 重新上传 ]"

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

%>

在这段源码中,要关键的就这两句:

1、formPath=upload.form("filepath")

2、filename=formPath&year(now)&month(now)&day(now)&hour (now)&minute(now)&second(now)&ranNum&fileExt

广告插播。变量与常量:所谓变量就是指在程序的运行过程中随时可以发生变化的值;而常量则恰恰相反,指的是在程序的运行过程中始终保持不变的值(刺猬2005作品)。

下面来看一下漏洞是如何形成的。在第一句代码中,从变量filepath中获取文件的保存路径,然后在第二句中,用路径变量formPath加随机生成的数字及经过判断的扩展名合成为一个新的变量,这个变量Filename就是上传文件保存的路径及名称。这样说有些笼统,下面举例说明。比如选择 “111.jpg”文件上传,在上传过程中,随文件一起上传的还有一个FilePath变量,假设其值为“p_w_picpath”,当这些值传到 upfile.asp中,filename就变成了:“p_w_picpath/200512190321944973.jpg”,上传成功后,该111.jpg就被保存到p_w_picpath文件夹内,文件名字也被改成了:“200512190321944973.jpg”。这段流程,看起来无懈可击,但还是被牛人研究出了突破方法,什么方法呢?很简单,突破点就在变量身上,如果将其FilePath值改为“p_w_picpath/aa.asp□”,其后的“□”表示二进制的00(空的意思),这样,该变量提交入upfile.asp后,Filename值就变成了 “p_w_picpath/aa.asp□/200512190321944974.jpg”,服务器在读取这段变量时,因为“□”是二进制的00,认为该变量语句已经结束了,于是“□”后面的字符也就被忽略掉了,这样一来,Filename就成了:“p_w_picpath/aa.asp”,程序再用file.SaveAs进行保存的话,这个文件就保存成了aa.asp文件,瞧!漏洞出现了。

对于这个漏洞的利用,可以使用桂林老兵的上传工具,也可以采取用WinSock抓包,然后用记事本保存提交数据并增加、修改相关内容,再用WinHex修改空格为二进制,最后用NC提交的方法。以上两种的使用方法,请参阅相关的文章(刺猬2005作品)。

二、FileName

介绍过FilePath(上传路径)过滤不严的漏洞,再来看一看FileName(上传文件名)过滤不严造成的漏洞,上传文件名过滤不严的形式是多种多样的,偶这里介绍两种:

1、动易文章

2005.10期中的《再现昔日漏洞——沁竹音乐程序的疏忽》,所涉及的上传漏洞就是动易的上传漏洞,下面以此为例,来看一下其上传文件Upfile_Article.asp中的部分源码:

Const UpFileType="rar|gif|jpg|bmp|swf|mid|mp3" '//允许的上传文件类型jmdcw

Const SaveUpFilesPath="../../UploadFiles" '//存放上传文件的目录,注:以上两个常量均在config.asp文件内定义'刺猬测试代码

dim upload,oFile,formName,SavePath,filename,fileExt //变量定义

……………………

FoundErr=false '//此为是否允许上传的变量,初始化为假,表示可以上传。

EnableUpload=false '//此为上传文件扩展名是否合法的变量,初始化为假,表示的是不合法。

SavePath = SaveUpFilesPath '//存放上传文件的目录

……………………

sub upload_0() '//使用化境无组件上传

set upload=new upfile_class '//建立上传对象

……………………

for each formName in upload.file '//用For循环读取上传的文件。 jmdcw

set ofile=upload.file(formName) '//生成一个文件对象

……………………

fileExt=lcase(ofile.FileExt) '//将扩展名转换为小写字符

arrUpFileType=split(UpFileType,"|") '//读取后台定义的允许的上传扩展名

for i=0 to ubound(arrUpFileType) '//第一关,用FOR循环读取arrUpFileType数组。

if fileEXT=trim(arrUpFileType(i)) then '//如果fileEXT是允许上传的扩展名

EnableUpload=true '//EnableUpload为真,表示该文件合法。

exit for

end if

next

if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then '// 第二关,验证fileEXT是否为asp、asa、aspx扩展名。

EnableUpload=false '//如果属于这三项之一,那么EnableUpload就定义为假,上传文件扩展名不合法。jm

end if

if EnableUpload=false then '// 第三关,验证关。如果传递到此的EnableUpload变量为假,则说明上传文件扩展名不合法。

msg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:" & UpFileType

FoundErr=true '//注意:因为文件名不合法,就更改了FoundErr值,由初始的false改为true。

end if

strJS="

if FoundErr<>true then '//第四关,上传关。如果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.SaveToFile Server.mappath(FileName) '//保存文件 cw's

msg="上传文件成功!"

……………………

next

set upload=nothing

end sub

%>

在这段源码中,用到了两个FOR循环、两个逻辑变量,第一个FOR循环“for each formName in upload.file”用于取得所有上传的文件名;第二个FOR循环“for i=0 to ubound(arrUpFileType) ”用于检测文件扩展名。而两个逻辑变量是EnableUpload和FoundErr,EnableUpload用于表示文件扩展名的合法性,True表示合法;而FoundErr则用于表示文件是否可以上传,False表示可以上传,很奇怪?用的是False!如果我们上传的是一个文件,那此段代码是无懈可击的,但要上传两个呢?因为化境无组件上传可以上传多个文件,OK!来看一下上传多个文件的流程:

首先,构造一个有两个上传框的本地HTM文件,HTM代码如下:

运行这个HTM,在第一个框内选择一个jpg图片,文件名为“111.jpg”,在第二个框内选择一个Cer文件,文件名为“222.cer”,点“上传”把这两个文件提交给程序。接下来到Upfile_AdPic.asp中观察这两个文件的上传流程(注意其中逻辑变量的变化)。

1、在进入第一个FOR(读取文件名)之前,程序先将变量FoundErr定义为false、EnableUpload定义为false,然后读取文件名,先验证第一个文件111.jpg,在验证的第一关中,jpg属于允许上传的类型,变量EnableUpload=true。

2、接着到第二关,检验是否属于三种禁传类型,因为不属于,变量EnableUpload仍为true。

3、再到第三关卡,如果EnableUpload=false,那么FoundErr=true,而前面传递来的EnableUpload=true,那FoundErr仍为进入第一个FOR循环之前的false。

4、最后进入第四关,此关的验证是:如果FoundErr<>true就可以通过,看一下从第三关传递过来的FoundErr的值,是 false,可以上传。这里请注意,在111.jpg上传后,EnableUpload的值保持为true,FoundErr的值是false。

5、接着程序读取第二个文件222.cer,进入第一关验证是否为允许上传类型,如果cer属于此范围就给EnableUpload定义为true,而 cer不属于,所以就保持原值,EnableUpload的原值是什么?看一下111.jpg上传后的变量值:“EnableUpload的值保持为 true”,那么此时cer文件的EnableUpload值就是true了。

6、再到第二关,cer同样不属于此限制范围,又跳过IF语句,再看EnableUpload的值,仍保持为true。

7、又到第三关了,因为EnableUpload=true,又跳过了此关验证。直接进入第四关,这时回头看一下FoundErr的值,自cer进行上传验证开始,一直未出现FoundErr,FoundErr的值是什么?呵呵,它还是111.jpg上传后的值false,而第四关的验证就是只要 FoundErr不是true就可以上传,所以,这个cer文件也就通过了层层关卡,进入了服务器。

除了cer格式的,还可以上传asp□(□在这里表示空格,以下同)、asp.格式的文件,方法很简单,就是把上传框中的asp名称加入空格或小数点,因为是asp□、asp.格式,其绕过方式和cer是一样的,而上传到服务器中的asp□或asp.的扩展名,因为Windows文件命名原则,会去除后面的空格和小数点,保存的就是asp格式了。

2、动感商务2005

说过了动易的上传漏洞,再来介绍动感商务2005的上传漏洞,今天真是太巧了,动网、动易、动感,全是带动的,哈哈!动易是由于上传多个文件引起的漏洞,而动感则是因为文件名过滤不严出现上传漏洞。(刺猬2005作品)下面是动感2005上传upfile.asp中的部分源码:

<%

Private Sub SaveFile_0() '//无组件上传

……………………

Set File = UploadObj.File(FormName) '//取得上传文件名 cw's files

FileExt = FixName(File.FileExt) '//第一步、用FixName函数过滤上传文件的扩展名

If CheckFileExt(FileExt) = False then '//第二步、用CheckFileExt检查过滤后的文件扩展名

ErrCodes = 5

EXIT SUB '//退出上传

End If

FileName = FormatName(FileExt) '//符合条件的话,就用FormatName函数按日期生成文件名

……………………

If File.FileSize>0 Then

File.SaveToFile Server.Mappath(FilePath & FileName) '//保存的文件路径及名称是Filepath+FileName

……………………

End Sub

%>

下面再来看一下上传所涉及到的一些参数。

A、FixName()函数:

Private Function FixName(Byval UpFileExt) '//第一步的过滤函数,过滤特殊扩展名。

If IsEmpty(UpFileExt) Then Exit Function '//如扩展名为空就退出交互

FixName = Lcase(UpFileExt) '//将扩展名转换为小写字符。

FixName = Replace(FixName,Chr(0),"") '//将二进制的00空字符过滤为空

FixName = Replace(FixName,".","") '//将单引号过滤为空,下同。 jmdcw

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","")

End Function

从中,我们可以看出,应用程序asp.dll映射的类型全部过滤了,除此之外,还有小数点、单引号也被过滤,甚至连Chr(0)都过滤了,Chr(0)是什么?它就是16进制的0x00,表示为二进制是00000000,也就是前面在FilePath上传漏洞中大显神通的空字符。

B、CheckFileExt()函数:

Private Function CheckFileExt(FileExt) '//第二步的判断函数,判断文件类型是否合乎要求

Dim Forumupload,i

CheckFileExt=False '//定义CheckFileExt的初始值为假,

If FileExt="" or IsEmpty(FileExt) Then '//第一次、为空则退出

CheckFileExt = False

Exit Function

End If

If FileExt="asp" or FileExt="asa" or FileExt="aspx" or FileExt="shtml" Then '//第二次、如果属于这四种类型也退出交互

CheckFileExt = False

Exit Function

End If

Forumupload = Split(InceptFile,",") '//第三次、从InceptFile中提取后台的上传扩展名

For i = 0 To ubound(Forumupload) '//用For循环检验

If FileExt = Trim(Forumupload(i)) Then '//如果和后台中的任一上传扩展名相符,则CheckFileExt = True。

CheckFileExt = True

Exit Function

Else

CheckFileExt = False

End If

Next

End Function

这个函数对经过FixName()函数过滤后的扩展名再次判断,其中有三次检查,第一次是判断传递而来的扩展名是否为空,为空则退出上传,第二次是判断扩展名是否属于asp、asa等四种限传类型,属于也退出上传,第三次就是用该扩展名同后台内自定义的上传扩展名进行对比,符合就允许上传。

C、FilePath值:

其所用到的filepath在upload.asp中,其值如下:

if info_name="bbs" then

FilePath = "/bbs/upload/"

else

FilePath = "/uploadpic/"

end if

FilePath是一个常量,从这条路找漏洞是行不通的了。

OK!下面上传一个文件来看其验证流程,比如上传的文件名为“111.cer”,在用“FileExt = FixName(File.FileExt)”过滤扩展名时,因为cer属于fixName()函数的过滤范围,所以扩展名cer就成了空,当把这个空的扩展名传递给CheckFileExt(),在其进行到“If FileExt="" or IsEmpty(FileExt)”语句时,就会因为FileExt为空而退出交互,返回格式不正确,拒绝上传。

如何突破呢?其突破点就在FixName()函数中,上面我们也看到,在上传时cer会被过滤为空,但如果我们把上传文件扩展名改为ccerer,同时,在后台的自定义上传类型中增加“ccerer”、“cer”,这样,扩展名为ccerer的文件在经过第一步FixName()的过滤后,ccerer就变成了cer(中间的cer字符被过滤为空),传递此值到CheckFileExt()函数中,通过其第一次不空的关卡,再通过第二次限制类型的关卡,最后到对比后台上传类型关卡,因为在前面我们已添加了“ccerer”、“cer”两种类型,那么也就通过CheckFileExt()第三次的判断, CheckFileExt = True,也就把这个扩展名ccerer的文件上传到服务器中了,并且上传后的扩展名是cer。

有的朋友可能会问,如果上传扩展名为aaspsp□或aaspsp.格式的文件,在经过FixName()函数的过滤,不就变成了asp□或asp.了,而这两种格式也不在限制的范围,只要在后台中加上这几种类型,不就可以把上传的文件保存为asp格式了?其实当初我也是这个想法,但经过仔细的研究分析,发现此路不通,为什么?先说小数点,在FixName()中,有这么一句,FixName = Replace(FixName,".",""),将小数点过滤为空,瞧!小数点的路断了。再来看空格,虽然FixName()中没有过滤空格,但在 CheckFileExt()读取后台上传类型时有这么一句:“If FileExt = Trim(Forumupload(i)) Then ”,其中有个Trim(),Trim的作用是删除字符串开始和尾部的空格。虽然在后台能写入了asp□类型,但在读取时,却会被Trim()过滤成 asp,而aaspsp□通过层层关卡到了此处,已变成了asp□,asp□<>asp,证件不符!Sorry,拒绝进入!

总而言之,上传漏洞是比较吸引眼球的。偶用上面三个例子对上传漏洞管中窥豹了一番,希望对各位朋友有所帮助。呵呵!相信自已,说不定下一个发现新的上传漏洞的牛人就是你!(刺猬2005作品)

html5无组件上传,ASP上传漏洞 无组件上传图片文件(转载)相关推荐

  1. element ui upload组件文件上传一次 后,不论是上传成功之后修改文件再上传还是上传失败重新上传,再次点击上传均无反应。

    问题: Element UI Upload 组件文件上传一次 后,不论是上传成功之后修改文件再上传还是上传失败重新上传,再次点击上传均无反应. 原因: 第一次上传文件后,浏览器还保存着我们已经上传的文 ...

  2. 用Delphi 6开发ASP上传组件详解

    文件上传是WEB开发中经常要用到的功能,但ASP本身和内置的组件都不支持文件上传功能.网上流传的一些第三方组件虽然能够解决这个问题,但大多是要收费的,更别说Open Source了.本文将详细剖析WE ...

  3. 蛙蛙推荐:蛙蛙牌asp上传组件,(有完整注释)

    蛙蛙推荐:蛙蛙牌asp上传组件,(有完整注释) <% '当表单里既有文本域又有文件域的时候,我们必须把表单的编码类型设置成"multipart/form-data"类型 '这 ...

  4. 分享66个ASP上传下载源码,总有一款适合您

    分享66个ASP上传下载源码,总有一款适合您 66个ASP上传下载源码下载链接:https://pan.baidu.com/s/1AAZA99BVNOFtVFIjnYl4XA?pwd=vyqa  提取 ...

  5. 分享111个ASP上传下载源码,总有一款适合您

    分享111个ASP上传下载源码,总有一款适合您 111个ASP上传下载源码下载链接:https://pan.baidu.com/s/1VaiX2JZqyBue8g_x7bsrZA?pwd=szji  ...

  6. 分享116个ASP上传下载源码,总有一款适合您

    分享116个ASP上传下载源码,总有一款适合您 116个ASP上传下载源码下载链接:https://pan.baidu.com/s/1loHIyl9LUAkyPBedFpkRQw?pwd=fflw  ...

  7. html ajax打包成app,利用HTML5与ajax完成拖拽上传文件

    前言 基于ajax的异步模式的上传控件,基本功能如下: 拖拽上传(利用HTML5新增特定 拖拽事件 以及 event的dataTransfer属性) 单文件/多文件切换(利用php实现单/多文件上传) ...

  8. 采用艾恩asp上传的角本

    最近因一个小开发的需求,进行了Asp的文件上,在网上也看了不少的文章,多数都是将文件写入与文件上分开,另一方面就是写的不是很明确.而最终,我采用了艾恩asp上传的角本.这一点非常感谢艾恩的大力贡献,有 ...

  9. 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放

    导航 [初探HTML5之使用新标签布局]用html5布局我的博客页! [HTML5初探之form标签]解放表单验证.增加文件上传.集成拖放 [HTML5初探之绘制图像(上)]看我canvas元素引领下 ...

最新文章

  1. begin.lydsy 入门OJ题库:1104:纯粹合数
  2. 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)
  3. 跨年之际,中文版畅销书《TensorFlow深度学习实战大全》分享,直接送!
  4. Python 微信机器人:调用电脑摄像头时时监控功能实现演示,调用电脑摄像头进行拍照并保存
  5. 在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式
  6. python小甲鱼练习题答案_小甲鱼Python第 013讲元组:戴上了枷锁的列表 | 课后测试题及参考答案...
  7. python制作各种条形图
  8. 一个C/C++协程库的思考与实现之协程栈的动态按需增长
  9. 【Python】pandas的read_csv参数简略概括(header,path),DataFrame的返回值describe,plot,head
  10. CAD二次开发学习笔记四(得到选中的实体,修改实体,如等分线段)
  11. Revit模型转obj模型插件
  12. 使用 Hexo 快速免费搭建个人网站
  13. Studio 3T的使用
  14. Windows系统日志文件分析
  15. 2022年牛客多校第三场补题记录
  16. using werkzeug to build a shorly url app
  17. 如何进行区块链的开发?
  18. Flask Web开发-1.2模板及网页设计基础
  19. 【计算机网络】数据报与虚电路
  20. 【Python核心】输入与输出

热门文章

  1. 625这个数字很特别,625的平方等于390625。。。。。。
  2. 上线不足 6 个月,米哈游《原神》移动端疯狂吸金超 65 亿元,钟离上线首日收入破亿
  3. VS.NET 学习方法论——tuenhai的 VS.NET 学习之旅
  4. iOS中引入第三方静态库头文件找不到的问题解决方案
  5. 操作国学公众号项目,半年涨粉30万
  6. 唯品会Q3营收、利润环比下滑:高管接连变动,唯代购违规被下架
  7. Vue 简单的函数式组件
  8. 电脑自动关机命令详解
  9. 破解windows系统密码
  10. 阿里云免费https证书申请与配置-为不同应用申请安全证书并配置子域名