申明。文章仅代表个人观点,与所在公司无任何联系。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1. 概述
网页挂马这个话题想来大家并不陌生。为什么有这么多的网页上存在着木马去攻击普通用户?不可否认,相当一部分网页原本就是恶意的:网页的作者故意在上面放上木马,然后通过各种手段引诱用户去浏览。但是绝大多数被挂马的网页原本是正常的网页,例如普通的教育网站,购物网站等等,只是网页被攻击者恶意修改后插入了木马代码。
那么,攻击者是如何能够恶意修改一个正常网页的呢? 换句话说,一个网站是如何被“黑”的?一个最常见的攻击方法是SQL注入(SQL Injection)攻击。事实上,就在今年的五月份,爆发了一次大规模的网页攻击活动【1】。据估计,约有12万个网页被恶意修改插入木马代码,而攻击者采用的手段就是SQL注入攻击。
那么,什么是SQL注入攻击?攻击者是如何利用SQL注入攻击篡改网页的?Web开发人员又应该如何防范SQL攻击?这就是我们这篇文章要阐述的问题。
2. SQL注入攻击
我们从一个简单的例子【2】开始。下面这段代码用来构造SQL查询命令。
var strUserAccount;
strUserAccount = Request.form ("UserAccount");
var sqlQueryString = "select * from Orders where UserAccount = '" + strUserAccount + "'";
//执行SQL Query …
这段代码很简单:给出UserAccount,查询其对应的订单信息。
例如,如果输入UserAccount值为100,那么构造的查询命令就是:
SELECT * FROM Orders WHERE UserAccount = '100'
从功能上说这段代码非常正确,完全没有任何问题。但是开发人员往往忽视安全方面的考虑:如果用户(攻击者)提供的输入数据是恶意的, 程序的表现行为是什么?
· 如果是一个不那么友好的攻击者,可能输入UserAccount值为100' or 1=1 --,构造的查询命令就是:
SELECT * FROM Orders WHERE UserAccount = '100' or 1=1 --
执行这个查询命令,就会返回所有用户的订单,导致商业机密信息的泄漏。
· 如果是一个非常不友好的攻击者,可能输入UserAccount值为100’; drop table orders --,构造的查询命令就是
SELECT * FROM Orders WHERE UserAccount = '100'; drop table orders --
“;”用来分割SQL语句。“--”表明当前行剩余的内容是注释。这段SQL语句的语法是完全正确的,那么一旦执行,就会先执行正常的查询工作,然后删除订单数据库。后果非常严重吧。但这还不是最糟糕的的情况。
· 如果是一个非常非常不友好的攻击者,可能输入UserAccount值为100’; exec xp_cmdshell(‘fdisk.exe’) --,构造的查询命令就是
SELECT * * FROM Orders WHERE UserAccount = '100';
exec xp_cmdshell(‘fdisk.exe’) --
在权限允许的情况下,这段SQL语句的执行后果,就非常非常严重了。
通过上面的这个例子可以看出,SQL注入攻击的定义是:
· 被攻击系统采用字符串接收用户输入,并构造相应的SQL语句来执行数据库操作。
· 开发人员没有对用户输入字符串的合法性做足够验证。
· 攻击者在该字符串中注入的恶意代码,在数据库系统(如SQL Server)上执行。
3. SQL注入攻击和网页挂马
当WEB应用需要后台数据库支持的时候,系统就存在着SQL注入攻击的风险。
那么,攻击者到底是如何利用SQL注入攻击来达到网站挂马的目的?我们就拿开始提到的今年五月份的攻击举例:
· 攻击者通过自动扫描工具,发现存在SQL注入攻击安全漏洞的网站。
· 攻击者实施SQL注入攻击,将恶意的脚本代码插入到SQL数据库的相应数据中。插入的恶意脚本如:<script src=http://恶意网站/攻击.js>
· 恶意的脚本文件(js)试图利用一系列常用软件的安全漏洞,如微软IE的安全漏洞,Adobe Flash的安全漏洞,Real Player的安全漏洞,还有许多流行的国内软件的安全漏洞,如迅雷下载,暴风影音等等。
这样,一个原本正常的网站就被挂上了恶意代码。当用户浏览该网站的时候,网页的动态构造中往往需要从后台SQL数据库取出相应数据并插入到构造的网页中。在这个过程中,恶意的脚本代码也作为数据的一部分被插入到网页中。
如果普通用户的机器没有及时安装厂商提供的安全补丁,或者攻击者利用的安全漏洞是0-day安全漏洞,没有任何安全补丁的话,用户的机器就会被木马感染。
4. Web开发人员如何防范SQL注入攻击
下面是开发过程中,防范SQL注入攻击的三个建议。
· 验证用户输入
· 使用Stored Procedures和相应的参数传递。
· 数据库访问帐号的最小化权限(Least-Privilege)
4.1验证用户输入
既然SQL注入攻击的原理是通过在用户输入的字符串中插入恶意代码,那么验证来自用户的输入就是防范攻击的自然方案。不过,在设计验证代码时需要注意下面两点。
4.1.1在服务器端验证输入,而不仅仅是在客户端验证。
一个常见的设计误区是检验代码仅仅放在客户端上。Web开发中往往通过运作在客户网页的JavaScript或VBScript检查用户的输入值。如果校验错误的话就直接通知用户错误信息。客户端校验通过后才会向服务器端法出请求。
在客户端进行校验并没有错。但是,如果由于客户端提供了校验,而在服务器一端设计中认为来自客户端的输入是都是经过(客户端)验证的,从而可以直接使用的话,就有问题了。
这是因为,攻击者可以完全不需要客户端程序,而直接向服务器端发出数据提交请求。这种情况下,所有客户端的检查都可以被绕过。所以在服务器端的设计过程中,要总是假设来自用户的输入可以是恶意的,并提供相应的验证措施。
4.1.2验证输入的原则是确认输入的值都是有效字符,而不是试图拒绝输入的值中的无效字符。
初看起来,确认输入的值都是有效字符,和拒绝输入的值中的无效字符,这两个方案的是一回事。但是它们其实在实现上,以及对安全的影响上,有着很大的区别。
下面来举个例子说明。假设需要验证来自用户的UserAccount值是否合法,这里我们可以有两个选择。
选择一,确认UserAccount中的每个字符都是字母和数字。这种设计称为“whitelist”,也就是白名单设计。只有满足白名单条件的值才是合法的。我们可以采用正则表达式RegEx来验证。
using System;
using System.Text.RegularExpressions;
//验证UserAccount是否合法
public bool IsUserAccountValid(string strUserAccount)
{
// 验证是否字符仅仅是有大小写字母及数字构成
// 字符长度在1-20
if ( !Regex.IsMatch(userIDTxt.Text, @"^[a-zA-Z0-9]{1,40}$"))
{
return false;
}else {
return true;
}
}
选择二,确认UserAccount中没有非法字符。这种设计称为“blacklist”,也就是黑名单设计。不在黑名单上的值都是合法的。
黑名单设计的问题是:我们需要拒绝那些危险字符?例如,SQL语法中有下面这些字符需要特殊注意【3】:
特殊字符
|
SQL语句中的含义
|
;
|
查询分隔符
|
'
|
数据分隔符.
|
--
|
注释分隔符.
|
/* ... */
|
注释分隔符.
|
xp_
|
指示扩展的stored procedures,例如 xp_cmdshell.
|
是不是只要检查用户输入中没有这些特殊字符就可以了?很可惜,并不是这么简单。首先,系统设计和实现的不同往往会导致某一种危险的输入值在黑名单上被遗漏。而且,攻击者往往可以通过“改头换面”的办法来绕过黑名单。常见的手段是有采用另一种编码方式,如采用%0x来编码等等。
所以在验证用户输入的开发过程中,强烈推荐采用白名单的设计方式来确认用户的输入是否是有效的。事实上,设计上采用白名单方式来验证用户的输入,不仅适用于防范SQL注入攻击,也是安全软件开发中用以防范其它攻击的有效手段。
4.2使用Stored Procedures和相应的参数传递
首先,并不是采用Stored Procedure和传递参数就能完全防止SQL注入攻击。例如,如果Stored Procedure设计成:
CREATE PROCEDURE dbo.RunQuery
@var ntext
AS
exec sp_executesql @var
GO
这个Stored Procedure在防范SQL注入攻击上完全没有任何作用。然而,合理的设计和使用Stored Procedure及参数类对阻止SQL注入攻击攻击是非常有效的。下面这段代码的功能同样是需要基于UserAccount来查询订单信息,但使用SqlParameterCollection来将UserAccount的值作为参数传递。
using System.Data;
using System.Data.SqlClient;
public void QueryOrder(string strUserAccount)
{
… …
SqlConnection connection = new SqlConnection(connectionString);
DataSet userDataset = new DataSet();
SqlDataAdapter myCommand = new SqlDataAdapter(
"QueryOrderStoredProcedure", connection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
myCommand.SelectCommand.Parameters.Add("@UserAccount", SqlDbType.VarChar, 20);
myCommand.SelectCommand.Parameters["@UserAccount"].Value = strUserAccount;
myCommand.Fill(userDataset);
… …
}
这里,UserAccount的值是作为字符串参数传递给对应的QueryOrderStoredProcedure,而不是简单的插入到构造的SQL查询语句中。参数在传递过程中会被检查类型和长度。如果检验失败的话,SqlParameter类会报告异常,从而有效的防范SQL注入攻击。
4.3数据库访问帐号的最小化权限
最小化权限的设计,同白名单一样,也是安全软件开发中的常用的设计原则。应用到SQL注入攻击环境下,意味着:应用程序用来访问数据库的帐号,所拥有的权限应该最小化。
需要强调的一点是,SQL注入攻击的根源在于Web开发中的不正确的代码。最小化权限的设计并不能替代修复代码本身错误的工作。它只是作为深层防御(Defense In Depth)中的缓解手段,其目的是为了尽可能降低SQL注入攻击的危害性。
例如,如果是通过Windows authentication机制来连接并访问数据库的话,用来访问数据库的Windows的帐号的权限就应该受到限制。一个非管理员权限的帐号,就可以阻止执行Fdisk类似级别的操作。在【4】给出了一个在Microsoft Windows 2003服务器,ASP.NET应用,后台SQLServer情况下,如何最小化ASP.NET应用 运行的Network Service帐号的权限的例子。有兴趣的读者可以参考【4】获取更详细的信息。
5. 总结
SQL注入攻击是最为常见的网站攻击的手段之一。开发人员在Web应用的设计和实现过程中需要意识到SQL注入攻击的危险,并在代码中采用相应的防范措施。
6. 参考文献
【1】 Mass SQL Injection Attack Targets Chinese Web Sites,http://news.yahoo.com/s/pcworld/20080519/tc_pcworld/146048;_ylt=AoZS0SbSq3tH.Cl1uEHJPMeDzdAF
【2】 Writing Secure and Hack Resistant Code Part 2,research.microsoft.com/collaboration/university/europe/events/dotnetcc/version4/Slides/leblanc2.ppt,Microsoft
【3】 SQL Injection, http://msdn.microsoft.com/en-us/library/ms161953.aspx, Microsoft
【4】 How To: Protect From SQL Injection in ASP.NET, http://msdn.microsoft.com/en-us/library/ms998271.aspx#paght000002_step2, Microsoft
分享到:
相关推荐
"Web安全开发:SQL注入攻击和网页挂马" 在Web应用程序中,安全是最重要的考虑因素之一。SQL注入攻击和网页挂马是两种常见的Web安全威胁,了解它们对Web安全的影响至关重要。下面我们将详细介绍SQL注入攻击和网页...
以上示例中,直接使用了`$_POST`变量来拼接SQL语句,这种方式非常容易受到SQL注入攻击。正确的做法应该是使用预处理语句或者对用户输入进行严格的验证和过滤。 #### 二、实战演练 在理解了SQL注入的基本原理之后,...
SQL注入课程 SQL注入课程简介 SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。...因此,需要采取有效的防御措施来防止SQL注入攻击。
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin...
SQL注入(SQL Injection)是一种常见的网络攻击技术,它通过将恶意SQL命令插入到Web表单的输入或页面请求的查询字符串中,欺骗服务器执行非法的数据库查询和更新操作。这种攻击可以用来绕过应用程序的安全验证、获取...
综上所述,预防SQL注入需要系统地从多个方面进行安全防护措施的部署,通过持续评估、加固、过滤威胁及监控安全状态,保障Web应用免受SQL注入攻击。同时,随着网络安全威胁的不断变化和升级,安全技术和策略也需要...
标题中的“sql server数据库中内容被挂马清除工具”指的是针对SQL Server数据库的恶意代码清除软件,这类...在使用前需确保系统环境满足运行要求,同时在使用过程中采取必要的安全措施,以保障数据库的完整性和安全性。
SQL注入是一种常见的网络安全威胁,主要针对使用SQL(结构化查询语言)进行数据存储和检索的Web应用程序。这种攻击方式利用了程序设计中的漏洞,使得恶意用户能够通过输入特定的SQL代码,来操纵数据库,获取未经授权...
SQL注入攻击(SQL Injection)是指通过在Web表单输入或直接在URL中插入恶意SQL语句,从而实现对数据库服务器的攻击,获取、篡改或删除数据库中敏感信息,甚至控制服务器。如果程序员在开发过程中未对用户提交的数据...
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器...
XSS攻击和SQL注入是两种常见的网络安全威胁。XSS攻击指的是恶意用户将恶意脚本代码注入到网页中,当用户浏览该网页时,这些恶意代码得以执行。XSS攻击可以分为反射型、存储型和DOM型三种。反射型XSS攻击通常发生在...
越来越多的网络访问通过Web界面进行操作,Web安全已经成为互联网安全的一个热点基于Web的攻击广为流行,SQL注入、跨站脚本等Web应用层漏洞的存在使得网站沦陷、页面篡改、网页挂马等攻击行为困扰着网站管理者并威胁...
6. **使用Web应用防火墙(WAF)**:WAF可识别并阻止SQL注入攻击。 7. **定期更新和打补丁**:保持所有软件和组件的最新状态,修复已知安全问题。 8. **安全编码训练**:提高开发人员对Web安全的意识,避免编写易受攻击...
4. 使用Web应用防火墙:部署Web应用防火墙(WAF)可以检测和阻止SQL注入攻击。 5. 代码审查:定期进行代码审查,以检查潜在的安全漏洞,并及时进行修补。 在检测SQL注入方面,可以采用手工检测法和工具检测法: ...
Hummock用于检测CC攻击,外部扫描则涉及XSS(跨站脚本)、注入攻击、危险目录以及挂马监控。Apache Log的分析能帮助识别XSS、SQL注入、路径遍历和系统命令等问题。 在SDL流程中,需求分析阶段要关注业务安全,设计...
SQL注入是一种常见的网络安全攻击手法,攻击者通过在Web表单或URL中输入恶意的SQL代码,欺骗服务器执行非预期的数据库操作。由于这些SQL命令是通过正常的HTTP请求发送的,因此攻击通常难以被检测到。 三、SQL注入的...
那么,除了在Web开发的时候注意以外,有什么有效的工具可以对抗SQL注入攻击? 今天,微软和惠普的安全部门合作发布了三个工具,分别是: 微软SQL注入攻击源码扫描器:Microsoft Source Code Analyzer for SQL ...
2008年的X-Force报告显示,Web安全事件的数量急剧增长,不仅网站遭受攻击导致信息泄露,还催生了大量的傀儡机用于DDoS攻击,同时客户端也面临恶意页面和网页挂马等问题。 Web安全评估包括黑盒测试和白盒测试,从...