SQL指令植入式攻击的危害及其防范措施

资讯 驱动中国 若水 3,366 次阅读 0 条评论
分享 Q

        什么是SQL 指令植入式攻击?

        在设计或者维护Web网站时,你也许担心它们会受到某些卑鄙用户的恶意攻击。的确,如今的Web网站开发者们针对其站点所在操作系统平台或Web 服务器的安全性而展开的讨论实在太多了。不错,IIS 服务器的安全漏洞可能招致恶意攻击;但你的安全检查清单不应该仅仅有 IIS 安全性这一条。有些代码,它们通常是专门为数据驱动(data-driven) 的 Web 网站而设计的,实际上往往同其它IIS漏洞一样存在严重的安全隐患。这些潜伏于代码中的安全隐患就有可能被称为“SQL指令植入式攻击” (SQL injection) 的手段所利用而导致服务器受到攻击。

 

SQL指令植入式攻击技术使得攻击者能够利用Web应用程序中某些疏于防范的输入机会动态生成特殊的 SQL指令语句。举一个常见的例子:

 

某Web网站采用表单来收集访问者的用户名和密码以确认他有足够权限访问某些保密信息,然后该表单被发送到 Web 服务器进行处理。接下来,服务器端的ASP 脚本根据表单提供的信息生成 SQL 指令语句提交到SQL服务器,并通过分析SQL服务器的返回结果来判断该用户名/密码组合是否有效。

 

为了实现这样的功能,Web 程序员可能会设计两个页面:一个 HTML 页面 (Login.htm) 用于登录,另一个ASP 页面(ExecLogin.asp) 用于验证用户权限(即向数据库查询用户名/密码组合是否存在)。具体代码可能象这样:

 

Login.htm (HTML 页面)

 

代码:<form action="ExecLogin.asp" method="post"> Username: 

<input type="text" name="txtUsername"><br> Password: 

<input type="password" name="txtPassword"><br> 

<input type="submit"> </form> 


ExecLogin.asp (ASP 页面)  代码:<% Dim p_strUsername, 

p_strPassword, objRS, strSQL p_strUsername = Request.Form("txtUsername") 

p_strPassword = Request.Form("txtPassword") 

strSQL = "SELECT * FROM tblUsers " & _ "WHERE 

Username=" & p_strUsername & _ " and Password=" & 

p_strPassword & "" Set objRS = Server.CreateObject

("ADODB.Recordset") objRS.Open strSQL, 

"DSN=..." If (objRS.EOF) Then Response.Write "Invalid 

login." Else Response.Write "You are logged in as " 

& objRS("Username") End If Set objRS = Nothing %>
什么是SQL 指令植入式攻击?

 

在设计或者维护Web网站时,你也许担心它们会受到某些卑鄙用户的恶意攻击。的确,如今的Web网站开发者们针对其站点所在操作系统平台或Web 服务器的安全性而展开的讨论实在太多了。不错,IIS 服务器的安全漏洞可能招致恶意攻击;但你的安全检查清单不应该仅仅有 IIS 安全性这一条。有些代码,它们通常是专门为数据驱动(data-driven) 的 Web 网站而设计的,实际上往往同其它IIS漏洞一样存在严重的安全隐患。这些潜伏于代码中的安全隐患就有可能被称为“SQL指令植入式攻击” (SQL injection) 的手段所利用而导致服务器受到攻击。

 

SQL指令植入式攻击技术使得攻击者能够利用Web应用程序中某些疏于防范的输入机会动态生成特殊的 SQL指令语句。举一个常见的例子:

 

某Web网站采用表单来收集访问者的用户名和密码以确认他有足够权限访问某些保密信息,然后该表单被发送到 Web 服务器进行处理。接下来,服务器端的ASP 脚本根据表单提供的信息生成 SQL 指令语句提交到SQL服务器,并通过分析SQL服务器的返回结果来判断该用户名/密码组合是否有效。

 

为了实现这样的功能,Web 程序员可能会设计两个页面:一个 HTML 页面 (Login.htm) 用于登录,另一个ASP 页面(ExecLogin.asp) 用于验证用户权限(即向数据库查询用户名/密码组合是否存在)。具体代码可能象这样:

 

Login.htm (HTML 页面)

 

