English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> 理解SQL注入

 

理解SQL注入

威盾防火墙 2015-02-16

 

Web应用越来越成熟,技术也越来越复杂。它们涵盖了从动态Internet和内部网入口(如电子商务网站和合作企业外部网)到以HTTP方式传递数据的企业应用(如文档管理系统和ERP应用)。这些系统的有效性及其存储、处理数据的敏感性对于主要业务而言都极其关键(而不仅仅是在线电子商务商店)。Web应用及其支持的基础结构和环境使用了多种技术,这些技术可能包含很多在他人代码基础上修改得到的代码。正是这种功能丰富的特性以及便于通过Internet或内部网对信息进行比较、处理、散播的能力,使它们成为流行的攻击目标。此外,随着网络安全技术的不断成熟,通过基于网络的漏洞来攻破信息系统的机会正不断减少,黑客开始将重心转向尝试危害应用上。

SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。凡是构造SQL语句的步骤均存在被潜在攻击的风险,因为SQL的多样性和构造时使用的方法均提供了丰富的编码手段。SQL注入的主要方式是直接将代码插入到参数中,这些参数会被置入SQL命令中加以执行。不太直接的攻击方式是将恶意代码插入到字符串中,之后再将这些字符串保存到数据库的数据表中或将其当作元数据。当将存储的字符串置入动态SQL命令中时,恶意代码就将被执行。如果Web应用未对动态构造的SQL语句所使用的参数进行正确性审查(即便使用了参数化技术),那么攻击者就很可能会修改后台SQL语句的构造。如果攻击者能够修改SQL语句,那么该语句将与应用的用户拥有相同的运行权限。当使用SQL服务器执行与操行系统交互的命令时,该进程将与执行命令的组件(如数据库服务器、应用服务器或Web服务器)拥有相同的权限,这种权限通常级别很高。

为展示该过程,我们回到之前的那个简单的在线零售商店的例子。如果读者有印象的话,当时使用了下面的URL来尝试查看商店中所有价格低于$100的商品:

http://www.victim.com/products.php?val=100

注意:

为了便于展示,本章中的URL示例使用的是GET参数而非POST参数。POST参数操作起来与GET一样容易,但通常要用到其他程序,比如流量管理工具、Web浏览器插件或内联代理程序。

这里我们尝试向输入参数val插入自己的SQL命令。可通过向URL添加字符串'OR '1'='1来实现该目的:

http://www.victim.com/products.php?val=100'OR '1'='1

这次,PHP脚本构造并执行的SQL语句将忽略价格而返回数据库中的所有商品,这是因为我们修改了查询逻辑。添加的语句导致查询中的OR操作符永远返回真(即1永远等于1),从而出现这样的结果。下面是构造并执行的查询语句:

  1. SELECT *  
  2. FROM ProductsTbl  
  3. WHERE Price < '100.00' OR '1'='1'  
  4. ORDER BY ProductDescription; 

注意:

可通过多种方法来利用SQL注入漏洞以便实现各种目的。攻击成功与否通常高度依赖于基础数据库和所攻击的互联系统。有时,完全挖掘一个漏洞需要有大量的技巧和坚强的毅力。

前面的例子展示了攻击者操纵动态创建的SQL语句的过程,该语句产生于未经验证或编码的输入,并能够执行应用开发人员未预见或未曾打算执行的操作。不过,上述示例并未说明这种漏洞的有效性,我们只是利用它查看了数据库中的所有商品。我们本可以使用应用最初提供的功能来合法地实现该目的。但如果该应用可以使用CMS(Content Management System,内容管理系统)进行远程管理,会出现什么情形呢?CMS是一种Web应用,用于为Web站点创建、编辑、管理及发布内容。它并不要求使用者对HTML有深入的了解或者能够进行编码。可使用下面的URL访问CMS应用:

http://www.victim.com/cms/login.php?username=foo&password=bar

在访问该CMS应用的功能之前,需要提供有效的用户名和口令。访问上述URL时会产生如下错误:"Incorrect username or password, please try again"。下面是login.php脚本的代码:

  1. // connect to the database  
  2. $conn = mysql_connect("localhost","username","password");  
  3.  
  4. // dynamically build the sql statement with the input   
  5. $query = "SELECT userid FROM CMSUsers WHERE user = '$_GET["user"]' " .  
  6.            "AND password = '$_GET["password"]'";  
  7.  
  8. // execute the query against the database  
  9. $result = mysql_query($query);  
  10.  
  11. // check to see how many rows were returned from the database  
  12. $rowcount = mysql_num_rows($result);  
  13.  
  14. // if a row is returned then the credentials must be valid, so  
  15. // forward the user to the admin pages   
  16. if ($rowcount !=0) { header("Location: admin.php");}  
  17.  
  18. // if a row is not returned then the credentials must be invalid   
  19. else { die('Incorrect username or password, please try again.')} 

