本日志标题:解决ASP(图像)上传漏洞的方法        [2006-5-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进行手脚操作
https://blog.cnbruce.com/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 全部选择进行拷贝 提示:可先修改部分代码,再点击运行]

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

http://www.164.cc/2006/upf/




[Edit on 2006-5-14 11:28:01 By cnbruce]

在百度搜索完整的解决ASP(图像)上传漏洞的方法内容,或者用Google搜索相关的更多内容

By [cnbruce] at 1:36:45 | 评论 [30] | 浏览 [39926] | TrackBack| 返回顶部

About Comments
感谢分享。。
By [飞飞] at 2006-5-14 12:49:39
大家都怕了碰上网易那样的倒霉事情,呵呵,更新。
By [daniel] at 2006-5-15 12:52:19
我的测试结:正确的图片也通不过checktype的检测。
By [大郎] at 2006-5-22 18:22:50
那SWF格式也不能上传了。要怎么改????
By [小李] at 2006-6-28 8:31:52
---
我的测试结:正确的图片也通不过checktype的检测。
By [大郎] at 2006-5-22 18:22:50
---
好像图片的后缀名是大写的,通不过验证例如 1.JPG这种
可以在CheckFileType函数中
CheckFileType=false
下面加入一句讲所有文件的名字变成小写就好了:
filename=LCase(filename)


By [Mr.tomato] at 2006-7-7 10:26:10
发现如果在图片格式文件底部插入asp代码,这样图片依然被认为合法而上传
By [oror] at 2006-8-22 16:55:05
发现如果在图片格式文件底部插入asp代码,这样图片依然被认为合法而上传

是的没错,我的测试也是这个结果.
By [baiyuntian] at 2006-9-5 19:05:08
在图片中插入了asp代码,然后呢?对于程序系统有何影响?
By [a2sd] at 2006-9-5 19:25:10
正常的gif上传不了 但jpg可以
By [asp2001] at 2006-10-19 17:45:03
大哥!怎么正确的图片格式无法上传啊!请指点哈小弟!小弟非常感谢!!
By [ZXZZXZ] at 2007-2-9 12:01:38
我是菜鸟。我想花钱找你给我的网站修补漏洞,www.of12.cn
By [aspweb] at 2007-7-6 10:19:47
---
那SWF格式也不能上传了。要怎么改????
By [小李] at 2006-6-28 8:31:52
---
加入SWF文件的文件头信息检测即可
By [大猪] at 2007-12-12 22:29:07
很好的帖子 帮我解决了对我很重要的问题 谢谢楼主!!!
By [changleikkk] at 2008-8-25 13:55:49
js asp版的请参见:http://bbs.ajaxjs.com/viewthread.php?tid=1879&extra=page%3D1

By by Thomas Kjoernes <thomas@ipv.no>。
By [frank] at 2010-8-11 17:34:19


Post a Comment
呢称: 验证码: 
禁止笑脸转换 禁止UBB | 缩放输入框:6 5 | [Ctrl+Enter提交](1000个字符限制)