科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道OWASP要素增强Web应用程序安全(4)

OWASP要素增强Web应用程序安全(4)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

注入缺陷,尤其是SQL注入漏洞,是企业所面临的Web应用程序环境中最大的风险。这里我们将介绍注入缺陷的种类以及SQL注入攻击,并介绍一些可以增强Web应用程序环境安全性的措施。

作者:ZDNet China 2008年4月14日

关键字: Web安全 安全管理 漏洞管理

  • 评论
  • 分享微博
  • 分享邮件

这里我将向大家介绍位于列表第二位的注入式漏洞。首先我们会简要介绍一下注入式攻击,然后深入分析SQL注入式攻击。因为SQL注入式攻击是企业Web应用程序最容易遭受的攻击类型。

什么是注入式缺陷?

简单地讲,注入式缺陷可依让攻击者通过“巧妙”的内容输入来改变应用程序的执行动作。比如改变接入控制,允许攻击者创建、修改、删除或者读取任何该应用程序可以读取的数据。根据OWASP的说明,最糟的情况可以使得Web应用程序彻底崩溃。

注入式缺陷是由于程序开发人员对于用户输入的字符内容的假定过于简单而引起的。程序员没有考虑到用户可能会输入一些含有语义性内容的字符串,或者程序员没有对Web程序的输入内容进行全面有效的审核和过滤。

注入式攻击主要包括三类:

◆系统调用
◆Shell 命令
◆SQL 注入

本文下面的内容将详细介绍SQL注入攻击的细节。如果想了解更多注入漏洞的信息,可以查看Injection Flaws 。

SQL注入式攻击

在这种注入式漏洞中,用户输入的内容是不会被过滤的。因此攻击者可以在输入的内容中加入SQL语句以及参数,从而实现数据库操作。

2004年Stephen Kost在它的报告(An Introduction to SQL Injection Attacks for Oracle Developers)中介绍了四种基本的 SQL注入攻击:
 
◆SQL操作—攻击者通过变量操作改变 SQL语句 (e.g., UNION)。攻击者还可以通过修改WHERE 对象获取更多的数据库信息。

◆代码注入—在代码注入式攻击中,黑客在现有的SQL代码中加入一条活多条新的SQL语句。如果数据库在处理每个请求时不允许执行多个操作语句,那么就可以有效地避免这类SQL注入式攻击。

◆功能调用注入—在一个SQL语句中加入功能调用,可以构成一个功能调用形式的注入式攻击。这种攻击可以造成系统功能调用或者对数据表中的内容进行操作。

◆缓冲溢出—这种攻击主要针对那些没有打补丁的数据库服务器。通过输入特定的内容造成系统错误或执行恶意代码。
 
下面我们就来看看针对Oracle数据库的SQL操作攻击范例。图A显示的是由Web程序开发人员编写的用户登录系统中检测用户名和密码的代码。

OWASP要素增强Web应用程序安全(4)

图A SQL操作攻击范例 (预期输入) (Kost, 2004)

而图B显示了由攻击者输入的用户名和密码。这里我们可以看到,攻击者在输入密码的时候加入了OR运算符,并且加入了a=a,这使得密码判断总为TRUE。由于操作优先于规则的原则,WHERE对于任何一个密码都会得到TRUE的结论。

OWASP要素增强Web应用程序安全(4)

图B SQL操作攻击范例  (任意输入) (Kost, 2004)

有关其他攻击类型的范例,我们可以查看Kevin Spett 写的SPI Dynamics公司文档SQL Injection。

防御SQL注入攻击

防御任何类型的注入式攻击的最主要的方式就是对输入内容进行检查。这包括Web应用程序的各个界面获取的外来输入内容。图C展示了Web应用程序可能获取外来输入内容的四个渠道。

OWASP要素增强Web应用程序安全(4)

图C Web应用程序输入

来自这几种途径的用户输入内容都有可能改变Web应用程序对数据库内容的访问、处理和显示。比如攻击者可以在查询请求中添加、删除或者修改URL参数。被隐藏的表单可能会被修改,也可能出现表单重复提交的情况。而数据库的信息,尤其是由其他程序写入的区域,很可能被有目的的或者偶然的被感染。这些漏洞的类型和数量完全是根据系统程序的漏洞和攻击者的智慧来确定的。

抵御此类攻击的最有力方式就是加强代码的安全性。以下列出了Web应用程序开发团队应当遵守的一些原则:

1.对任何输入内容进行检查。接受所有可以接受的内容,拒绝所有不能接受的内容。
2.在服务器上进行二次检查. 在客户端上的内容检查并不是真正意义上的检查。比如黑客很容易在自己的终端上禁用脚本执行,从而防止客户端的内容检查脚本运行,使得他可以输入恶意代码并成功地提交表单。
3.防止过分详细的错误提示。 攻击者经常会故意输入错误的内容,进而分析系统给出的错误提示信息,从中获取系统信息,发现可能存在的漏洞。
4.使用积极的过滤而不是消极的过滤。 换句话说,就是检查应该输入什么,而不是检查不应该输入什么。只规定哪些内容不应该输入,会留下太多的漏洞。因为有很多内容都不应该被输入,软件开发人员不可能一次都总结出来。积极的过滤方式应该包括:

a.是否是正确的数据类型 (字符串,整数,等)
b.是否要求带有参数
c.字符编码是否允许
d.输入内容是否达到了内容长度的最大或者最小界限
e.是否允许输入空值
f.如果应该输入数字,那么确定数字大小的范围。
g.输入内容是否造成了数据重复,如果是,判断这种情况是否可以接受。
h.输入内容是否符合格式要求(比如是否采用正则表达式)
i.如果是通过下拉列表选取的内容,确保其包含了有效的值

5.实行内部代码检查机制或"buddy checks". 也就是让你的程序员之间互相检查代码。在本系列文章的后面,我会讲到自动实现这一检查的方式。当然,在检查时要确保合法的数据被允许,非凡的数据不被允许。
6.消除语法符号的输入。 确保来自用户提交的内容不会被执行。把用户输入的尖括号改为方括号,或其他符号。
7.使用 "最低权限" 限制数据库用户的权限。
8.考虑使用默认拒绝表达式。 Kevin Spett提供了一个正则表达式的测试范例,正则表达式应该只会返回一下字符串中的数字和字母:
s/ [^0-9a-zA-Z]//

总结

由于企业Web应用程序所面对的几乎全部攻击都是通过非法输入内容导致的,因此确保程序开发过程的标准化可以有效地避免注入式攻击的发生。确保用户输入的内容不会被系统执行,是保护企业网络和数据的第一步。

(责任编辑:陈毅东

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章