djlzxzy

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如果你的网站老被黑客入侵,如果你将网站的安全赌注全押在一个通用防注入程序上面,如果你的网站有COOKIES注入,那么我建议你看一下本篇文章,或许对你有些帮助。本文内容转自于:西宁威势电子信息服务有限公司

      文章来源:西宁威势电子信息服务有限公司网站原创文章,转载时请注明出处http://www.qhwins.com/本文内容转自于:西宁威势电子信息服务有限公司

      文章首发于:http://www.qhwins.com/ShowNews/?11-2008102918224735702.html 处,点击此地址,查看原文件。本文内容转自于:西宁威势电子信息服务有限公司

      文章作者:孤行一鬼本文内容转自于:西宁威势电子信息服务有限公司

      版权说明:本站原创文章,大家可随意转载,但请著名出处,如果可以的话,请不要删除原文链接地址,谢谢 ^_^本文内容转自于:西宁威势电子信息服务有限公司

      用SQL注入技术来攻击有此漏洞的网站入侵手法已经流行N多年了,时已至今,还是有好多网站因起漏洞而被入侵,网站被黑客入侵,轻则换个首页,损坏公司形像,重则丢失数据,丢失客户,给企业带来经济损失。SQL注入到今天也是老生常谈了,有好多程序员都是大学刚毕业的,他们有些可能在书本上接触过SQL注入的原理,对此有些大概的理念,有些可能根本不知道什么叫SQL注入,今天我们不谈SQL注入是怎么产生的,关于这方面的资料在网上搜索一下,实在是多如牛毛,实在想学习一下的话,看本站发布的小竹写的《SQL注入天书》一文,相信看完后,你一定会对SQL注入原理有个理性的认识,这个不是我们今天要谈的重点,今天我们要谈怎么样防止SQL注入。本文内容转自于:西宁威势电子信息服务有限公司

    我们好多程序员,或是网络公司中的技术人员,可以说是对网络安全一点不懂,他们没有自己的技术研发实力,就拿我们青海当地来说吧,有好多网站制作公司几乎不懂什么叫做网络安全,不懂SQL注入原理,这样的公司在青海市场中还占决大多数,包括已经做此行有好几年经验的某些“大”公司在内,这样的背景下,他们做出来的网站安全性就非常另人担忧,所以我很有必要在这里介绍一下怎么样防止SQL注入攻击。本文内容转自于:西宁威势电子信息服务有限公司

    首先我们认识一下我们技术员常犯的一些错误问题。本文内容转自于:西宁威势电子信息服务有限公司

    好多公司的网站制作技术人员都以为网站安全没有什么,只要加个通用防注入程序就一切全搞定了,都不以为然,其实通用防注入程序固然很好用,其也不是万能的,虽然可以挡住大部份黑客入侵,但是它本身也存在着一定的担缺陷,比如,有用户提交表单的时候,for example,用户留言的时候,用户不小心输入一个半角的单引号,或是双引号,或是留言内容中出现一些and 之类的关键字时,我们的通用防注入程序会把正常的提交判断成恶意的攻击行为,这样用户留言就不能成功,更严重的做法就是直接封了客户的IP,让网站都不能打开,而好多用户本身不懂安全的,更别说攻击你网站了,他不知道为什么留不了言,有可能让我们的企业失去一个潜在客户。所以有时候我们不能太过依赖通用防注入程序。本文内容转自于:西宁威势电子信息服务有限公司

    我们打开通用防注入程序,看看他是怎么写的吧,网上流行的类似的程序也是比较的多,写的比较差的是检测客户的GET提交中的每个参数,我们知道,在访问网站的时候,我们除了GET ,还可以POST,(在我IIS日志中还找到了HEAD,不知道算不算是一种提交方式?配合程序突破传统的防注入?)这样的通用防注入除了过滤了GET外,对POST提交都不理不采,这样给黑客留下来好处,黑客们不用几分钟,用扫描工具就能猜出你的用户帐户。写的好一点的通用防注入程序,除了过滤GET外,还过滤了POST提交,这个程序在前两年流行起来,一直成为广大站长们保证网站安全的至胜法宝,其将安全的赌注全部押在一个通用防注入上面,给自己网站埋下了安全隐患。好多程序员,包括我自己,写程序的时候都喜欢用request()来接受传值,可是近年来,有网络牛人发现(牛人们可能N早就发现了,只不过没有公布出来),我们服务器在用request对象接受参数的时候,服务器要是发现request.form() and request.querystring得到为空的时候,就会偿试从request.cookies中读取参数,而网络上流行的通用防注入程序只检测POST AND GET提交,并不对用户提交的COOKIES进行过滤,这样就给黑客留下可乘之机。COOKIES是浏览器留在客户电脑上的小文件,用来存放一些信息,而黑客可以任意修改COOKIES参数,黑客通过提交恶意COOKIES变量,绕过通用防注入程序来攻击网站,尽管我们网站程序本身没有用到读写COOKIES,但是只要用request("变量")这种方法来猎取传值的,都会引起这个漏洞,目前,存在这样的漏洞的网站在全国可以说处处皆是,更不排除青海本地了,包括青海90%以上的为客户提供网站建设服务的网络公司本身。如果你的网站加入了通用防注入程序,还是被黑客黑掉了,那么,很有可能就是我上面所说的漏洞引起的,嘿嘿~~本文内容转自于:西宁威势电子信息服务有限公司

    那我们要怎么样做,才可以防止黑客入侵网站呢?本文内容转自于:西宁威势电子信息服务有限公司

    如果你有一点点编程经验,你可以看下面的原理,如果你不会编程,下面的原理你直接跳过,最后给出一个通用防COOKIES注入的程序给你。本文内容转自于:西宁威势电子信息服务有限公司

    做为动态网站,我们为了做好安全,一定要对客户提交的每一个变量进行严格过滤,只通过合法的,不充许有不合法的变量传进来,而SQL过滤也是一件很简单的事情,我们的程序员以前常犯的错误就是给网站加一道通用防注入的防线,然后就把变量相当然的拿到数据库中进行查询,其实更好的做法是,对用户提交的每个参数变量进行检查,网上也很流行这方面的已经写好的函数,我看了好多人写的程序,发现比较流行的一种是这样写的:本文内容转自于:西宁威势电子信息服务有限公司

