cn.daxia123.cn/cn.js注入的解决方案

来源:互联网 发布:php api接口开发安全 编辑:程序博客网 时间:2024/06/11 19:48

近期网站数据库中被注入了大量cn.daxia123.cn/cn.js的恶意脚本,不解的是我明明在程序做了防注入代码还能被轻易攻击。

经查证发现该挂马将攻击代码用二进制编译成了类似于0x4445434C415245204054205641524348415228323535292C404的代码,防sql注入的代码无法识别,但sql server 会将此方式编译的代码还原为原来的样子这样就绕过了sql防注入代码。由于不是“and|update|script” 之类的防护方式能够解决的,除非网站全部改静态,否则中招的可能性很大。
针对该原理,首先我改进了防sql注入的代码(注意该代码不要用JS来写,否则对于禁掉该脚本的浏览器是无效的),做成avoidin.asp,嵌入每个传参数的ASP页面中进行非法代码的过滤,并将非法注入记录到日志中;然后,在数据库新增、更新前,对Value进行严格检查;最后把网站前台每个页面的数据库访问权限均改为只读,仅在后台维护系统和留言等内容提交中切换为可写权限。

这样改进后,这两个月来网站终于稳定下来,没再接连招到攻击了。

 

avoidin.asp代码如下:

<%
Response.Buffer = True  '缓存页面
'防范get注入
If Request.QueryString <> ""  Then StopInjection(Request.QueryString)
'防范post注入
If Request.Form <> ""  Then StopInjection(Request.Form)
'防范cookies注入
If Request.Cookies <> ""  Then StopInjection(Request.Cookies)

'正则子函数
Function StopInjection(Values)
Dim regEx
Set regEx = New RegExp
    regEx.IgnoreCase = True
    regEx.Global = True
    regEx.Pattern = "'|;|#|([/s/b+()]+([email=select%7Cupdate%7Cinsert%7Cdelete%7Cdeclare%7C@%7Cexec%7Cdbcc%7Calter%7Cdrop%7Ccreate%7Cbackup%7Cif%7Celse%7Cend%7Cand%7Cor%7Cadd%7Cset%7Copen%7Cclose%7Cuse%7Cbegin%7Cretun%7Cas%7Cgo%7Cexists)[/s/b]select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[/s/b[/email]+]*)"
    Dim sItem, sValue
    For Each sItem In Values
        sValue = Values(sItem)
        If regEx.Test(sValue) Then      
   unLawStr=""
   for each x in Request.ServerVariables
     unLawStr = unLawStr & x & ":" & Request.ServerVariables(x) & Chr(13)&Chr(10)
   Next
   
   WriteLog unLawStr

            Response.Write "非法注入!你的行为已被记录!!:<br>"
            response.write Replace(unLawStr,Chr(13),"<br>")      
            Response.End
        End If
    Next
    Set regEx = Nothing
End function

Sub WriteLog(str)
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
        logFile="c:/sqlin.log"
        Set fob = server.CreateObject("Scripting.filesystemObject")       
        Set fle=fob.OpenTextFile(logFile,ForAppending,true)       
        fle.writeLine "注入点:" & Now()
        fle.write str
        fle.writeline
        fle.close
        Set fob=nothing
End Sub
%>

 

原创粉丝点击