美文网首页
ASP.NET-漏洞处理-文件下载

ASP.NET-漏洞处理-文件下载

作者: 柠檬正在努力 | 来源:发表于2020-03-31 16:06 被阅读0次

    用于外网的允许匿名登陆的网址是比较容易出现漏洞的网址,总结一下新处理的两个漏洞

    一、文件下载漏洞处理

    原因:

    某客户报网络安全漏洞,是系统自身渗透结果,通过_VIEWSTATE获取了加密前的文件下载URL,修改其中的url参数可读取任意文件,如读取了某盘下的***文件

    漏洞危害:

    高危

    修复建议:

    对读取文件类型进行限制

    分析:

    该文件下载的页面是作为打开和下载附件使用的,在不影响原有功能的基础上进行修改,单单对文件类型进行限制的话第一是限制的类型比较多,第二是影响了原有什么文件类型都可以上传的功能,故提出解决方法是通过附件表建立用户和上传附件的一一对应关系,根据FileID和FilePath进行判断,只有在两者都符合的情况下才可以允许下载,这样子就可以达到对可下载文件进行限制的要求了。

    ''' <summary>
    ''' 附件验证是否可下载,True为可下载,False为不可下载
    ''' </summary>
    ''' <param name="AttID">附件ID</param>
    ''' <param name="Path">地址</param>
    ''' <returns></returns>
    Private Function ExistAttFile(ByVal AttID As String, ByVal Path As String) As Boolean
        Dim sql As New StringBuilder
        sql.AppendFormat("select IsExists=count(1) from [dbo].[FileAtt] where ID='{0}' and FilePath='{1}'", ID, Path)
        Dim dt As DataTable
        Try
            dt = SqlData.ExecuteDataset(ioCom.ConnectString, CommandType.Text, sql).Tables(0)
        Catch ex As Exception
            '错误检测
            Log.WriteLog(ex.Message)
            Log.WriteLog(Now.ToString & ":Error on StoredProcedure ExistAttFile " & vbCrLf)
            Return False
        End Try
        If dt.Rows.Count > 0 Then
            If dt.Rows(0)("IsExists") <> "0" Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    

    随后在附件下载的函数进行预先判断即可处理该漏洞

    If ExistAttFile(FileID.ToString, sPath) Then
        Response.Write("文件可以下载!")
    Else
        Response.Write("文件不符合下载要求!")
    End If
    

    二、照片下载漏洞处理

    原因:

    某客户报网络安全漏洞,是系统自身渗透结果,通过ResID参数的遍历可以获取各人员头像

    漏洞危害:

    中危

    修复建议:

    禁止越权获取他人头像

    分析:

    该头像是外网使用的,但是内网也会用到这部分页面,如果禁止越权获取他人头像的话,很容易把管理员查看别人头像的功能也去掉了,如果再加个参数区分管理员什么的也比较麻烦,所以从效率的角度上提出解决方案为加密ResID参数且加入对于FileSize加密参数,在获取头像的时候才进行解密,在已经加密的基础上通过暴力破解获取其他人的加密后ResID和FileSize参数的概率是比较低的

    Private Sub BindPic()
        Dim dt As New DataTable
        dt = GetPhoto(resID)
        Dim FileSize As String = "default"
        If dt.Rows.Count > 0 Then
            FileSize = dt.Rows(0)("FileSize").ToString
        End If
        imgMbPhoto.Src = String.Format("../**/**.**?**=***&ResID={0}&FileSize={1}", Code.En(resID) + "CodeEn", Code.En(FileSize))
    End Sub
    

    下面是解密过程,在加载图片的时候对参数进行解密即可

    Dim ResID As Integer
    Dim sFileSize As String = QueryField.GetValue("FileSize", "0")
    Try
        Dim sResID As String = QueryField.GetValue("ResID", "0")
        If sResID <> "0" And Microsoft.VisualBasic.Right(sResID, 6) = "CodeEn" Then
            sResID = Microsoft.VisualBasic.Left(sResID, Len(sResID) - 6)
        End If
        sResID = IIf(String.IsNullOrEmpty(Code.De(sResID)), "0", Code.De(sResID))
        sFileSize = IIf(String.IsNullOrEmpty(Code.De(sFileSize)), "0", Code.De(sFileSize))
        ResID = Convert.ToInt32(sResID)
    Catch ex As Exception
        ResID = 0
    End Try
    //加入FileSize验证
    Dim dtSize As New DataTable
    dtSize = GetPhoto(ResID)
    If dtSize.Rows.Count > 0 AndAlso dtSize.Rows(0)("FileSize").ToString <> sFileSize Then
        ResID = 0
    End If
    //FileSize验证结束,下面是处理下载的代码体
    

    为了安全起见把文中用到的部分代码和地址名称隐匿了,不影响理解

    相关文章

      网友评论

          本文标题:ASP.NET-漏洞处理-文件下载

          本文链接:https://www.haomeiwen.com/subject/ggbwuhtx.html