作者: 风清扬 出处: E代V4
近段时间以来的网络攻击似乎多了起来,很多站点无故被黑甚至换掉首页。绝大多数站点被攻击的原因大都是由于站点程序上的漏洞,由攻击者得到WebShell后进而提升权限得到服务器主机权限。然而得到WebShell的途径也就集中到SQL Injection的攻击手法上。什么是SQL 注入攻击呢?来自官方的诠释:当应用程序使用输入内容来构造动态 SQL 语句以访问数据库时,会发生 SQL 注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生 SQL 注入攻击。SQL 注入可能导致攻击者能够使用应用程序登录在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。换句话说:SQL 注入攻击利用易受攻击的数据访问代码,并允许攻击者在数据库中执行任意命令。如果应用程序使用数据库中不受限制的帐户,由于攻击者可以更自由地执行查询和命令,因此受到的威胁会更大。值得注意的是,传统的安全措施(如使用 SSL 和 IPSec)不能防止 SQL 注入攻击。
使数据访问代码容易受到 SQL 注入攻击的常见漏洞包括:本文转载出处E代时光E3i5.com
· 弱输入验证
· 在不使用类型安全的参数时动态构造 SQL 语句
· 使用特权过高的数据库登录
要应对 SQL 注入攻击,请务必注意:
· 限制和净化输入数据
· 使用类型安全的 SQL 参数进行数据访问。这些参数可以与存储过程一起使用,也可以是动态构造的 SQL 命令字符串。参数执行类型和长度检查,并同时确保注入数据库中的代码被视为文本数据(而非可执行语句)本文转载出处E代时光E3i5.com
· 使用在数据库中具有有限权限的帐户。理想情况下,只应向数据库中的选定存储过程授予执行权限,且不提供直接的表格访问权限
· 验证输入内容的类型、长度、格式和范围。如果您不希望获得数值,则不要接受它们。应该考虑输入内容来自何处。如果它来自受信任源,而且您知道已针对该来源执行过彻底的输入验证,则可以选择在数据访问代码中忽略数据验证。如果数据来自不受信任源或者用于深层防御,则数据访问方法和组件应该验证输入。
综上所述。
如何很好的预防SQL Injection攻击就成了现在安全防护的一个重点:本文转载出处E代时光E3i5.com
由于ASP的易学性和普遍性,很多站点都选择了使用ASP语言来构建自己的Web站点。ASP语言为脚本级编程语言,是以VBScript或JAVAScript。更多的站点选择了VBScript脚本作为编写的基础。然而很不幸的一点是VBScript对异常的捕捉(Debug)和数据类型的声明要求都相对JAVAScript要宽松得很多,没有强制要求,这样带来了方便也带来的隐患。(由于一些程序员的习惯,在使用VBScript编写ASP程序时常常忽略了对异常的捕捉(Debug)和数据类型的声明)所以在防止WEB注入攻击的方面就显得"心有余,而力不足"。回到我们的话题:谈起SQL Injection,我们首先想到的是寻找注入点。很多情况下Web方式的注入都是以ASP request 对象 为主。
quote: 例(1):http://target/index.asp?id=10
杜绝SQL 注入式攻击的第一步就是采用各种安全手段监控来自 ASP request 对象 (Request、Request.QueryString、Request.Form、Request.Cookies和 Request.ServerVariables) 的用户输入,以确保 SQL 指令的可靠性。像其他一些来自 ASP request 对象 (Reques、Request.QueryString、Request.Form、Request.Cookies和 Request.ServerVariables) 的用户输入的攻击方法的方法,大致都集中在脚本期望的输入变量是数字变量 (ID) 上(如例1),当然我们不能只看数字变量:本文转载出处E代时光E3i5.com
quote: 例(2):http://target/index.asp?username=风清扬
如例(2)中所引用的变量是以字符串变量传递。
通过URL传递变量的方式大概就以以上两种方式传递。第一,为数字变量;第二,为字符串变量。SQL Injection漏洞的出现,主要原因在于程序员的疏忽和大意,未采取过滤或是过滤不严密都会留给攻击者攻击的途径。下面就具体的介绍一下如何防范:
· 主动防护本文转载出处E代时光E3i5.com
何为主动防护?主动防护是指并非去对非法字符串进行过滤,而是主动的给出字符串输入范围来防止SQL Injection的攻击。很多站点的程序上都是以对来自 ASP request 对象的过滤上入手,仅仅被动的对一些已知的攻击字符进行过滤。比如以下程序:程序块(1)
quote: function HTMLEncode(Str)
Str=replace(Str,";",";")
Str=server.htmlencode(Str)
Str=replace(Str,"'","'")
Str=replace(Str,"--","--")
Str=replace(Str,"\","\")
Str=replace(Str,vbCrlf,"
")
HTMLEncode=Str
end function
以上程序块转自某论坛程序,其过滤了分号,<,>,单引号,--,\,&等特殊字符以及对软回车的转换。试想一下,如果以上的过滤有不严密的地方,那就是功亏于溃了。如程序块(1)对形如"../"的字符串没有过滤,在一些单表填写中可能会造成一些不必要的麻烦和隐患。如果我们采取主动防御的办法,以限制输入字符集为主,使用效率更高的正则表达式,如[0-9a-zA-Z]:程序块(2)
quote: 汉字的正则式:/[^\x00-\xff]/g
Email的正则式:/^[\w.-]+@([0-9a-z][\w-]+\.)+[a-z]{2,3}$/I
由数字、26个英文字母或者下划线组成的字符串:^\w+$
正确的URL:^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$
正整数:^[0-9]*[1-9][0-9]*$
全数字格式:/[^\d]/g
应用:
Function CheckExp(patrn, strng)
Dim regEx, Match
Set regEx = New RegExp
regEx.Pattern = patrn
regEx.IgnoreCase = true
regEx.Global = True
Matches = regEx.test(strng)
CheckExp = matches
End Function
例子:
如果str为由数字、26个英文字母或者下划线组成的字符串,则返回True,否则返回False。
使用主动的限制输入的方式来限制字符的输入类型将对危险字符的过滤的效率上有很大的提高,相对的安全性也大大提高了。仅仅过滤非法的字符,HU~谁知道究竟哪些字符在哪种情况下属于非法字符呢?所以还是要主动,积极的去做过滤工作。补充一下,我们所提倡的限制输入字符集,而并非不让大家使用字符限制,在特定的条件下,过滤字符也会比限制输入范围要好得多。大家要学会灵活运用。
· 数据库的查询方式本文转载出处E代时光E3i5.com
发现有很多站点进行数据库查询的时候,还是使用rs.e

















