SQL注入式攻击研究及防范

2022-09-14

Web技术的快速发展加快了企事业单位的信息化进程。为了提高管理效率, 更好地服务于大众, 各单位纷纷建立了网站并推出了运行于网络环境下的管理信息系统。这些运行于Intranet或Internet环境下的MIS系统几乎都毫无例外的采用了B/S模式的软件架构开发。由于运行环境的开放性和程序编制者的水平与经验的不足, 这些MIS系统在运行过程中存在着安全漏洞。本文主要介绍了MIS系统中存在的SQL漏洞以及由此引发的SQL注入式攻击, 并提出了针对这种攻击的安全防范措施。

1 SQL注入式攻击

1.1 SQL漏洞的产生

软件安全漏洞的产生主要是由于程序员不正确和不安全编程引起的, 用户不正确的使用以及不恰当的配置也可导致漏洞的出现[1]。

开发MIS系统一般通过ASP、ASP.NET等开发技术调用数据库管理软件 (如:MS-SQL Server) 对实现数据的管理, 而这些数据库管理软件都是通过SQL语言完成对数据的操作。SQL语言是一种关系数据库的结构化查询语言, 几乎所有著名的数据库管理系统都支持它。然而SQL语言存在安全隐患, 攻击者可以利用SQL在用户输入提交信息界面输入精心设计的攻击语句攻陷数据库服务器进而攻陷系统服务器。

1.2 SQL注入式攻击的原理

假设有一个对提交用户信息表单的处理程序, 要求根据输入的用户名和密码进行身份认证。如果用户输入的用户名username和密码password与用户信息表users中的记录匹配则认证成功, 否则失败。SQL语句如下:

如果用户输入正确的信息:username的值为liuye, password的值为admin。则上面的SQL语句为:

则完成认证。但是, 如果是攻击者输入如下的信息:

username的值为li, password的值为y'or'1'='1。则上面的SQL语句变为:

由于查询的条件恒为真, 结果认证也成功了。攻击者根本没有输入正确用户名和密码却成功地进行了认证, 这违背了程序的功能。究其原因就是攻击者通过提交精心构造的特殊SQL语句进行了SQL注入式攻击。

这种攻击的破坏性很严重。攻击者甚至可以对数据库进行破坏。如果上例中输入的username的值为li';drop table us-ers--

Password值为y (或是一个任意值)

这样SQL语句就变成:

结果造成数据库中表users将被删除, 拒绝任何用户进入应用程序。因为'--'号在Transact-SQL中表示注释, 执行时可以忽略'--'以后的语句, ';'号表示一个查询的结束和另一个查询的开始。

由于SQL注入式攻击是从正常的80端口访问, 而且表面看起来跟一般的页面访问没什么区别, SQL注入攻击利用的是合法的SQL语法, 使这种攻击不能被防火墙检测出来, 具有难捕获性。有很多程序员对它没有引起重视, 编写出的网站中遗留注入攻击漏洞。

2 SQL注入式攻击的防范

SQL注入 (SQL Injection) 使网络应用系统面临严重的安全问题。黑客可以通过SQL注入把特殊的SQL指令语句插入到系统实际S Q L语句中以获得用户密码等敏感信息, 获得主机控制权限。防御SQL攻击的方法主要是基于程序分析的自动过滤法和输入检测, 即在编程时对预先定义好的敏感字符进行检测并过滤。

2.1 自动过滤法

自动过滤是在网络服务前端增加一个应用级的防火墙, 在接收到用户输入信息时进行集中检查, 过滤掉恶意输入, 例如Snort以及PHP中实现的“MagicQuotes”。这种过滤程序通常采用特征字符串匹配算法, 主要凭借预先定义好的一系列正则表达式进行过滤, 易产生错漏, 精心构造的恶意输入很容易绕过这种过滤程序。

2.2 手工检测法

这种方法主要是在编制程序时对用户输入的信息进行参数检查, 对存在的可疑字符 (空格符或单引号等) 进行过滤, 确信输入的内容包含合法的数据, 从而防止SQL注入攻击, 降低攻击者成功的概率。主要解决代码如下:

‘判断输入信息中是否含有空格符或是否含有单引号字符。

response.write"有SQL注入!, 请不要输入非法字符尝试注入!"

该程序中使用instr () 函数防止SQL注入攻击。在注入时使用的像or'1'='1之类的注入攻击就会被屏蔽掉。在该程序的基础上稍做改进, 就可以防止在提交的表单中使用SQL中的关键字进行注入攻击。其核心思想是检测并过滤掉常用的SQL中的关键字。主要解决代码如下:

‘定义要过滤的SQL关键字

除了上述方法, 还可以通过对后台数据库中的信息进行加密处理, 以达到防止SQL注入的目的。这种思想首先要求数据库管理员在设计数据库时将用户账号、密码等用户个人信息以密文的形式存储在数据库的user表中。常常通过MD5或SHA-1加密算法, 当添加一个新的用户或用户更改自己的密码时, 系统会对用户密码进行加密, 将加密后的值存入数据库中。然后当用户登录时, 系统通过相应的加密算法把用户输入的密码计算成加密后的值, 然后与保存在数据库中的密码值进行比较进而确定输入的密码是否正确。它实际上是对用户输入的数据进行了“清洁处理”, 用户输入的数据不再对数据库有任何特殊的意义, 从而防止了注入SQL攻击。由于在数据处理时引入了加密过程, 因而会对系统的运行速度有影响。

3 结语

通过实验, 上述方法可以防范目前常见的SQL攻击。通过综合安全设置并采取安全策略, 将服务器和程序安全都达到一定标准, 才可能将系统安全等级设置较高, 从而防范更多非法入侵, 很好地对数据库信息进行保护。

摘要:互联网服务的多样化使得互联网应用程序不断趋于复杂, 随之而来的应用层漏洞也越来越多。SQL注入是一种常用的应用层攻击手段, 它试图利用服务端程序代码缺陷非法访问服务器数据库。重点分析了SQL注入式攻击的产生及注入原理, 并结合实际应用, 介绍了SQL注入攻击的具体防范措施。

关键词:网络安全,应用层安全,SQL注入,安全漏洞

参考文献

[1] 高峻, 徐志大, 李健.漏洞自动挖掘技术研究进展[J].计算机与数字工程, 2009 (1) :100~104.

[2] 周敬利, 等.一种新的反SQL注入策略的研究与实现[J].计算机科学, 2006 (133) .

[3] 刘振华, 等.管理信息系统的安全性研究[J].微处理机, 2006 (4) :72~75.

[4] 曾长军, 等.SQL Server数据库原理及应用[M].人民邮电出版社, 2007.

上一篇:论企业如何加强应收账款管理下一篇:大模板技术在圆形混凝土结构中的新用