ASP代码审计之任意文件下载漏洞分析

CracerCracer 2016-1-4 代码审计 682 0 2

 

任意文件下载(Arbitrary File Download)

 

概述:如果系统存在stream流模式下载模块,而对应下载文件的地址没有做过安全过滤处理,则会发生任何文件都可被下载的安全隐患,在windows平台下此问题更加严重。

漏洞原理:Windows系统支持“.asp+空格”和“.asp+.”等同于“.asp”文件,如果存在下载模块未加验证,则可以下载任意文件。

漏洞代码:下面以沸腾展望系统经典下载漏洞源码做介绍。关键源码如下:

1
<% Dim Stream Dim Contents Dim FileName Dim TrueFileName Dim FileExt Dim SavePath Const adTypeBinary = 1 FileName = Request.QueryString("FileName") If FileName = "" Then Response.Write "无效文件名!" Response.End End if FileExt = Mid(FileName, InStrRev(FileName, ".") + 1) Select Case UCase(FileExt) Case "ASP", "ASA", "ASPX", "ASAX", "MDB" Response.Write "非法操作!" Response.End End Select Response.Clear if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then Response.ContentType = "image/*" '对图像文件不出现下载对话框 else Response.ContentType = "application/ms-download" end if Response.AddHeader "content-disposition", "attachment; filename=" & GetFileName(Request.QueryString("FileName")) Set Stream = server.CreateObject("ADODB.Stream") Stream.Type = adTypeBinary Stream.Open SavePath = FileUploadPath '存放上传文件的目录 TrueFileName = SavePath & FileName Stream.LoadFromFile Server.MapPath(TrueFileName) While Not Stream.EOS Response.BinaryWrite Stream.Read(1024 * 64) Wend Stream.Close Set Stream = Nothing Response.Flush Response.End %>

上述代码粗体部分是漏洞形成的关键代码,首先程序通过 Request.QueryString(“FileName”) 方法指定任意文件名,虽然程序在下面判断了文件后缀名,可是并没有对后缀名进行安全处理,导致客户端可以在后缀名之后加上空格的URL编码从而绕过程序的验证,文件被下载。

漏洞利用:利用方法如下图

1

 

如图上所示当攻击者在浏览器的地址栏中输入“down.asp?filename=./cn/index.asp%20”, %20就是经过URL编码后的空格,%2E就是经过URL编码后的“.”,提交后迅雷就会提示下载。

漏洞修复:修补的方法也很简单,下载文件前最好带入数据库查询,存在则下载。还有种方法,用正则表达式去限制。

 

转载请注明来自Cracer,本文标题:《ASP代码审计之任意文件下载漏洞分析》

喜欢 (2) 发布评论
发表评论


Top