青海网站建设、网络推广最好的公司--您身边的网站建设专家,马上拿起电话,联系我们:0971-8235355   
青海西宁网站建设、网站制作公司-西宁威势电子信息服务有限公司 首页 |  公司简介 |  网站建设 |  网络推广 |  空间租用 |  域名注册 |  企业邮局 |  网络安全 |  网站编程 |  客服中心 |  联系我们 |  人才招聘
 
西宁威势最新网站制做案例展示
Lastest Project
 
西宁网站建设  
当前位置为:首页 >> 脚本安全 >> 正文  
[原创]孤行一鬼教你怎么样防注入

文章来源: 西宁威势电子信息服务有限公司     发布时间:2008-10-29    浏览次数:11339    tags:SQL防注入 COOKIES注入

如果你的网站老被黑客入侵,如果你将网站的安全赌注全押在一个通用防注入程序上面,如果你的网站有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鬼爷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,如果你是站长,你的网站有上述所提的漏洞,你看完本文后还不知道怎么过滤,那么请你联系我吧!你可以在本站留言,也可以加我QQ,原创文章,首发于西宁威势电子信息服务有限公司网站,欢迎 转载,转载时请注明出处,并保证文章的完整性,谢谢合作。

上一篇:SQL注入天书 - ASP注入漏洞全接触
下一篇:[原创]孤行一鬼的免杀DOWN.VBS下载脚本
评论列表
正在加载评论……
  
评论   
呢  称:
验证码: 若看不清请点击更换!
内  容:
 
 
  在线洽谈咨询:
点击这里,在线洽谈   点击这里,在线洽谈   点击这里,在线洽谈
与我交谈  与我交谈 与我交谈
乘车路线    汇款方式   加盟合作  人才招聘  
公司地址:青海省西宁市西关大街73号(三二四部队招行所四楼)     青ICP备13000578号-1 公安机关备案号:63010402000123    
QQ:147399120    mail:lostlove000@163.com    电话:09718235355 13897410341    WEB-FAX:1183309-7112964    MSN:cmdshell@hotmail.cn 邮编:810000
© Copyright( 2008-2009) QhWins.Com All Rights Reserved    版权所有:西宁威势电子信息服务有限公司 未经书面制授权,请勿随意转载!
业务:青海网站制做青海网站建设青海网页设计西宁网站制做西宁网站建设青海域名注册青海网络推广青海网站推广青海空间租用青海软件开发网站安全网络安全