[推荐]风讯4.0一些安全漏洞的分析
热 荐 ★★★★★
风讯4.0一些安全漏洞的分析
前几天在守护天使的blog里面看见一篇文章"驳最近出现的风讯4.0漏洞 " 文章的作者是:sobiny.自己没看过风讯系统的代码.只是见很多人好象很感兴趣自己也想看看..根据作者文章里的提示有漏洞的文件在投票那里.vote文件夹里面文件就几个文件很好找.在Vote_Ajax.asp这个文件找到下面的代码:
VisitIP = request.ServerVariables("HTTP_X_FORWARDED_FOR")
If VisitIP = "" then
VisitIP = request.ServerVariables("REMOTE_ADDR")
End If
Set VS_RS = Conn.Execute("Select top 1 VoteTime from FS_VS_Items_Result where TID = "&TID&" and VoteIp='"&VisitIP&"' order by RID desc")
变量VisitIP没经过任何的处理就放进sql查询里面,只是这个变量不是我们平常提交的那些变量.所以需要抓包-----修改数据库包-------再提交.
自己也看了其他的一些文件,也发现了一些小问题..废话不多说
文件:user/job/job_search_result.asp里面找到下面的代码
Dim Rs,job,workcity,publicdate,condition
job=trim(request.Form("JobName"))
workcity=trim(request.Form("workcity"))
publicdate=trim(request.Form("hd_publicdate"))
if job<>"" then
condition=" And JobName like '"&job&"'"
End if
if workcity<>"" then
condition=condition&" And workcity ='"&workcity&"'"
End if
if publicdate<>"" then
Dim dateCondition
dateCondition=DateValue(Now())-Cint(publicdate)
if G_IS_SQL_DB=0 then
condition=condition&" And publicdate>#"&dateCondition&"#"
Else
condition=condition&" And publicdate>'"&dateCondition&"'"
End if
End if
if G_IS_SQL_DB=0 then
Set Rs=Conn.execute("Select PID,UserNumber,JobName,JobDescription,ResumeLang,WorkCity,PublicDate,EndDate,NeedNum from FS_AP_Job_Public where 1=1 "&condition&" And (EndDate>#"&DateValue(Now())&"# or EndDate=#"&DateValue(Now())&"#)")
else
Set Rs=Conn.execute("Select PID,UserNumber,JobName,JobDescription,ResumeLang,WorkCity,PublicDate,EndDate,NeedNum from FS_AP_Job_Public where 1=1 "&condition&" And (EndDate>'"&DateValue(Now())&"' or EndDate='"&DateValue(Now())&"')")
G_IS_SQL_DB=0为ACCESS数据库,1为SQL数据库.数据库不同构造的注入语句也不同,所以这个地方要注意.
job=trim(request.Form("JobName"))变量job仅仅是用trim涵数去掉两边的空格.对于防止注入是没有什么作用的..
if job<>"" then
condition=" And JobName like '"&job&"'"
End if
把变量传给了condition,但是在后面的代码中没有过滤这个变量就放进数据库的查询 当中了..后面自己想吧...嘿嘿
还有一个地方就是在user/friend.asp文件里面有这样一段代码
if Request("Action") = "del" then
Dim strFriendID
strFriendID = NoSqlHack(Request.QueryString("FriendID"))
If strFriendID = "" or isNumeric(strFriendID)=false then
strShowErr = "<li>错误的参数</li>"
Call ReturnError(strShowErr,"")
Else
User_Conn.execute("Delete From FS_ME_Friends where FriendID="&strFriendID)
strShowErr = "<li>删除成功!</li>"
Response.Redirect("lib/Success.asp?ErrCodes="&Server.URLEncode(strShowErr)&"&ErrorUrl=")
Response.end
End if
End if
变量strFriendID被NoSqlHack涵数处理了在function文件里面找到涵数的实体:
Function NoSqlHack(FS_inputStr)
Dim f_NoSqlHack_AllStr,f_NoSqlHack_Str,f_NoSqlHack_i
f_NoSqlHack_AllStr="*|%|'|;|(|)|and |exec |insert |select |delete |update |count |master |truncate |declare |and |exec |insert |select |delete |update |count |master |truncate |declare |char(|mid(|chr("
f_NoSqlHack_Str = Split(f_NoSqlHack_AllStr,"|")
For f_NoSqlHack_i=LBound(f_NoSqlHack_Str) To Ubound(f_NoSqlHack_Str)
If Instr(LCase(FS_inputStr),f_NoSqlHack_Str(f_NoSqlHack_i))<>0 Then
If f_NoSqlHack_Str(f_NoSqlHack_i)="'" Then f_NoSqlHack_Str(f_NoSqlHack_i)=" \' "
Response.Write "<html><title>警告</title><body bgcolor=""EEEEEE"" leftmargin=""60"" topmargin=""30""><font style=""font-size:16px;font-weight:bolder;color:blue;""><li>您提交的数据有恶意字符</li></font><font style=""font-size:14px;font-weight:bolder;color:red;""><br><li>您的数据已经被记录!</li><br><li>您的IP:"&Request.ServerVariables("Remote_Addr")&"</li><br><li>操作日期:"&Now&"</li></font></body></html><!--Powered by Foosun Inc.,AddTime:"&now&"-->"
Response.End
End if
Next
NoSqlHack = FS_inputStr
End Function
经过NoSqlHack处理的变量是没有搞头了(反正我是没有办法的).但是程序的作者忘记了一点就是没有判断这个好友是谁的好友,就直接根据strFriendID删除了.如果我们提交strFriendID从1到N那么所有人的好友都没删除掉了.....看来是被注入漏洞搞怕了..哈哈却出现了逻辑漏洞...其实还有其他的文件也有注入的漏洞.自己找找吧
文章录入:cainiaowang 责任编辑:cainiaowang