login.php脚本动态地创建了一条SQL语句。如果输入匹配的用户名和口令,它将返回一个记录集。下列代码更加清楚地说明了PHP脚本构造并执行的SQL语句。如果输入的user和password的值与CMSUsers表中存储的值相匹配,那么该查询将返回与该用户对应的userid。

  1. SELECT userid   
  2. FROM CMSUsers   
  3. WHERE user = 'foo' AND password ='bar' 

这段代码的问题在于应用开发人员相信执行脚本时返回的记录数始终是0或1。在前面的SQL注入示例中,我们使用了可利用的漏洞来修改SQL查询的含义以使其始终返回真。如果对CMS应用使用相同的技术,那么将导致程序逻辑失败。向下面的URL添加字符串'OR '1'='1,这次,由PHP脚本构造并执行的SQL语句将返回CMSUsers表中所有用户的userid。新的URL如下所示:

http://www.victim.com/cms/login.php?username=foo&password=bar 'OR '1'='1

我们通过修改查询逻辑,返回了所有的userid。添加的语句导致查询中的OR操作符永远返回真(即1永远等于1),从而出现了这样的结果。下面是构造并执行的查询语句:

  1. SELECT userid   
  2. FROM CMSUsers   
  3. WHERE user = 'foo' AND password = 'password' OR '1'='1'; 

应用逻辑是指要想返回数据库记录,就必须输入正确的验证证书,并在返回记录后转而访问受保护的admin.php脚本。我们通常是作为CMSUsers表中的第一个用户登录的。SQL注入漏洞可以操纵并破坏应用逻辑。

警告:

不要在任何Web应用或系统中使用上述示例,除非已得到应用或系统所有者的许可(最好是书面形式)。在美国,该行为会因违反1986年《计算机欺诈与滥用法》(Computer Fraud and Abuse Act of 1986)(www.cio.energy.gov/documents/ComputerFraud-AbuseAct.pdf)或2001年《美国爱国者法案》(USA PATRIOT ACT of 2001)而遭到起诉。在英国,则会因违反1990年的《计算机滥用法》(Computer Misuse Act of 1990)(www.opsi.gov.uk/acts/acts1990/Ukpga_19900018_en _1)和修订过的2006年的《警察与司法法案》(Police and Justice Act of 2006)(www.opsi.gov.uk/Acts/ acts2006/ukpga_20060048_en_1)而遭到起诉。如果控告并起诉成功,那么你将会面临罚款或漫长的监禁。

著名事例

很多国家的法律并没有要求公司在经历严重的安全破坏时对外透露该信息(这一点与美国不同),所以很难正确且精准地收集到有多少组织曾因SQL注入漏洞而遭受攻击或已受到危害。不过,由恶意攻击者发动的安全破坏和成功攻击是当今新闻媒体中一个喜闻乐见的话题。即便是最小的破坏(可能之前一直被公众所忽视),现在通常也会被大力宣传。

