最近“垃圾黑客”活动猖獗,每天都有大量网站的sql server数据库被批量注入代码,导致网站数据混乱或网站无法正常访问,我有几个客户的网站也同样中招了!首先让我们来强烈的鄙视那些非法入侵别人网站,不顾别人感受的“垃圾黑客”们,气愤之余,我们首要解决的还是网站sql数据库的数据恢复及防止sql数据库再次被注入!
我们先来了解一下sql注入的原理,其实如果你稍微懂些程序,会非常容易理解。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,一般是由于程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。知道了原理,防范起来就容易多了,我们需要做的就是要过滤掉那些请求的特殊字符,可以下载SQL通用防注入系统加在链接数据库的文件中!
那如果我们的sql数据库被批量注入代码要如何来清除呢?如果挨个的表去删除,那估计会把你累吐啊!这里可以分享一下批量清除sql数据库被注入的代码的方法:如果是sql server数据库,可以远程链接到数据库,使用查询分析器运行“update 数据库表 set 表的键值 =replace(cast(表的键值 as varchar(8000)),'被注入的代码','')”这段代码就可以了,但是也要挨个表的去清除!
比如:SQL注入c.nuclear3.com/css/c.js的解决办法
直接复制下面的代码保存一个ASP文件
#include到数据库连接文件就OK了
至于已经存在的咋数据库直接运行一下代码替换
update ass set title =replace(cast(title as varchar(8000)),’js代码段’,”)
只能一个字段一个字段的进行替换,没有别的办法
[js.txt]:
<%
'--------定义部份------------------
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|ne
t%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
'----------------------------------
%>
如果有必要用cookie做认证的可以用下面试验下,可以保证躲过这次的自动攻击,但手动攻击不保证能防住,有条
件的还是把cookie认证改成session认证保险点
如果没有COOKIE认证,可以直接用这个,代码不需要修改
代码如下
<%
'--------定义部份------------------
Dim XH_Post,XH_Get,XH_Cookie,XH_In,XH_Inf,XH_Xh
'自定义需要过滤的字串,用 "|" 分隔
XH_In = "'|;|and|exec|insert|select|delete%20from|update|count|*|%|chr|mid|master|truncate|char|declare|drop%20table|from|net%20user|xp_cmdshell|/ad
d|net%20localgroup%20administrators|Asc|char"
'----------------------------------
%>
<%
XH_Inf = split(XH_In,"|")
'--------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_Inf)
If Instr(LCase(Request.Cookies(XH_Cookie)),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 "提交方式:Cookie<br>"
Response.Write "提交参数:"&XH_Cookie&"<br>"
Response.Write "提交数据:"&Request.Cookies(XH_Cookie)
Response.End
End If
Next
Next
End If
'----------------------------------
%>
再说点与程序无关的吧。因为现在各大网站或多或少是用别人的代码拼起来的,所以一旦原程序出现漏
洞,那么这个网站也会跟着受害。在此,所以建议网站管理员不要拿起别人的程序就用,如果你实
在不会写ASP,你总会改数据库的结构吧,实在不会写你总会设IIS让其不报错吧。这里再说两种防
止ASP页面暴出错误信息的方法:
方法1:打开你的IIS管理器(以IIS6.0为例),选择你的网站=》属性页面=》主目录选项卡=》点击
配置按钮=》调试选项卡=》向客户端发送下列文本错误消息
这样,即使入侵者找到了注入点,注入后,得到也只是服务器返回的固定的错误消息。不能得到任
何有价值的错误信息。
方法2:在你的ASP语句中(一般是在最开头的地方),加上一句
On Error Resume Next
(注意,这句必须加在里面,不然IIS可不认。)
这就是著名的容错语句,当ASP语句执行时发生错误,就跳过错误,继续向下执行,而且不会返回错误信息。
(当然写程序的时候就不要加了哦,方便我们自己找错嘛。)
评论