APP下载

SQL注入攻击与防范技术研究

2017-01-18胡萍浙江理工大学科技与艺术学院现代教育技术中心

消费导刊 2016年12期
关键词:用户名后台攻击者

胡萍 浙江理工大学科技与艺术学院现代教育技术中心

陈志鹏 中国联通杭州市分公司

SQL注入攻击与防范技术研究

胡萍 浙江理工大学科技与艺术学院现代教育技术中心

陈志鹏 中国联通杭州市分公司

随着互联网的发展,Web应用无处不在,近几年不断爆出Web应用系统信息泄露的重大安全事件,大多与SQL注入漏洞有关,SQL注入的危害可见一斑,它是Web应用最为常见的漏洞之一。本文通过简单示例详细阐述了SQL注入攻击的基本原理,并深入分析SQL注入攻击过程,归纳出了SQL注入的五个行为特征,并从五个行为特征出发,针对性地提出了防范SQL注入攻击的有效方法和策略。

SQL注入攻击 Web应用 漏洞 安全

引言

随着信息技术和互联网的发展,后台数据库聚集着大量个人信息和专有信息,这些信息具有很高的经济价值,是最宝贵的资产,因此,后台数据库很容易被盯上并入侵。数据库入侵攻击可以大致分为两类:一类是通过数据库漏洞或者非法获取数据库账号直接入侵数据库;另一类是通过Web应用程序漏洞间接入侵数据库,这种类型的数据库入侵是众所周知的SQL注入攻击(SQLIA)。通常数据库不直接面向用户,第一类攻击出现的可能性较小,不在本文讨论范围,本文主要针对第二类攻击进行研究。SQL注入攻击从Web诞生到现在一直没停过,许多公司的Web应用系统都曾经遭受SQL注入攻击,甚至被拖库,不但给公司造成了经济损失,而且对公司品牌和形象产生负面影响。本文将对SQL注入攻击的原理和过程进行深入分析,并提出有效防范手段。

一、SQL注入攻击原理

SQL注入攻击是攻击者通过正常的Web页面输入,并向Web应用程序提交特定的SQL代码,从而让后台数据库执行一些非授权的SQL代码,以达到窃取、修改、甚至破坏数据库信息的目的。攻击者还可以利用SQL注入漏洞绕过用户认证机制,并完全控制远程服务器的数据库。如果程序员在开发WEB应用程序时,习惯使用用户输入的参数动态构造SQL语句去访问后台数据库,将更容易遭到SQL注入攻击。接下来,通过一个简单示例来剖析SQL注入原理。

下面这个SQL语句是Web应用程序典型用来验证用户登录名和密码的。

Select * from users where username=’$name’ and password = md5(‘$pwd’);

其中$name为用户输入的用户名,$pwd为用户输入的密码,后台Web应用程序使用$name和$pwd两个参数构建动态的SQL语句提交到后台数据库执行,根据返回结果来判定验证是否成功。假定用户输入的$name为“admin”,$pwd为“disos321!”,那么应用程序就构造的SQL语句如下:

Select * from users where username=’admin’ and password = md5(‘disos321!’);

如果匹配成功,则数据库返回记录集,应用程序判定为验证成功;否则,数据库返回空集,应用程序判定为验证失败。上面这个Web登陆验证是存在SQL注入漏洞的。当攻击者输入的$name为“admin’#”,$pwd为任何值(如:“123456”)时,那么Web应用程序构建的SQL语句如下:

Select * from users where username=’admin’#’ and password = md5(‘123456’);

在mysql数据库的SQL语句中,#是注释符号,#后面语句将被忽略(有的数据库用--作为注释符号),因此,用户按照上面方式输入用户名,即使不知道密码,也能登录成功,这样攻击者便绕过了验证直接进入系统。

当然,攻击者还可以通过MySQL的多语句执行功能进一步攻击,当攻击者输入的$name为“update users set password=md5(‘123456’);#”,$pwd为任何值(如:“123456”)时,Web应用程序构建的SQL语句为:

select * from users where username=’admin’;update users set password=md5(‘123456’);#’ and password=md5(‘123456’);

假设应用程序使用的数据库用户具有更新权限,附加的“update users set password=md5(‘123456’);”语句将会一同被执行,这样应用系统数据将被破坏。

二、SQL注入攻击过程

图1 典型的SQL注入攻击过程

如图1所示,典型的SQL注入攻击过程可分为五个步骤:

第一步:SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。

第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。

第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。首先通过输入“and (select count(*) from 表名)<>0”构造特殊SQL来猜测后台数据库可能存在的表;接着通过 “and (select count(列名) from 表名)<>0”来猜解表字段名;再通过“order by 字段序号”来猜解字段数量;最后通过“and (select count(*) from表名where left(列名,1)=’猜解的字符’)<>0”来猜解用户名和密码,如果是查询显示的页面,还可以使用union select联合查询直接获取用户名、密码,比如使用“union select 1,2,user,4,passwd,6 from admin”可以从已经猜解出的表名admin和字段名user、passwd获取用户名和密码。这个猜解过程可以借助SQL注入工具(如:sqlmap、Pangolin)快速实现,并轻易破译网站的用户名和密码。

第四步:查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。

第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。

三、SQL注入攻击防护

通过上面的分析,我们可以归纳出SQL注入攻击具有五大行为特征:非法输入、SQL拼接、频繁测试、越权执行和窃取信息,针对这些行为特征,本文总结了相应的防范措施如下:

(1)对于非法输入,可采用合法性验证进行规范。如果Web应用程序在接收到用户输入的数据后进行合法性检查再提交数据库执行,则能有效防范SQL注入攻击的发生。合法性检查有两种方式:白名单和黑名单。白名单检查是指用事先定义好的数据规则来检查用户输入数据,符合则通过,例如检查用户输入身份证号,是否符合1至17位为数字、第18为数字或字母的规则,如果符合就处理,如果不符合则拒绝,可以采用正则表达式来检查。黑名单检查是指通过检查用户输入数据中是否包含事先定义好的非法字符系列,符合则拒绝,非法字符系列一般包括select、from、where等SQL关键字。

(2)对于SQL拼接,可替换成参数化的SQL来防范。参数化的SQL操作是最有效的防范SQL注入方法。在where条件个数明确的情况下,参数化SQL操作较为简单。但往往where条件不明确的,需要根据用户的选择作为条件,这种情况就比较复杂,程序员往往就容易采用动态拼接SQL方式操作数据库,尤其条件非常多的情况下,按照用户查询的不同条件,通通过if...else..条件判断拼接sql语句,导致了sql注入漏洞的产生。针对第二种情况,同样可以改造成参数化SQL语句操作。PHP示例代码如下:

if (!empty($begin_date) && strlen($begin_date)>0) {#根据用户选择判断

array_push($sql_builder," and begin_date >= ?");

array_push($sql_params,$begin_date);

}

$sql="select * from users where 1=1";

foreach($sql_builder as $k => $v) {

$sql = $sql . $v; #动态构造参数化的SQL

}

$stmt=$pdo->prepare($sql); #SQL预编译

f

oreach($sql_params as $k => $v) {

$stmt->bindParam($k+1,$v); #动态绑定参数

}

$stmt->execute();#执行查询

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ #处理返回结果 }

(3)对于频繁测试的行为特征,可通过在应用程序与数据库之间部署数据库防火墙进行检测与防御。数据库防火墙能识别来自外部的攻击行为,并通过对SQL语法/词法中存在的风险进行精确识别,能够进行细粒度权限管控、行为审计、监测分析等,能在一定范围内发现和阻止SQL注入攻击,以防止攻击者对数据库进行入侵。

(4)对于越权执行的行为,可通过规范Web应用程序和数据库授权加以管控。Web应用程序和数据库运行和使用遵循权限最小化原则,即使用符合需求的最小权限的用户运行Web应用程序和数据库,Web应用程序使用符合需求的最小权限访问数据库。Web应用程序和数据库配置的启动账户如果属于系统管理员组,则攻击者在获取Web应用程序和数据库控制权后就可以方便地用管理员的特权进行攻击,从而造成更大的威胁。因此,应该将运行Web应用程序和数据库配置的操作系统账号配置成最小权限。同时,应限制Web应用程序和数据库中的一些额外功能的执行权限。比如在MySQL数据库中,应考虑禁用LOCAL INFILE命令,这有助于防止攻击者通过SQL注入漏洞访问服务器本地文件。

(5)对窃取信息的行为,可以采取信息加密存储方式进行保护。对用户名、密码等敏感信息通过加密处理后再存放在数据库中,即便被攻击者获得,也将无法得到有价值的信息。

四、结束语

本文对SQL注入攻击原理和过程进行详细、深入分析,归纳出了SQL注入的五大行为特征,并针对每个行为特征提出了相应防护手段,通过这样多层次、全方位的安全防范,能大大降低SQL注入的风险。但信息安全问题层出不穷,网络攻击手段日新月异,SQL注入漏洞也不例外,不存在百分之百安全的Web应用系统。Web应用开发人员和维护人员应与时俱进,及时了解新的安全漏洞,掌握新的应对措施,最大限度的保障Web应用系统的安全。

[1]王希忠等.Web应用程序中SQL注入攻防策略的研究[J].信息安全与技术,2011,(9).

[2]黄健.计算机信息安全技术及防护[J].信息安全与技术,2012,(4).

[3]AnleyC.Advanced SQL injection in SQL server applications[EB/ OL].http: //www. creangel.com/papers/advanced_sql_injection. pdf.

[4]德丸浩. Web应用安全权威指南[M].北京:人民邮电出版社.2014 [3]陈小兵, 张汉煜, 骆力明等.

[5]陈小兵, 张汉煜, 骆力明等.SQL注入攻击及其防范检测技术研究[J]. 计算机工程与应用, 2010,43(11):150-152.

[6]王溢, 李舟军, 郭涛.防御代码注入式攻击的字面值污染方法[J].计算机研究与发展, 2012,49(11):2414-2423.

[7]周淡.SQL注入检测方法的研究与实现[D]. 西安:西北大学, 2011.

胡萍(1978-),女,汉族,湖北黄冈人,浙江理工大学科技与艺术学院现代教育技术中心,讲师。陈志鹏(1978-),男,汉族,福建三明人,中国联通杭州市分公司,工程师。

本文系浙江理工大学科技与艺术学院2015年度重点课程建设项目和2015年浙江省高等教育教学改革项目和课堂教学改革项目(项目编号:Kg2015547)的研究成果。

猜你喜欢

用户名后台攻击者
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
基于微分博弈的追逃问题最优策略设计
《护士进修杂志》投稿程序
正面迎接批判
后台暗恋
机智的快递员
前台、后台精彩花絮停不了
有限次重复博弈下的网络攻击行为研究
以“后台”的名义节省电池用量