APP下载

基于WEB应用程序的SQL注入防范研究

2011-08-15郝保水

大众科技 2011年4期
关键词:身份验证字符串语句

岳 清 郝保水

(北京信息科技大学计算机学院,北京 100101)

基于WEB应用程序的SQL注入防范研究

岳 清 郝保水

(北京信息科技大学计算机学院,北京 100101)

随着网络的普及,越来越多的应用系统采用了B/S模式,介绍了SQL注入攻击的原理以及对Web服务器带来的危害,并结合Web应用程序开发给出了若干防范方法,以供开发Web程序和架设服务器时参考。

SQL注入;正则表达式;存储过程;PreparedStatement;正则表达式

(一)引言

随着互联网的发展,越来越多的系统采用基于Web服务的方式,针对Web业务的攻击亦在迅猛增长。常见的Web攻击可分为三类:一是利用WEB 服务器的漏洞进行攻击,如CGI、缓冲区溢出;二是利用网页自身的安全漏洞进行攻击,如SQL注入、Cookie假冒、认证逃避、非法输入、强制访问、隐藏变量篡改等;三是利用僵尸网络的分布式DOS攻击,造成网站拒绝服务。在这些安全隐患中,两种攻击手段概率最高,它们分别是“跨站点脚本攻击”和“SQL注入攻击”。2008年,特别是与金融服务和在线零售业相关的网站受到的SQL 注入攻击数量明显上升,根据网络安全公司WebCohort关于网络应用程序调查研究报告显示,有可能受到黑客攻击的网络应用程序不少于92%,其中,有60%就有可能遭受SQL 注入攻击。本文将通过对SQL注入原理的分析来阐述防范SQL注入的方法。

(二)SQL注入原理

1.SQL注入原理

对SQL注入攻击目前还没有一种标准的定义,微软技术中心从两个方面进行了描述:(1)是一种脚本注入式的攻击;(2)恶意用户输入用来影响被执行的SQL脚本。WEB 应用一般是用客户输入数据来构造SQL 查询语句,如果程序编写时,没有对用户输入数据的合法性进行判断,用户就可以利用某些提交数据页面或修改数据页面里的漏洞,精心构造SQL语句,让系统执行此类特殊的SQL指令,从而获取一些敏感信息,甚至获取主机控制权限。 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。

例如,在Web应用程序的登录页面中,允许用户输入其用户名(userID)和密码(psd)两个参数,应用程序通过user表中进行登录身份验证。假设登录用户名为:“mike”,密码为:“mike1980”。则常用的身份验证语句就变为:

select * from users where userID='mike' and psd='mike1980',正常情况下,如果上述sql查询返回一条用户记录,则说明身份验证成功;反之,则说明身份验证失败。如果分别为userID和psd 两个参数赋值:“'abc' or 1=1—”和“abc”,则上述SQL 语句就会变为:

select * from users where userID = 'mike' or 1=1--and psd ='abc'显然在该语句的两个判断条件中,其中有一个恒为真,即1=1,因此身份验证就会成功。可见攻击者在不知道有效的用户名和密码的情况下就可以通过身份验证。这就是一种最简单的SQL注入。可以看出SQL注入的原理就是将SQL命令通过“嵌入”的方式放入合法的HTTP提交请求中,从而进行非授权或非法的操作。当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生SQL注入攻击。

2.SQL注入过程:

SQL注入主要的步骤如下:

(1)发现SQL注入位置;

通过对带有参数的动态网页地址后附件信息,比较运行结果,判断该Web应用程序是否可以被注入。

(2)判断后台数据库类型;

可以根据SQL注入不成功的提示信息,分析数据库的类型。 因此要特别注意,编写程序的时候,要尽量考虑所有可能出现的错误并编写错误提示,要避免系统提示。

(3)确定XP_CMDSHELL可执行情况;

若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步骤都可以省去。

(4)发现WEB虚拟目录;

只有找到WEB虚拟目录,才能确定放置ASP木马的位置。

(5)上传ASP木马;

(6)得到管理员权限。

3.SQL注入后果

SQL注入成功后,造成的危害也很严重:

(1)Web服务器数据库信息会被窃取。一旦攻击者通过了SQL注入,可以通过访问系统数据库master的系统表sysdatabases,猜解出所有的数据库名,再通过对每个库的系统表Sysobjects的访问,可以猜解出该库的所有对象的对象名、对象ID、对象类型、所有者对象的用户ID、对象状态。接下来就可以查看每个对象了,信息就这样被窃取了。

(2)Web服务器数据库对象受损。SQL注入成功后可在Web服务器执行SQL命令,如delete、insert等。如果删除了表或者库,那么 Web应用程序的访问必然会出错。动态生成网页的数据库被通过 SQL注入的方式删除了,网页无法生成。这就是常见的网站被“黑”的原因之一。

(3)计算机受控。通过注入,上传木马,这是危害最大的一种方式,SQL注入后,若当前连接数据的帐号具有SA权限,且可执行 master.dbo.xp_cmdshell扩展存储过程,用xp_cmdshell 向服务器上写入一个能写文件的 asp文件,通过该方法即可上传木马,被攻击的计算机就处于被控制状态了。

(三)SQL注入防范方法

在了解了SQL注入的原理、过程和后果之后,接下来将阐述SQL注入防范方法。在Web项目中合理使用防范SQL注入方法是Web项目设计和开发者必须要考虑的问题。

