SQL注入及其危害、防御手段

一、什么是SQL注入
SQL(Structured Query Language),即结构化查询语言,用于操作关系型数据库管理系统。目前,大多数Web编程语言提供了操作SQL的接口,以方便与数据库进行交互。但是在开发Web应用的过程中,由于忽视了代码的健壮性和安全性,攻击者可以构造巧妙的SQL语句从而获取到敏感数据,因此导致了SQL这种攻击方式的流行。

二、SQL注入的原理
在B/S模式中,用户可以通过Get或Post等方式,对服务器发出HTTP请求。在服务器端,对数据库执行查询操作,将查询的结果返回浏览器端。黑客利用上述过程,将精心构造的请求放到传入的变量参数中,让服务器端执行恶意代码,从而达到了读取数据库中敏感信息的效果,甚至将数据库删除。这一攻击过程就是SQL注入,它的原理如图所示。
SQL注入及其危害、防御手段_第1张图片
从访问流程上来看,攻击者与普通的用户是没有任意区别的,都是将数据发送到服务端,服务端处理数据并返回结果。但是攻击者对输入数据进行了精心的处理,在进行SQL语句操作的时候,效果就会和正常流程完全不同,从而达到获取整站数据甚至写入木马的效果。

三、触发SQL注入的方式
攻击者通常可以使用以下几种方式来触发SQL注入漏洞:
(1)用户的输入。通常使用HTTP的GET或POST请求传输用户数据,通过修改POST包中的数据或者GET请求中URL参数值来实现恶意代码注入。
(2)通过HTTP请求头。服务器端可能会保存用户的IP及User-Agent等信息,此时,攻击者可以在X-Forwarded-For 或UA等请求头字段中构造语句进行SQL注入。
(3)二阶注入。攻击者在HTTP请求中提交恶意输入,服务端将恶意输入保存在数据库中,攻击者紧接着提交第二次HTTP请求。为处理第二次请求,服务端需要查找数据库,触发了之前存储的恶意输入,并将结果返回给攻击者。攻击者需要通过两次独立请求才可以实现SOL注入的目的,这种攻击方式因此得名二阶注入。

四、SQL注入的特点
SQL注入具有以下特点:
(1)变种多。当页面可以返回错误的信息时,可以使用基于错误(Error-based)的注入方法。如果服务端对返回的错误进行过滤,可以使用基于布尔(Bool-based)或基于时间(Time-based)的注入方法。另外,熟练的攻击者会适当调整攻击参数,以绕过特定字段的检测,使传统的特征匹配方法检测不到注入。
(2)攻击简单。目前网上流行各种开发的SQL注入工具,使得发动攻击的门槛大大降低。即使是毫无经验的“脚本小子”,借助这些工具也可以对目标网站进行攻击。
(3)危害大。攻击者一旦得手,轻则获取整个网站的敏感数据,重则写入木马,控制整个服务器,破坏力极大。在近几年OWASP公布的Web应用十大安全漏洞排名中,SOL注入稳居榜首4。虽然其原理及利用方式并不复杂,但对目标网站造成的破坏力巨大。

五、SQL注入的危害
(1)攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
(2)可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
(3)如果网站目录存在写入权限,可以写入网页木马。攻击者进而可以对网页进行篡改,发布一些违法信息等。
(4)经过提权等步骤,服务器最高权限被攻击者获取。攻击者可以远程控制服务器,安装后门,得以修改或控制操作系统。

六、SQL注入的漏洞检测
SQL注入漏洞的检测分为手动检测和自动检测。手动检测是安全测试人员对某个特定区间的URL进行手工注入测试;自动检测是利用爬虫爬取网站的所有链接,对所有的链接自动进行注入测试。在大型应用中,手动检测的工作量是巨大的,一般采用自动检测的方式。

七、SQL注入的防御手段
防御SQL注入的核心思想是对用户输入的数据进行严格的检查,并且对数据库
的使用采用最小权限分配原则。目前SQL注入的防御手段有以下几种:
(1)基于攻击特征的匹配过滤。这是目前使用最为广泛的方式,系统会将攻击特征做成数据库,一旦匹配到这些攻击特征就会认定检测到SQL注入。这种方式可以有效的过滤大部分SQL注入攻击,但是大大增加了程序的复杂度,同时可能影响到业务的正常查询。
(2)对用户输入进行转义。例如,常见的SQL注入语句中都含有“‘’”,通过转义将“‘’”转义为“/”,SQL注入语句就会达不到攻击者预期的执行效果,从而实现对SQL注入进行防御。
(3)数据类型进行严格定义,数据长度进行严格规定。比如查询数据库某条记录的id,定义它为整型,如果用户传来的数据不满足条件,要对数据进行过滤。数据长度也应该做严格限制,可以防止较长的SQL注入语句。
(4)严格限制网站访问数据库的权限。
(5)近几年来,随着机器学习与人工智能技术的火热,基于机器学习的检测SQL注入方法成为了新的研究方向。首先将样本SQL语句转换为特征向量集合,使用机器学习的方法进行训练,将得到的模型投入使用,利用训练的模型检测传入的数据是否包含恶意SQL注入。
(6)其他防御措施。例如,避免网站显示SQL执行出错信息,防止攻击者使用基于错误的方式进行注入;每个数据层编码统一,防止过滤模型被绕过等。

Web应用程序存在SQL注入,往往是因为在程序编写的过程中,开发人员违背了“代码与数据分离”原则。一方面,攻击者可以任意更改输入数据;另一方面,攻击者可以在数据里构造代码,让服务器端把数据解析成代码执行。所以,只要遵循“代码与数据分离”原则,对用户端传入的数据进行严格检查,从技术角度而言,可以实现完全防御SQL注入攻击。

你可能感兴趣的:(web端)