“SQL注入”的前世今生和其防御思路

“SQL注入”流行之前,缓冲区溢出是最有效的黑客渗透方法,但经历了一些严重事件后(如:Code Red、Nimda、SQL Slammer),现在很多网络管理员的安全意识增强了,一般都能及时安装系统补丁,而且软、硬件厂商都针对溢出问题做了很多解决方案,可以说:缓冲区溢出在黑客攻击中的路越来越窄。这时候,针对CGI3程序的渗透被黑客发现是更有效的办法,因为CGI程序作为Web应用程序的一部分,通常开发周期很短,相应的测试环节很少,普遍存在缺陷,那么这些CGI程序就有可能成为突破点。下面我们就将介绍CGI攻击的一大分支:SQL注入。

1、SQL即结构查询语言(Structured Query Language),一种ANSI(美国国家标准学会)标准语言,用于访问、操作关系数据库系统(Relational database systems)。

2、缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上。理想的情况是:程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为“堆栈”。在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。

3、Common Gate Interface,简称CGI。在物理上是一段程序,运行在服务器上,提供同客户端 Html页面的接口。举个例子:现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后CGI程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。

“SQL注入”现在已经成为互联网上最通用的攻击方式,通过Google、百度等搜索引擎,可以发现很多相关说明文章和攻击软件。这类攻击的流行,一方面是由于Web应用的迅速普及和Web后台数据价值上升,攻击者受经济利益驱使;另一方面,攻击软件的泛滥降低了技术门槛,如SQL注入自动化攻击工具实现了“目标锁定、发现注入点及注入攻击”全过程自动化,尤其是自动完成“发现注入点”这一关键步骤,极大地方便了攻击者,提高了攻击成功率。

1、“SQL注入”的定义

很多Web应用程序都使用数据库来存储信息。SQL命令就是前端Web和后端数据库之间的接口,使得数据可以传递至Web应用程序。很多Web站点都会利用用户输入的参数动态地生成SQL查询要求,攻击者通过在URL、表单域,或者其他的输入域中输入自己的SQL命令,以此改变查询属性,骗过应用程序,从而可以对数据进行不受限的访问。

SQL注入漏洞成因在于Web应用程序对用户提交CGI参数数据未做充分检查过滤。用户提交的数据可能会被用来构造访问后台数据库的SQL指令,如果这些数据过滤不严格就有可能被插入恶意的SQL代码,从而非授权操作后台的数据库,导致从敏感信息泄露、破坏数据库内容和结构、甚至利用数据库本身的扩展功能控制服务器操作系统。利用SQL注入漏洞可以构成对Web服务器的直接攻击,还可能利用服务器攻击第三方的浏览网站的其他用户。

2、“SQL注入”的历史

我们简单回顾一下SQL注入的相关历史。

  • 1998年12月, Rain Forest Puppy(RFP) 在Phrack 54上发表文章“NT Web Technology Vulnerabilities”,首次提到SQL注入;
  • 1999年2月,Allaire发出警告 “Multiple SQL Statements in Dynamic Queries”;
  • 1999年5月, RFP与Matthew Astley发出警告 “NT ODBC Remote Compromise”;
  • 2000年2月,RFP发表文章 “How I hacked Packetstorm – A look at hacking  wwthreads via SQL”,披露如何利用SQL注入攻击渗透Packetstorm网站;
  • 2000年9月,David Litchfield在Blackhat会议上发表主题演讲“Application Assessments on IIS” ;
  • 2000年10月,Chip Andrews在SQLSecurity.com 上发表“SQL Injection FAQ ”,首次公开使用“SQL注入”这个术语 ;
  • 2001年4月,David Litchfield 在Blackhat会议上发表主题演讲 “Remote Web Application Disassembly with ODBC Error Messages”;
  • 2002年1月,Chris Anley发表论文“Advanced SQL Injection in SQL Server”,首次深度探讨该类攻击。
  • 2002年6月,Chris Anley发表论文 “(more) Advanced SQL” ,补充同年1月发表的论文缺少的细节。
  • 2004年Blackhat会议上, 0x90.org发布了SQL注入工具SQeaL ( Absinthe的前身)。

3、“SQL注入”的演进

SQL注入攻击技术出现已有10多年历史,该种攻击技术被广为利用。2007年,出现了新型的攻击方法。之前,SQL注入攻击针对特定的Web应用程序,攻击者事先已经了解到了底层数据库的架构以及应用程序注入点。而新型攻击与以往有很大不同。它将可能攻击任何存在SQL注入漏洞的动态ASP页面。

根据网络世界(Network World)的报导,2008年5月13日,在中国大陆、香港及台湾地区有数万个网站遭遇一轮 SQL注入攻击,并引发大规模挂马。同期,根据微软的报导,在4个月时间内,发生了3次大规模攻击,受害者包括某知名防病毒软件厂商网站、欧洲某政府网站和某国际机构网站在内的多家互联网网站,感染页面数最多超过10,000页面/天。

具体攻击方式,如下图1所示。黑客首先使用Google搜索引擎定位网页中包含的动态ASP脚本,测试脚本是否存在SQL注入漏洞并确定注入点,最终试图遍历目标网站后台SQL Server数据库的所有文本字段,插入指向恶意内容(即黑客控制的服务器)的链接。攻击的整个过程完全自动化,一旦攻击得逞,这些自动插入的数据将严重破坏后台数据库所存储的数据,动态脚本在处理数据库中的数据时可能出错,各级页面不再具有正常的观感。被攻击站点也可能成为恶意软件的分发点,访问这些网站的网民可能遭受恶意代码的侵袭,用户的系统被植入木马程序从而完全为攻击者控制。

4、防御“SQL注入”的思路

尽管由于攻击的泛滥,人们防护SQL注入的安全意识已大为提升,但仍然有众多的人缺乏系统、具体的防护概念。下面将简要介绍如何以一种综合的方法来正确防护SQL注入。如下图2所示,理想的解决思路是在Web应用生命周期的各个阶段做相应的努力。

1)开发阶段

在编码阶段需要对输入进行细致的验证,使用静态查询,如使用参数化声明。且遵循“最小权限准则”,即只赋予应用程序完成其功能的最基本权限。以下是关于最小权限的一些建议:

  • 不要使用root权限访问数据库
  • 为数据表设定限制的可读/可写权限
  • 慎用数据库存储过程

2)测试阶段

在测试阶段采用以下两种方式确保Web应用程序代码的安全性:第一,采用源代码审核方式,从编程者角度审视代码是否存在漏洞;第二,执行渗透测试,从攻击者角度检查代码的安全性。需要注意的是,尽管完成以上两步,仍不能确保100%的安全,但这两种方法对于确保应用程序质量是必须的。

3)产品化阶段

在产品化阶段,Web应用程序已经正常上线,并对外提供服务。但还是会发现Web应用存在安全隐患,此时整改代码对各类组织来说已经不现实了,因为需要付出较大代价。这时,可以部署专用的Web应用防火墙(Web Application Firewall,简称WAF),以大幅提升Web应用的安全等级。