用于外网的允许匿名登陆的网址是比较容易出现漏洞的网址,总结一下新处理的两个漏洞
一、文件下载漏洞处理
原因:
某客户报网络安全漏洞,是系统自身渗透结果,通过_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验证结束,下面是处理下载的代码体
为了安全起见把文中用到的部分代码和地址名称隐匿了,不影响理解
网友评论