有些公共可用的资源可以帮助理解SQL注入问题的严重性。例如,通用漏洞披露组织  CVE(Common Vulnerabilities and Exposures)的Web站点上提供了一系列安全漏洞和公布信息,目的在于为众所周知的问题提供统一命名。CVE的目标是使不同漏洞容器(工具、知识库和服务)间的数据共享变得更容易。该网站整理众所周知的漏洞信息并提供安全趋势的统计分析。在2007年的报告中(http://cwe.mitre.org/documents/vuln-trends/index.html),CVE共列举了其数据库中的1754个SQL注入漏洞,其中944个是2006年新增的。SQL注入漏洞在CVE 2006年报告的所有漏洞中占13.6% (http://cwe.mitre.org/documents/vuln-trends/index.html),仅次于跨站脚本(XSS)漏洞,但排在缓冲区溢出漏洞的前面。

此外,开放应用安全计划组织OWASP(Open Web Application Security Project)在其列举的2007年10大最流行的影响Web应用的安全漏洞中将注入缺陷(包括SQL注入)作为第二大漏洞。OWASP列举出10个漏洞的主要目的是让开发人员、设计人员、设计师和组织了解最常见的Web应用安全漏洞所产生的影响。OWASP 2007年公布的10大安全漏洞是对CVE数据进行精简后汇编而成的。使用CVE数据来表示有多少网站受到过SQL注入攻击的问题是该数据无法包括自定义站点中的漏洞。CVE需求代表的是商业和开源应用中已发现的漏洞数量,它们无法反映现实中这些漏洞的存在情况。现实中的情况非常糟糕。

我们还可以参考其他专门整理受损Web站点信息的站点所提供的资源。例如,Zone-H是一个流行的专门记录Web站点毁损的Web站点。该站点展示了近几年来因为出现可利用的SQL注入漏洞而被黑客攻击的大量著名的Web站点和Web应用。自2001年以来,Microsoft域中的Web站点已被破坏过46次(甚至更多)。可以在Zone-H上在线查看受到攻击的Microsoft站点的完整列表(www.zone-h.org/content/view/14980/1/)。

传统媒体同样喜欢大力宣传因数据安全所带来的破坏,尤其是那些影响到著名的重量级公司的攻击。下面是已报道的一些新闻的列表:

2002年2月,Jeremiah Jacks发现Guess.com(www.securityfocus.com/news/346)存在SQL注入漏洞。他因此而至少获取了200 000个用户信用卡信息的访问权。

2003年6月,Jeremiah Jacks再次发动攻击,这次攻击了PetCo.com(www.securityfocus. com/news/6194),他通过SQL注入缺陷获取了500 000个用户信用卡信息的访问权。

2005年6月17日,MasterCard为保证信用卡系统方案的安全,变更了部分受到破坏的顾客信息。这是当时已知的此种破坏中最严重的一次。黑客利用SQL注入缺陷获取了4千万张信用卡信息的访问权(www.ftc.gov/os/caselist/0523148/0523148complaint.pdf)。

2005年12月,Guidance Software(EnCase的开发者)发现一名黑客通过SQL注入缺陷破坏了其数据库服务器(www.ftc.gov/os/caselist/0623057/0623057complaint.pdf),导致3800位用户的经济记录被泄露。

大约2006年12月,美国折扣零售商TJX被黑客攻击,黑客从TJX数据库中盗取了上百万条支付卡信息。

以前黑客破坏Web站点或Web应用是为了与其他黑客组织进行竞赛(以此来传播特定的政治观点和信息),炫耀他们疯狂的技术或者只是报复受到的侮辱或不公。但现在黑客攻击Web应用更大程度上是为了从经济上获利。当今Internet上潜伏的大量黑客组织均带有不同的动机。其中包括只是出于对技术的狂热和"黑客"心理而破坏系统的个人,专注于寻找潜在目标以实现经济增值的犯罪组织,受个人或组织信仰驱动的政治活动积极分子以及心怀不满、滥用职权和机会以实现各种不同目的的员工和系统管理员。Web站点或Web应用中的一个SQL注入漏洞通常就足以使黑客实现其目标。

您的网站被攻击了么?

这种事不会发生在我身上,是吧?

多年来我评估过很多Web应用,在所测试的应用中我发现有三分之一易遭受SQL注入攻击。该漏洞所带来的影响因应用而异,但现在很多面向Internet的应用中均存在该漏洞。很多应用暴露在不友善的环境中,比如未经过漏洞评估的Internet。毁坏Web站点是一种非常嘈杂、显眼的行为,"脚本小子"1通常为赢得其他黑客组织的比分和尊重而从事该活动,而那些非常严肃且目的明确的黑客则不希望自己的行为引起注意。对于老练的攻击者来说,使用SQL注入漏洞获取内联系统的访问权并进行破坏是个完美可行的方案。我曾不止一次告诉过客户他们的系统已遭受攻击,目前黑客正利用它们来从事各种非法活动。有些组织和Web站点的所有者可能从未了解他们的系统之前是否被利用过或者当前系统中是否已被黑客植入了后门程序。

2008年年初至今,数十万Web站点遭到一种自动SQL注入攻击的破坏。该攻击使用一种工具在Internet上搜索存在潜在漏洞的应用。如果发现了存在漏洞的站点,该工具使自动利用该漏洞。传递完可利用的净荷(payload)之后,它执行一个交互的SQL循环来定位远程数据库中用户创建的每一张表,然后将恶意的客户端脚本添加到表的每个文本列中。由于大多数数据库驱动的Web应用使用数据库中的数据来动态构造Web内容,因而该脚本最终会展现给受危害的Web站点或应用的用户。标签(tag)会指示浏览器加载受感染的Web页面,从而执行远程服务器上的恶意脚本。这种行为的目的是让该恶意程序感染更多主机。这是一种非常高效的攻击方式。重要的站点(比如由政府部门维护的站点、联合国和较大公司的站点)均遭受过大量这种攻击的破坏和感染。很难准确地弄清在连接到这些站点的客户端电脑和访问者中有多少受到了感染或破坏(尤其是当发动攻击的个人自己定义传递的可利用净荷时)。


相关内容: 最新内容:
理解SQL注入的产生过程[2015-02-16]
SQL注入攻击及其防范检测技术研究[2015-02-16]
防范SQL注入式攻击[2015-02-16]
理解SQL Server的SQL查询计划[2015-02-12]
SQL语句中SELECT语句的执行顺序[2015-02-12]
SQL语句中UPDATE的三种用法[2015-02-12]
理解SQL注入的产生过程[2015-02-16]
理解Web应用的工作原理[2015-02-16]
一种简单的应用架构[2015-02-16]
SQL注入攻击及其防范检测技术研究[2015-02-16]
防范SQL注入式攻击[2015-02-16]
IIS 6 的文件损坏会影响OWA[2015-02-15]