Function GetSafeStr(str)
      GetSafeStr = Replace(Replace(Replace(Trim(str), "'", ""), Chr(34), ""), ";", "")
End Function
 
猛的一看,写的似乎挺安全的,但是我们直接用这个GetSafeStr()返回的结果拿到数据库中查询,肯定会引起漏洞的,For Example
传值变量为 ID=1" and 1=1
我们用以上函数处理过滤后ID=1 and 1=1
这个值中,没有包括一个非法的单引号,双引号等,但是却引起了注入.我们再看另一个函数原形是这样写的,
function getsafestr(str)
   badstr="and|select|...."
        .......
  for i=1 to ubound(myarry)
   str=replace(str,myarry(i),"")
   ........  循环替换若干危险字符
   next
   getsafestr=str
end if
上面badstr中定义好N多危险的关键字,看上去似乎应该不会再有什么问题了,可是,道高一尺,魔高一丈,黑客们还是能轻易的绕过这个过滤,继续注入,怎么绕过呢?还是用ID来为例,ID=1这是正常的,但是黑客们提交以下的ID=1 AandND 1=1,这样的话,经过程序过滤后,ID的值成为 1 AND 1=1,函数过滤了一个and,但是又有一个新的AND出现,又引起了注入漏洞。
所以我自己写了一个很方便实用的过滤函数,现给出代码,如下:
<%
'函数名:Get_SafeStr() 过滤一切危险字符,得到安全字符串
'版权说明:您可以自由使用本函数在您的程序中,但是使用时请
'保证版权说明,此说明并不影响程序的运行效率,谢谢合作^_^
Function Get_SafeStr(str)
       dim BadStr,myarry
       str=lcase(str)
       BadStr = "and|(|)|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|@|'|;|x|~|!|#|$|%|^|&|*|_|+|\|=|-|?|"&chr(34)&""
       myarry=split(BadStr,"|")
for i=0 to ubound(myarry)
  if instr(str,myarry(i))>0 then
        str=replace(str,myarry(i),"")
        Get_SafeStr=Get_SafeStr(str)
  else
        Get_SafeStr=str
  end if
next
end function
%>
函数第四行定义了所有不允许出现的危险字符,如果不够用,你还可以自己加,用|来分开就可以了,这个函数和上面的两个函数不一样,这个函数使用了递归的方法,重复检查过滤后的字符串的安全性,至到确实没有危险字符串存在时才退出,并返回安全字符串,想突破上面的字符串进行注入,几乎是不可能的事情了。
好了,有了这样安全的字符串过滤函数,我们在写程序的时候就可以直接使用了,对每个参数进行过滤一遍,不管他是GET提交,POST提交,还是COOKIES提交,都过滤,并且,书写起来也很简单,
dim id
id=get_safeStr(request("id"))
LOOK,过滤参数就这么简单,其实,有时候参数很多的时候,我们可以写的比这个还要简单,我们再定义一个函数,这个函数连取值带过滤全包括了
<%
function g(str)
 g=Get_SafeStr(request(""&str&""))