代码:<form action="ExecLogin.asp" method="post"> Username: 

<input type="text" name="txtUsername"><br> Password: 

<input type="password" name="txtPassword"><br> 

<input type="submit"> </form> 


ExecLogin.asp (ASP 页面)  代码:<% Dim p_strUsername, 

p_strPassword, objRS, strSQL p_strUsername = Request.Form("txtUsername") 

p_strPassword = Request.Form("txtPassword") 

strSQL = "SELECT * FROM tblUsers " & _ "WHERE 

Username=" & p_strUsername & _ " and Password=" & 

p_strPassword & "" Set objRS = Server.CreateObject

("ADODB.Recordset") objRS.Open strSQL, 

"DSN=..." If (objRS.EOF) Then Response.Write "Invalid 

login." Else Response.Write "You are logged in as " 

& objRS("Username") End If Set objRS = Nothing %>
#p#分页标题#e# 

SQL指令植入式攻击的危害

 

SQL 指令植入式攻击可能引起的危害取决于该网站的软件环境和配置。当 Web 服务器以操作员(dbo)的身份访问数据库时,利用SQL 指令植入式攻击就可能删除所有表格、创建新表格,等等。当服务器以超级用户 (sa) 的身份访问数据库时,利用SQL 指令植入式攻击就可能控制整个SQL服务器;在某些配置下攻击者甚至可以自行创建用户帐号以完全操纵数据库所在的Windows 服务器。

 

SQL指令植入式攻击

 

杜绝SQL 指令植入式攻击的第一步就是采用各种安全手段监控来自 ASP request 对象 (Request 、 Request.QueryString 、 Request.Form 、 Request.Cookies 和 Request.ServerVariables) 的用户输入,以确保 SQL 指令的可靠性。具体的安全手段根据你的 DBMS 而异,下面给出的都是基于 MS SQL Server的例子。

 

在前述登录页面的例子中,脚本期望得到的两个输入变量 (txtUserName 和 txtPassword)均为字符串类型。无论用户在哪个参数中插入单引号,他都可能让数据库执行单引号中的 SQL 指令。为了杜绝此类SQL 指令植入式攻击,我们可以借助 Replace 函数剔除单引号,比如:

 

代码:p_strUsername = Replace(Request.Form("txtUsername"), "", "") 

p_strPassword = Replace(Request.Form("txtPassword"), "", "")

 

 

 

 

在第二个例子中,脚本期望的输入变量是长整型变量 (ID) 。用户可以通过在 ID 参数中插入特殊字符来运行不安全的 SQL 指令。为了为了杜绝此类SQL 指令植入式攻击,我们只需要借助 CLng 函数限制 ID 值为长整型变量,比如: 代码:p_lngID = CLng(Request("ID"))

 

当用户试图在 ID 中包含特殊字符时,CLng 就会产生一个错误。

 

为了进一步减少SQL 指令植入式攻击的危胁,请务必清除客户端错误信息文本中的所有技术资料。某些错误信息往往泄露了技术细节,从而让攻击者可以看出服务器的安全漏洞所在。这里指的错误信息不但包括应用程序生成的消息框,还包括来自 IIS 的出错提示。为此,你可以禁止由 IIS 发送的详细错误信息,而改用自定义的出错页面。

 

最后,为了减轻SQL 指令植入式攻击的危害,请限制 Web 应用程序所用的数据库访问帐号权限。一般来说,应用程序没有必要以 dbo 或者 sa 的身份访问数据库。记住,给它的权限越少,你的网站越安全!你还可以考虑分别给每个需要访问数据库的对象分配只拥有必需权限的帐号,以分散安全漏洞。例如:同是前端用户界面,当用于公共场所时就比用于具有本地内容管理机制的平台时更加需要严格限制数据库访问权限。

版权声明:本文由驱动中国整理发布,转载需注明出处与原文链接。如有疑问请联系 editor@qudong.com
本文价值 成为第一个评分的人
登录后为本文打分
网友评论0 条评论
正在回复 的评论取消
评论加载中…
🔐

登录后参与互动

评论、点赞均可赚积分
连续签到、邀请好友也有奖励 🎁

电脑端: 微信扫码登录 微信内: 一键登录

微信扫一扫

打开微信「扫一扫」,分享本文到朋友圈或好友