- A+
1什么是SQL注入
很多人声称自己了解SQL注入,但他们听说或者经历的情况属于比较简单的。SQL注入是影响企业运营且最具破坏力的漏洞之一,它会泄露保存在应用程序数据库中的敏感信息,包括用户名、口令、姓名、地址、电话以及信用卡明细等易被利用的信息。
那么,应该怎样来准确的定义SQL注入呢?目前通常认为SQL注入(SQL Injection)是这样一种漏洞:应用程序在向后台数据库传递SQL(Structured Query Language,结构化查询语言)进行查询时,如果为攻击者提供了影响该查询的能力,则会引发SQL注入。攻击者通过影响传递给数据库的内容来修改SQL自身的语法和功能,并且会影响SQL所支持数据库和操作系统的功能和灵活性。SQL注入不只是一种会影响Web应用的漏洞,对于任何从不可信信息源获取输入的代码来说,如果使用了该输入来构造动态SQL语句,那么很可能就会受到攻击。
2 SQL注入原理
很多Web应用程序都使用数据库来存储信息。SQL命令就是前端Web和后端数据库之间的接口,使得数据可以传递至Web应用程序,自SQL数据库开始连接至Web应用起,SQL注入就可能已经存在。很多Web站点都会利用用户输入的参数动态地生成SQL查询语句,但由于开发人员的水平和经验参差不齐,相当一部分开发人员在编写代码的时候,没有对用户的输入数据或者是页面中所携带的信息(如Cookie)进行充分的合法性检查过滤,导致了攻击者可以通过在URL、表单域,或者其他的输入域中输入自己的SQL命令,以此改变查询属性,骗过应用程序,提交一段数据库查询代码,从而可以对数据进行不受限的访问,获取敏感信息或者控制应用系统。利用SQL注入漏洞可以构成对Web服务器的直接攻击,还可能利用服务器攻击第三方的浏览网站的其他用户。
3 SQL注入过程
SQL注入的利用方法多种多样,但整体来说其过程可以分为以下五个步骤:
-
第一步:判断Web环境是否可以SQL注入。
如果URL仅是对网页的访问,则不存在SQL注入问题,如:http://news.xxx.com /12345.html就是普通的网页访问。只有对数据库进行动态查询的业务才可能存在SQL注入,如:http://music.baidu.com/search?key=11,其中? key=11表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。
-
第二步:寻找SQL注入点。
完成上一步的判断后,就要寻找可利用的注入漏洞,通过输入一些特殊语句,根据浏览器返回的信息,判断是否存在注入点以及获取数据库类型等有用信息。
一般来说,SQL注入通常存在于形如:http://a.b.c.d/abc.asp?id=XX等带有参数的动态网页中,有时一个动态网页中可能只有一个参数,有时可能有两个或者多个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。
为了更形象的说明问题,以下以http:// www.example.com/abc.asp?ID=YY为例进行分析,我们假定此处的YY参数为整型。此时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段=YY。所以可以用以下步骤测试是否存在SQL注入漏洞:
1. 访问http:// www.example.com/abc.asp?ID=YY’(参数中附加了一个单引号),此时abc.asp中的SQL语句变成了select * from 表名 where 字段=YY’,abc.asp页面运行异常;
2. 访问http:// www.example.com/abc.asp?ID=YY and 1=1,abc.asp页面运行正常,而且与http:// www.example.com/abc.asp?p=YY请求运行结果相同;
3. 访问http:// www.example.com/abc.asp?p=YY and 1=2,abc.asp页面运行异常;
如果以上三条全部满足,则abc.asp页面中一定存在SQL注入漏洞。
-
第三步:猜解用户名和密码。
数据库中存放的表名、字段名都是有规律可言的,例如MySQL数据库中系统自带的information_schema信息数据库中保存着关于MySQL服务器所维护的所有其他数据库的信息,当前MySQL实例中所有数据库的信息存放在SCHEMATA表,所有表信息存放在TABLES表中,所有表中列信息存放在COLUMNS表中。攻击者可以通过构建特殊数据库语句在数据库中依次查找表名、字段名、用户名和密码的长度,以及内容。这个猜测过程可以通过网上现成的大量注入工具快速实现,并借助破解网站破译用户密码。
-
第四步:寻找WEB管理后台入口。
通常WEB后台管理的界面不面向普通用户开放,要寻找到后台的登录路径,可以利用扫描工具快速搜索到可能的登录地址,利用社会工程学依次进行尝试,就可以试出管理台的入口地址。
-
第五步:入侵和破坏。
成功登录后台管理后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息,进一步入侵数据库服务器或者获得服务器控制权限。
图1为一次SQL注入的HTTP请求头部的部分内容,其中%20是空格符号的ASCII编码,%23为#的ASCII编码,在此处用于截断字符串。
图1 SQL注入HTTP请求头部的部分内容
图1所示的包含SQL注入指令的HTTP请求,在Web服务器成功处理后会把id=1时获取的相关信息导出并存入到服务器C盘www目录下名为1.php的文件中。通常攻击者此时导出的信息包含一个完整的后门源码,当攻击者访问该导出文件时该后门被执行。
4 SQL注入特点
SQL注入攻击具有以下特点:
(1)广泛性。SQL注入攻击利用的是SQL语法,因此只要是利用SQL语法的Web应用程序如果未对输入的SQL语句做严格的过滤处理都会存在SQL注入漏洞,目前以Active/JSP、PHP、Perl等技术与SQL Server、Oracle、MySQL、DB2、Sybase等数据库相结合的Web应用程序均发现存在SQL注入漏洞。
(2)隐蔽性。SQL注入攻击是目前网络攻击的主要手段之一,在一定程度上其安全风险高于缓冲区溢出漏洞,目前防火墙不能对SQL注入漏洞进行有效地防范。利用Web漏洞发起对Web应用的攻击纷繁复杂,包括SQL注入、跨站脚本攻击、跨站伪造攻击等,它们的一个共同特点是隐蔽性强,不易发觉。究其原因,一方面普通网络防火墙为了使合法用户运行网络应用程序访问服务器端数据,必须允许从Internet到Web服务器的正向连接,因此一旦网络应用程序有注入漏洞,攻击者就可以直接访问数据库甚至能够获得数据库所在服务器的访问权。另一方面,对Web应用攻击的变化非常多,传统的IDS对此类攻击几乎没有作用。
(3)低技术性。SQL注入技术公布后,网络上先后出现了多款SQL注入工具,例如穿山甲(Pangolin)、HDSI、NBSI、啊D、明小子 Domain等,利用这些工具软件可以轻易地对存在SQL注入漏洞的网站或者Web应用程序实施攻击。
(4)高危害性。Web安全纷繁复杂,危害最严重的当属SQL注入。SQL注入攻击成功后,轻者只是更改网站首页等数据,重者通过网络渗透等攻击技术,可以获取公司或者企业的机密数据信息,甚至完全控制服务器,导致重大经济损失。因此在某些情况下,SQL注入攻击的危害要高于其他所有漏洞。
5 SQL注入实例
为了更直接的展示SQL注入攻击,我们以Sourcefabric Newscoop SQL注入漏洞(漏洞CVE编号:CVE-2012-1934)为例看看通过SQL注入攻击获取用户密码的简要操作。
Sourcefabric Newscoop是一款内容管理系统。该系统在实现中对通过f_country_code参数提交给admin/country/edit.php脚本的输入缺少过滤,使得攻击者可以利用漏洞进行SQL注入攻击。
该系统中对edit.php页面的正常访问形如:
http://a.b.c.d/newscoop/admin/country/edit.php?f_country_code=AD&f_country_language=1
由于存在SQL注入漏洞,攻击者可以在该请求中注入恶意的SQL指令,如通过union 联合查询获取系统数据库liveuser_users表中的用户密码信息,具体的恶意HTTP请求如下,其中%27是单引号的ASCII编码。
http://a.b.c.d/newscoop/admin/country/edit.php?f_country_code=%27%20union%20select%201,2,Password%20from%20liveuser_users%20where%20Id=%271%23=' union select 1,2,Password from liveuser_users where Id='1#
该请求结果如图2所示,我们可以看到原本应该显示Country信息的行显示了Id为1的用户的密码,虽然该密码已加密为四十位,但是攻击者仍然可以借助其他技术手段进行解密。攻击者只需变换恶意请求中的参数即可获取用户名等其他敏感信息。
图2 SQL注入结果图
6 SQL注入的防御思路
由于攻击的泛滥,尽管人们防护SQL注入的安全意识已大为提升,但仍然有众多的人缺乏系统、具体的防护概念。下面将简要介绍如何以一种综合的方法来正确防护SQL注入。如下图3所示,理想的解决思路是在Web应用生命周期的各个阶段进行相应的防范。
图3 SQL注入防御思路
6.1开发阶段
在编码阶段需要对输入进行细致的验证,使用静态查询,例如使用参数化声明。且遵循“最小权限准则”,即只赋予应用程序完成其功能的最基本权限。以下是关于最小权限的一些建议:
-
不要使用root权限访问数据库;
-
为数据表设定限制的可读/可写权限;
-
慎用数据库存储过程。
6.2 测试阶段
在测试阶段可以采用以下两种方式确保Web应用程序代码的安全性:
-
第一,采用源代码审核方式,从编程者角度审视代码是否存在漏洞;
-
第二,执行渗透测试,借助各种SQL注入漏洞检测工具,从攻击者角度检查代码的安全性。
需要注意的是,完成以上两步并不能确保100%的安全,但对于确保应用程序质量是必须的。
6.3产品化阶段
在产品化阶段,Web应用程序已经上线使用,并对外提供服务,但还是可能会发现Web应用存在安全隐患,此时整改代码对某些系统来说可能已经不现实,因为需要付出较大代价。这时,可以部署专用的Web入侵防御系统(如H3C SecPath IPS),可以在发生损害之前阻止攻击,大幅提升Web应用的安全等级。
十几年前,基于数据库的Web应用刚流行时,几乎所有开发商都没有注意到SQL注入漏洞,导致当时大多数网站的登录入口形同虚设。时至今日,Web应用已愈加成熟,安全性也不断得到加强。遗憾的是,针对SQL注入漏洞的各种攻击工具也在推陈出新,不断地向安全管理人员发出新的挑战。所以对于信息安全需求比较迫切的企业或者组织来说,部署专业的SQL注入防御系统是刻不容缓的。以H3C的IPS(Intrusion Prevention System)和UTM(Unified Threat Management)为例,这些设备采用系统的防御方法,结合智能的规则识别技术可以对各种SQL注入攻击进行有效的防御。H3C IPS设备的SQL注入具体防御原理如图4所示:
图4 SQL注入防御原理
客户在内网入口部署IPS设备进行入侵检测后,当外网流量请求访问内网服务器时,IPS设备会对流量进行深度识别检查,如流量中包含SQL注入特征,则判定该流量是SQL注入的恶意流量,设备会阻断该流量并进行日志记录;如未检测到攻击特征则判定该流量为正常流量,设备会放行该流量,允许其访问内网服务器
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