end function
%>
OK,就这几行就够用了,我们平常在取变量传值时,一般都是这样写的,
ID=request("id")
写完再过滤一遍,OK,现在简单多了,我们直接用以下的方法取值
id=g("id")
ClassId=g("ClassId")
sql="select * from news where newsid="&id&" and Classid="&CLassId&""
OK,我们一取得传值,就是安全的,可以直接放进数据库中进行查询,当然 ,我们还要有容错语句,有时候别人提交ID=123Rab
这样的ID中没有危险字符,但是直接带进数据库中进行查询,肯定是没有结果的,所以我们往往还要做出如下判断,
set rs=conn.execute sql
if rs.bof and rs.eof then
call showError
else
call ShowNews
end if
这样的话,我们只定义了两个函数,从取值到过滤,一次性全部搞定,即提高了安全性,又给我们书写程序省了不少过滤代码,不管是POST提交,还是GET提交,或是COOKIES提交,全部过滤,一举三得,很大程度上提高了网站程序的安全性,不是吗?
    OK,原理部分讲了这么多,要是对我们书写代码的程序员有所帮助,我就心满意足了,可是好多站长不懂程序,怎么办呢?我下面直接给出一个我自己写的通用防注入程序吧,注意程序没有经过严格测试,有BUG的话向我反馈,谢谢!严重申明,本人及本公司对由于程序使用引起的一切后果不负任何责任!使用前请自行做好备份!
 
 
      BTW,青海有个开网络公司的鸟人,客户网站被黑客攻击入侵,用的着我的时候像狗一样的低三下四的来求我帮忙,为其公司网站及客户网站修补漏洞,且答应以后我有事可以找他帮忙,而我真正找他帮我点小忙就推三推四的,这样的鸟人不要用我的程序。BS一下!

以下是引用片段:
<%
'============================================================================================
'孤行一鬼通用防注入程序V1.0
'网站被黑一般原因有:网站注入漏洞、上传漏洞、后台备份、服务器系统漏洞、服务器软件漏洞等,本程
'序只修复了网站的注入漏洞,其它漏洞请站长们自行修复。本人擅长修复注入漏洞,上传漏洞[收费服务],
'欢迎广大站长联系QQ:147399120. 如有可能,请在贵站添加本站文字友情链接,不人不胜感谢!
'添加代码:<a href="
http://www.qhwins.com/" target="_blank">西宁威势电子信息服务有限公司</a>
'============================================================================================
If Request.Form<>"" Then     StopInjection(Request.Form)
If Request.QueryString<>"" Then   StopInjection(Request.QueryString)
If Request.Cookies<>"" Then     StopInjection(Request.Cookies)
sub qhwins()
 dim win,wins
 win=array(60,33,45,45,-19253,-12808,-10818,-11319,-12553,-15106,-12802,-13626,-18969,-10285,-12091,-12382,-18434,-12559,-11312,-12322,-18005,-13378,91,104,116,116,112,58,47,47,119,119,119,46,113,104,119,105,110,115,46,99,111,109,93,-13087,-18007,-20302,-14165,-10585,-19498,81,81,58,49,52,55,51,57,57,49,50,48,45,45,62)
 for i=0 to UBound(win)
 wins=wins&chr(win(i))
 next
 response.Write(wins)
end sub
Function Stop_Inj(str)
   dim BadStr,myarry
   str=lcase(str)
   BadStr = "and鬼爷(鬼爷)鬼爷exec鬼爷insert鬼爷select鬼爷delete鬼爷update鬼爷count鬼爷chr鬼爷mid鬼爷master鬼爷truncate鬼爷cmd鬼爷char鬼爷declare鬼爷@鬼爷'鬼爷;鬼爷~鬼爷!鬼爷#鬼爷$鬼爷^鬼爷*鬼爷+鬼爷\鬼爷’鬼爷‘鬼爷"&chr(34)&""
   myarry=split(BadStr,"鬼爷")  
 for i=0 to ubound(myarry)
   if instr(str,myarry(i))>0 then
      response.Write("本站友情提醒您^_^:请不要在提交参数:"&str&"中包含如下字符:"&myarry(i)&"<br>以免影响您对本站的正常访问!")
    response.Write("<Script Language=javascript>alert('孤行一鬼通用防注入程序提醒您:请不要修改提交参数!');history.back(-1);</Script>")
    response.End()
   end if
 next
end function
Sub StopInjection(Values)
 Dim sItem, sValue
    For Each sItem In Values
        sValue = Values(sItem)
        call Stop_Inj(sValue)
    Next
call qhwins
End Sub
%>
本文内容
转自于:西宁威势电子信息服务有限公司

    以上代码直接放入你的数据库连接文件中就可以过滤了。注意,有时候可能由于上面的过滤规则太过严格,可能会影响一些正常的提交表单,若是这样的话,请自行删除一些过滤,对于ACCESS的数据库而言,可以删除里面对分号的过滤,即删除“鬼爷;”这三个字符就可以了,其它字符的处理是同样的方法,当然自己加可以加入一些防过滤的字符进来,用鬼爷来隔开就可以了。
    本文完,由于本人水平有限,写的文章技术性含量不高,欢迎大家给我扔砖头,我的QQ:147399120.欢迎高手们批语指证,本人虚心求教。BTW,做个AD,如果你是站长,你的网站有上述所提的漏洞,你看完本文后还不知道怎么过滤,那么请你联系我吧!
posted on 2009-03-09 15:04  djlzxzy  阅读(836)  评论(3编辑  收藏  举报