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

 

这里我将向大家介绍位于列表第二位的注入式漏洞。首先我们会简要介绍一下注入式攻击,然后深入分析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应用程序所面对的几乎全部攻击都是通过非法输入内容导致的,因此确保程序开发过程的标准化可以有效地避免注入式攻击的发生。确保用户输入的内容不会被系统执行,是保护企业网络和数据的第一步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值