分享

解决ASP(图像)上传漏洞的方法

 hongmu 2006-05-14

经常听说的ASP上传漏洞,即是将一些木马文件修改后缀名(修改为图像文件后缀),进行上传。

针对此情况使用下列函数进行辨别:

<%
                        ‘***************************************************************
                        ‘CheckFileType 函数用来检查文件是否为图片文件
                        ‘参数filename是本地文件的路径
                        ‘如果是文件jpeg,gif,bmp,png图片中的一种,函数返回true,否则返回false
                        ‘***************************************************************
                        const adTypeBinary=1
                        dim jpg(1):jpg(0)=CByte(&HFF):jpg(1)=CByte(&HD8)
                        dim bmp(1):bmp(0)=CByte(&H42):bmp(1)=CByte(&H4D)
                        dim png(3):png(0)=CByte(&H89):png(1)=CByte(&H50):png(2)=CByte(&H4E):png(3)=CByte(&H47)
                        dim gif(5):gif(0)=CByte(&H47):gif(1)=CByte(&H49):gif(2)=CByte(&H46):gif(3)=CByte(&H39):gif(4)=CByte(&H38):gif(5)=CByte(&H61)
                        function CheckFileType(filename)
                        on error resume next
                        CheckFileType=false
                        dim fstream,fileExt,stamp,i
                        fileExt=mid(filename,InStrRev(filename,".")+1)
                        set fstream=Server.createobject("ADODB.Stream")
                        fstream.Open
                        fstream.Type=adTypeBinary
                        fstream.LoadFromFile filename
                        fstream.position=0
                        select case fileExt
                        case "jpg","jpeg"
                        stamp=fstream.read(2)
                        for i=0 to 1
                        if ascB(MidB(stamp,i+1,1))=jpg(i) then CheckFileType=true else CheckFileType=false
                        next
                        case "gif"
                        stamp=fstream.read(6)
                        for i=0 to 5
                        if ascB(MidB(stamp,i+1,1))=gif(i) then CheckFileType=true else CheckFileType=false
                        next
                        case "png"
                        stamp=fstream.read(4)
                        for i=0 to 3
                        if ascB(MidB(stamp,i+1,1))=png(i) then CheckFileType=true else CheckFileType=false
                        next
                        case "bmp"
                        stamp=fstream.read(2)
                        for i=0 to 1
                        if ascB(MidB(stamp,i+1,1))=bmp(i) then CheckFileType=true else CheckFileType=false
                        next
                        end select
                        fstream.Close
                        set fseteam=nothing
                        if err.number<>0 then CheckFileType=false
                        end function
                        %>
                        


那么在应用的时候
CheckFileType(server.mappath("cnbruce.jpg"))
或者
CheckFileType("F:/web/164/images/cnbruce.jpg"))

反正即是检测验证本地物理地址的图像文件类型,返回 true 或 false值

所以这个情况应用在图像上传中,目前的办法是先允许该“伪图像”文件的上传,接着使用以上的自定义函数判断该文件是否符合图像的规范,若是木马伪装的图像文件则FSO删除之,比如:
file.SaveAs Server.mappath(filename)   ‘保存文件
                        If not CheckFileType(Server.mappath(filename)) then
                        response.write "错误的图像格式"
                        Set fso = CreateObject("Scripting.FileSystemObject")
                        Set ficn = fso.GetFile(Server.mappath(filename))
                        ficn.delete
                        set ficn=nothing
                        set fso=nothing
                        response.end
                        end if
                        

则是先将文件上传,接着立马使用自定义函数判断文件图像类型的吻合性,FSO做出删除该文件的操作。


ASP上传漏洞还利用"\0"对filepath进行手脚操作
www./blog/showlog.asp?cat_id=32&log_id=635

针对这样的情况可使用如下函数
function TrueStr(fileTrue)
                        str_len=len(fileTrue)
                        pos=Instr(fileTrue,chr(0))
                        if pos=0 or pos=str_len then
                        TrueStr=true
                        else
                        TrueStr=false
                        end if
                        end function
                        

接着就可判断后再做文件的上传
if TrueStr(filename)=false then
                        response.write "非法文件"
                        response.end
                        end if
                        file.SaveAs Server.mappath(filename)
                        


所以,在Blog中的一文:(ASP)文件系统之化境无组件(v2.0)上传

关于upfile.asp的全新内容如下:

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


另外,请各位调试是否具有上传漏洞:

www./2006/upf/





生 / 如 / 夏 / 花
Let life be beautiful like summer flowers

Blueidea Web Team
youke

高级用户
积分:274
发贴:76
来自:
注册:2002-01-11
楼层:2
 发表于 2006-05-14 02:07:56  资料 邮件 悄悄话 搜索 引用 举报不良信息
引用:
网站脚本出错。请和网站管理员联络。
gzwlj

高级用户
积分:279
发贴:78
来自:
注册:2005-10-30
楼层:3
 发表于 2006-05-14 02:51:21  资料 邮件 悄悄话 搜索 引用 举报不良信息
先去试试


◥□◣☆★春花 秋 月 何时了 ★☆◢□◤
◥□◣☆ ↘往事 知 多少 ↙☆◢□◤
◥□◣小楼 昨夜 又东风 ◢□◤
◥故国不堪回首月明中◤
◥雕栏玉砌应犹在◤
←只↑←是↑←朱↑←颜↑←改
←问↑←君↑←能↑←有↑←几↑←多↑←愁
←恰↑←似↑←一↑←江↑←春↑←水↑←向↑←东↑←流
cnbruce

狼大狗
现任版主
积分:12022
发贴:6422
来自:扬州城
注册:2003-07-27
楼层:4
 发表于 2006-05-14 11:14:53  资料 邮件 主页 悄悄话 搜索 引用 举报不良信息
昨天睡觉之前有点昏,把 CheckFileType(Server.mappath(filename)) 直接放置了,而没有检测后缀类型是图像的才应用使用 CheckFileType()

现在调整过,再调试看看


生 / 如 / 夏 / 花
Let life be beautiful like summer flowers

Blueidea Web Team
jyhjyh

终级用户
积分:2111
发贴:560
来自:
注册:2004-11-08
楼层:5
 发表于 2006-05-14 11:19:37  资料 邮件 悄悄话 搜索 引用 举报不良信息
这次可以拉。。谢谢狼哥。。但是有一点,就是整体感觉这个文件不是太正规

如果可以 声名 “允许上传类型” 这样就好了
就是 直接 一个变量=“jpg,gif,txt等允许上传的类型”
你这样写出来。因为 测试了2次。。

所以感觉只能 上传 图片那几个类型。。下面的 txt呀 rar 等格式 都不可以上传了。。


骑白马的不一定是王子,他可能是唐僧;带翅膀的也不一定是天使,唐僧说,那是鸟人!
jyhjyh

终级用户
积分:2111
发贴:560
来自:
注册:2004-11-08
楼层:6
 发表于 2006-05-14 11:29:14  资料 邮件 悄悄话 搜索 引用 举报不良信息
汗!!而且还存在一个比较弱的错误
就是,大小写...你后缀 小写才可以上传...大写就 提示错了


骑白马的不一定是王子,他可能是唐僧;带翅膀的也不一定是天使,唐僧说,那是鸟人!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多