宫鼎
摘要:首先阐述了SQL入注攻击的产生原因与操作过程;接着针对有转义字符漏洞的网站进行SQL注入攻击挖掘,针对有数据库代码编译漏洞的网站进行注入攻击挖掘,并做了相应的分析;最后阐述了注入攻击的危害,归纳总结了针对注入攻击的防御措施,以提高网站数据信息的安全性。
关键词:安全漏洞;数据库;注入攻击;密钥;SQL
中图分类号:TP39 文献标识码:A 文章编号:1009-3044(2015)28-0003-03
Research of SQL Injection Attack and Prevention Technology based on Web Application
GONG Ding
(Nanjing Communications Institute of Technology ,Nanjing 211188, China)
Abstract:First, described the reasons and the operation process for the SQL injection attack ;then tested the side which has Esc vulnerabilities ,tested and analyzed the side which has database code compilation vulnerabilities ; Finally, described the damage of the injection attack ,summed up the defense against injection attacks, in order to improve the security of the site data information.
Key words: security vulnerabilities; database; injection attacks; encryption key; SQL
1 概述
随着电子商务、网络教育等各种网站智能服务的发展,Web服务应用深入到千家万户的同时也受到了越来越多的攻击者的关注[1]。目前的Web应用服务已经可以实现动态页面交互功能,甚至还可以与网站系统的数据库直接通信,利用该数据库进行指定内容的动态生成。但是由于编写网页应用程序的人员的水平及开发经验的不同,其中一部分程序员在编写网页代码时,并未对用户输入到网站中的指令代码的合法性进行检验,使这些网页的交互程序存在一定的安全隐患。OWASP全球最有影响力的网页安全研究组织,发布了十个最严重的网页应用安全风险,其中SQL注入攻击的安全风险名列前茅,其对应着对互联网中危害较大的安全漏洞[2]。
2 SQL注入攻击产生的原因
SQL注入是指用户向网站输入一段该系统数据库的查询代码,根据客户端输入的程序,网站将结果返回给该用户,使其可以获得某些想得知的数据信息的操作过程。而造成可进行注入攻击的原因主要有如下几个方面:
1)应用程序自身存在漏洞
网页应用程序自身存在漏洞给该攻击发生提供了重要条件。网站应用程序的开发时间短,加上编程人员的网络安全意识不够,安全编程方面的经验不足,造成编写的网页应用程序代码中出现一定的安全漏洞。一些开发人员在程序开发的过程中,并未对用户可输入的指令内容部分进行安全性检测与验证,导致攻击者可通过在的输入请求字符串或表单域里编写恶意的字符代码以构造特殊的指令语句,提交到网站的后台数据库中运行,以达到其攻击目的。
2)开发人员使用动态语句技术存在的安全隐患
基于网页的动态语句是在客户与服务器端进行交互的过程中构造成的,用户输入的不同代码字符串可获得不同的语句。而这些语句是在网页应用配置的数据库中被执行,以方便得到用户需要的数据信息。因此网站开发者可以使用动态语句来创建特殊功能的应用程序[4]。动态语句技术方便了各种应用程序的创建,但也带来了潜在的安全威胁,当用户提交给后台数据库执行的指令代码中有单引号时,数据库会将该单引号解析成指令代码与用户数据之间的分界符。在SQL注入攻击中,攻击者往往用单引号字符来转义网站系统设计者的查询以方便其构造特殊的查询方式,达到注入攻击目的[3]。
3)数据库配置不当
网站的数据库系统有着较为完善的身份权限认证机制,外网的用户一般无法直接对其进行访问,很难实施入侵。但如果网站系统的开发人员在作数据库配置时,用户权限设置不当,给予不该具有较高权限的用户以特权,则攻击者可以利用该账户对数据库中的数据进行读取、编辑甚至是删除操作。
3 SQL注入攻击的挖掘
SQL 注入攻击是一种威胁大、应用广阔的网站攻击技术, 从网站的URL地址栏处正常访问,与一般的网页访问区别不大,防火墙及简单的IDS安全设备检测不到该类型的攻击具有较高的隐蔽性,若攻击者注意对操作痕迹的擦除,或者网站管理人员没有定期查看数据库日志,该攻击基本不会发现[5]。SQL注入攻击的一般过程为:攻击者在网页应用程序给予的客户端页面交互单元中编写设计好的指令代码进行发送,服务器收到构造好的SQL查询指令串后,将其提交给网站的数据库执行,执行完毕后由网站将数据库运行的结果回传发送至客户端,从而使攻击者获得数据库中的重要信息。该攻击过程涉及网页应用程序架构的三个部分:数据库、客户端和服务器;其中任何部分出现漏洞都能导致注入式攻击。下边以两个网站系统为例,对其进行注入式攻击挖掘,并对攻击方法做分析。
1)针对转义字符漏洞作SQL注入挖掘
在该网站的源文件plus/feedback.php中存在注入漏洞的代码如图1所示:
在本地搭建网站测试环境,针对line243行存在的问题,在地址栏中第一次输入:
)访问该网站,当php设置中gpc为on时,line 243的$title被转义两次,进入数据库的时的结果如图2所示。
接着在地址栏中们引用id38的留言:
最后在地址栏中们引用id38的留言:
从该图中可以看出未注册的游客用户成功使用了恶意查询语句,查看到该系统版本号,并发布在留言板中。
2)针对数据库代码编译漏洞,作SQL注入挖掘
此类注入还可以用来爆库,使得系统管理员的账户密码被非法查询导致数据库用户被恶意注入出来。下边以XDcms是南宁旭东网络科技有限公司开发的一个网站为例进行注入挖掘。该网站主要使用php+mysql+smarty技术基础进行开发,XDcms采用 OOP(面向对象)方式进行基础运行框架搭建。该网站程序源码的注册模块中的\system\modules\ \index.php文件中有注入漏洞,当用户注册时,会调用register_save文件,而该文件的函数中存在三处漏洞,分析如下:
1)第68行代码:$user_num=$this->mysql->num_rows("select * from ".DB_PRE."member where `username`='$username'");该语句判断会员用户名存在与否,UserName处可被加转义字符绕过过滤,导致不注册就可进行后续操作,容易被SQL注入;
2)第73行代码:$this->mysql->db_insert('member',"`username`='".$username."',
`password`='".$password."',`creat_time`='".datetime()."',`last_ip`='".$ip."',`is_lock`='0',`logins`='0',`groupid`='1'");该处SQL注入发生在插入字段,这里的UserName同意造成注入,导致注入成功后会泄漏用户密码。
3)第82行代码:$field_sql.=",`{$k}`='{$f_value}'";该行语句导致没有对数据进行过滤就直接进入了下面的功能语句,会导致更多的系统信息泄漏。
下面利用这些漏洞进行注入攻击,注册一个用户,然后使用Burp suit进行抓包如图5所示:
点击forword按钮继续提交请求,当页面访问成功后,查看回访页面的最终结果,成功拿到了管理的用户名密码如图6所示。
在safe_html处虽然过滤了SQL注入的敏感词,还过滤了=和*,但是没有考虑SQL注入敏感词的大小写,这里只过滤了小写,那么我们用大写绕过,这里过滤的=和*,可以使用不带*和=的常规保存SQL注入语句,例如:在UserName处输入:‘ UNION SELECT 1,2,3,4,5
6,7,8,9,10,11,12,13,14 FROM (SELECT count(1),concat(round(rand(0)),
(SELECT concat(username,0x23,password) FROM c_admin LIMIT 0,1))a FROM information_schema.tables GROUP by a)b#。这样的注入发生环境比较隐蔽,不但直接在url里面可以进行构造,而且注入虽然有过滤但是还是被绕过了,所以注入的防范不能光看要看主配置代码,也需在对传递的函数也进行检查。
4 SQL 注入漏洞的危害
SQL 注入攻击的主要目的并不是对网站服务器进行攻击,其目的是想获取登录该网站的用户密码及网站数据库中的重要数据信息。一般情况下攻击者不具有网站系统的特殊权限,访问的网站中的数据资源有限;而攻击者一旦发现Web应用中的漏洞,进行SQL注入攻击,便会给网站与用户的数据信息的安全带来很大的危害[6]。主要表现在如下三点:1)在非授权情况下获得较高的系统权限,读取、修改、删除系统数据库中的数据;2)非法获得网站系统与用户敏感信息;3)注入木马,从而进一步入侵网站。
5 SQL 注入漏洞防御技术
由于网站开发者客户端用户输入的指令是无法控制的,所以对网站系统的注入漏洞的防御措施主要是在服务器端、数据库系统以及二者之间的通信上作加强。网站系统中存在注入式漏洞的主要原因是基于Web的交互程序可根据客户端的输入,动态构造语句提交给后台数据库解析执行,给攻击者提供了使用特殊代码获取敏感数据信息的条件。为了减少网站系统中SQL注入攻击的危害,可以通过如下一些措施加以防御。
1)使用错误提示屏蔽机制
攻击者常常先递交一些特殊的构造语句到网站服务器的后台,经服务器响应处理后,即使攻击者的指令没有成功执行,一般也会返回一个出错提示页面,攻击者往往可以从该页面中找到有用的系统与用户信息,以为注入攻击做必要的准备。采用系统中的错误提示屏蔽机制,可有效地防止攻击者获取任何有用的系统信息。
2)使用参数化语句
参数化查询方式是在程序代码中使用一个或多个参数进行是数据信息查询,而这些应用到客户端输入程序指令中的参数是不会当作命令去执行的,使得输入的指令代码不会出现注入风险。该方法的执行效率高于运用指令字符串构造技术去动态构造并执行语句的操作方式,且使得网站的安全性得以提升。
3)验证用户输入的合法性
可以用黑名单与白名单两种方式验证用户输入的合法性。若客户端的输入指令代码中有未被系统所定义的内容或者包含了系统所禁止的内容,那么提示客户端用户需进行正确输入。白名单验证是系统只接受预先设计好的操作规则,指令字符串提交完毕后,需检验这些字符代码是否符合预先设置好的字符串长度、类型、大小、数字范围等格式标准,只执行符合制定规则的字符串,其他一律拒绝[7]。而黑名单验证是只拒绝包含预先设置好的非法输入代码的字符串,其他一律接收。由于不良字符不可预测,使得黑名单列表数量较大,内容过多,检索的效率不高,且需要及时更新以增加新内容。若是以提高网站系统的安全性为目的,一般采用白名单机制验证用户的合法性。
4)尽量使用系统数据库定义的安全参数
SQL Server数据库专业开发人员针对注入式攻击对于其存在的安全威胁,专门设计了相应的SQL安全参数。在网站数据库开发过程中,尽量采用其系统自带的安全参数,能更好更专业地防御SQL注入式攻击。
5)加密重要的数据信息
使用数据加密技术可以有效地保护网站数据库中的重要信息不被攻击者非法查看和修改。因为攻击者即使注入成功获得了一些重要的信息,但由于得到的是密文,还需要使用一些技术进行密文的破解,若加密密钥足够复杂,会使得因密文无法破译导致注入攻击失败。若是系统需要保护的重要数据,可以使用多重密钥加密保证其安全性[8]。在大型网站的信息交互环境中,运行应用程序时再使用密钥加密较难实现,往往采用在服务器中的保护区域存放密钥的方式,这样使得攻击者需要同时关注后台数据库与网站应用服务器两个部分才能有条件解密密文,加大注入攻击的难度,从而提高了网站信息的安全性。
6 结束语
互联网时代的发展,已使Web应用渗透到当今社会各行各业中去,其网站中的数据安全性越来越受到人们的重视。本文阐述了注入式攻击的成因、原理并从实例着手,对该攻击进行挖掘分析,最后阐述了针对该攻击的防御措施,在科学地评估系统数据库安全性与保护网站敏感数据方面,具有一定的指导意义与实用价值。
参考文献:
[1] 陆培军.Xpath 注入攻击及其防御技术研究[J].计算机与信息技术,2012(Z1):86-88.
[2] Paul Muschamp.An introduction to Web Services[J].BT Technology Journal,2012,22(1):9-10.
[3] 陈小兵,张汉煜,骆力明,等.SQL 注入攻击及其防范检测技术研究[J].计算机工程与应用,2012(11):15-18.
[4] 张令通,罗森林.SQL 盲注入快速攻击方法研究[J].信息网络安全,2013,05:15-18.
[5]王伟平,李昌,段桂华.基于正则表示的SQL注入过滤模块设计[J].计算机工程,2011,37(5):158-160.
[6] 吴贵山.SQL 注入攻击防御策略的研究.计算机与网络[J].2012(9):70-73.
[7] 张博.SQL 注入攻击与检测技术研究[J].信息安全与通信保密,2010(5) : 90-92.
[8] 杨小丽,袁丁.防SQL 注入攻击的数据库驱动设计与实现[J].计算机工程与设计,2012(12) : 2691-2694.