1.使用函数过滤字符串

目标是过滤输入中能够引起SQL注入的字符或单词。以下的例子是将字符串过滤功能封装在一个名为sql_inj.java的文件中,在jsp中可以调用该函数检查是否包含非法字符。public static boolean sql_inj(String str)

{

String inj_str =

"'|and|exec|insert|select|delete|update|count|*|%|ch r|mid|master|truncate|char|declare|;|or|-|+|,";//可以在这添加要过滤的内容

String inj_stra[]= split(inj_str,"|");

for (int i=0 ; i < inj_stra.length ; i++ )

{

if (str.indexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

2.使用正则表达式过滤传入的参数

正则表达式,在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。可以使用正则表达式对输入项进行检查。

下面是具体的正则表达式:

(1)检测SQL meta-characters的正则表达式:

/(\%27)|(’)|(--)|(\%23)|(#)/ix

(2)修正检测SQL meta-characters的正则表达式:

/((\%3D)|(=))[^ ]*((\%27)|(’)|(--)|(\%3B)|(:))/i

(3)典型的 SQL 注入攻击的正则表达式:

/w*((\%27)|(’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

(4)检测SQL注入,UNION查询关键字的正则表达式:

/((\%27)|(’))union/ix(\%27)|(’)

(5)检测MS SQL Server SQL注入攻击的正则表达式:

/exec(s|+)+(s|x)pw+/ix

3.简单又有效的方法PreparedStatement

SQL注入的原因就是将SQL命令通过“嵌入”的方式放入合法的HTTP提交请求中。如果使用预编译语句,传入的任何内容就不会和原来的语句发生任何匹配的关系,就用不着对传入的数据做任何过虑。这就是在JDBC应用中,应该始终以PreparedStatement代替Statement的原因。也就是说,在任何时候都不要使用Statement.,凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 。PreparedStatement的优点如下:

(1)代码的可读性和可维护性。

(2)PreparedStatement尽最大可能提高性能。

(3)最重要的一点是极大地提高了安全性。以下是一段关于PreparedStatement的代码:

try {

String username =

httpservletrequest.getParameter("username");

String password =

httpservletrequest.getParameter("password");

String sql = "SELECT * FROM users where username=?and password=?";

Connection conn =

ConnectionManager.getConnection();

pstmt = conn.prepareStatement(sql);

pstmt.setString(1,username);

pstmt.setString(2,password);

ResultSet resultset = pstmt.executeQuery();

} catch (SQLException e) {

e.printStackTrace();

}

运行结果是只要输入特殊的符号都会以(/? )的形式出现,因此 SQL肯定是不会通过的。所以这样可以简单又有效的防止SQL的注入。

4.SQL Server 防御

输入验证不是万能的,比如用过滤字符串的方法拒绝了“delete”字符串的输入,但攻击者只需要把该字符串改写成“DeLetE”等形式就可以避开输入验证,并能正常执行该SQL语句。所以更重要的一点是必须考虑SQL Server 自身安全性问题。在创建数据库构架时应该考虑以下问题:

(1)数据库账号的管理:创建低权限账号;删除冗余的账号;保持账号密码的高安全性,并正常运行一个密码审计脚本。

(2)数据库角色的管理

确保需要使用Web 应用的SQL 用户具有最低访问权限。

(3))检查服务器的补丁状况

针对SQL-Server 的漏洞,及时升级安全补丁。

(4)检验IIS 日志和数据表。

(四)结语

本文对SQL 注入攻击的原理、常用注入过程和后果进行了描述和总结,并着重阐述了通过字符串过滤、使用正则表达式、预编译方法和SQL Server 防御来构建防范SQL注入的思路和方法,并给出了相应代码。本文对于越来越多的Web 动态应用程序提供了较好的防范SQL 注入式攻击的解决方案,具有一定的现实意义。

[1]秦浩.浅析常见的 Web服务攻击[J].自动化与仪器仪表,2009,(3).

[2]赛门铁克第 2 期.Symantec 资讯[EB/OL].http://www.cww.net.cn/zhuanti/html/2009/2/10/200921095084992.htm.

[3]Anley C.Advanced SQL injection in SQL server Applications[EB/OL].http://www.creangel.com/papers/adva nced_sql_injection.pdf, An NGSSoftware Insight Security Research (NISR)Publication,2002.

[4]郭立川.SQL 注入思路与防注入办法[J].软件导论,2010,(3).

[5]王云,郭外萍,陈承欢.Web 项目中的SQL 注入问题研究与防范方法[J].计算机工程与设计,2010,31(5).

TP393.08

A

1008-1151(2011)04-0048-02

2011-01-11

北京市教委科技发展计划基金项目(KM200810772010);2010年度科研水平提高项目资助(资助号:5028123400

岳清(1973-),女,河南郑州人,北京信息科技大学计算机学院讲师,硕士,从事数据库安全、软件工程等研究。

猜你喜欢

身份验证字符串语句
基于文本挖掘的语词典研究
重点:语句衔接
人脸识别身份验证系统在养老保险生存核查中的应用
Endogenous neurotrophin-3 promotes neuronal sprouting from dorsal root ganglia
一种新的基于对称性的字符串相似性处理算法
如何搞定语句衔接题
依据字符串匹配的中文分词模型研究
ASP.NET中的Forms身份验证的研究
一种针对Java中字符串的内存管理方案
作文语句实录