[原创]网站安全测试和OWASP十大Web漏洞 之 SQL注入攻击

上一篇 / 下一篇  2008-04-17 14:32:29

注入攻击,特别是SQL注入攻击是网站常见的安全缺陷。攻击者将恶意构造的输入字符串提交到服务器端,由解释程序(如数据库的SQL执行程序)执行,此时可能产生安全问题。

SQL注入漏洞具有 易于被发现,容易被利用的特点,并会造成以下的一些严重后果:

  1. 暴露敏感的信息,如关键客户的机密数据等。
  2. 攻击者以其他具有更大权限的用户身份登录系统(认证问题)。
  3. 攻击者绕过程序中的权限检查,进行非法操作(授权问题)。

下面来介绍SQL注入是如何产生的,这里给出一个用户查询“属于自己的记录”的例子。

我们假设有以下的一段C#程序代码:

string userName = ctx.getAuthenticatedUserName();

string query = "SELECT * FROM items WHERE ōwner = '" + userName

      + "' AND itemname = '" + ItemName.Text + "'";

sda = new SqlDataAdapter(query, conn);

DataTable dt = new DataTable(); sda.Fill(dt);

其目的是为了动态构造这样的一个查询:

SELECT * FROM items WHERE ōwner = '' AND itemname = '' ;

常见的情况下,owner这个参数是由session里保存的当前登录用户决定的。第2个参数,则存在于一个查询的表单中的,如果我们为itemname参数输入以下的字符串:

name' OR 'a'='a

那么构造的语句就会变为:

SELECT * FROM items WHERE ōwner = 'any' AND itemname = 'any' OR 'a'='a';

相当于:

SELECT * FROM items;

结果是在搜索页面中显示了所有的用户的记录。

类似,我们可以通过在第二个参数中输入:

name'; DELETE FROM items; SELECT * FROM items WHERE 'a'='a

构造下面的一个查询语句:

SELECT * FROM items WHERE ōwner = 'any' AND itemname = 'name'; DLETE FROM items;SELECT * FROM items WHERE 'a'='a';

在“一次调用允许执行多条SQL语句”的数据库平台中,这个命令将删除表中的全部记录。

以上可见,SQL注入的漏洞是极其危险的,这里介绍两点有效的预防措施:

  • 在数据访问层,使用ORM(Object Relational Mapping)框架,如Hibenre、NHibernate 或 EJB实体Bean技术。
  • 使用参数类型强制检测的参数化查询。

另外,可以注意:

  • 使用统一的输入验证机制来保证用户数据的长度、类型、语法和业务规则是符合要求的。“接受已知安全的字符”要优于“排除给定的不安全字符”;“拒绝不合法的输入”而不是“尝试进行编码等转换操作”。
  • 在验证前进行字符的转码,并且不要进行二次的转码。因为通过验证的字符,在转码后也可能变为非法。
  • 降低外网UI上可调用的数据库操作方面的能力,限制包含重要数据库管理命令的系统后台的使用。
  • 避免显示底层数据库的出错信息给最终用户,它会对攻击者提供帮助。
  • 存储过程是相对安全的,但可能同样存在缺陷,如在在存储过程内部构造参数。
  • 避免使用类似mysql_query()的动态查询接口;使用更安全的字符串转义函数,如mysql_real_escape_string() 比str_replace("'", "")更加有效;操作的表明,不要作为参数提供。

对于以上提到的措施,通过引入框架、制定编程规范和代码Review,是可以预防和检测的。对于黑合测试,我们则可以包含以下的测试场景:

=================================================================

SQL注入预防和测试:

  1. 如果您使用的Struts这个目前最流行的J2EE MVC开源框架,可阅读下面的文章,考虑引入HDIV开源项目。那样,只需测试该框架是否起作用了,可以少写或不写其他的安全测试用例:
  2. 同样,如果使用MySQL,可以安装这个过滤器程序 -GreenSQL Open Source SQL Injection Filter
  3. 对于输入检查:测试时,必须是做服务器端的表单验证;可以考虑用JMeter模拟HTTP请求,并为每个输入字段作参数化。
  4. 记住, 千万不要忘记 除文本框之外的 选择框和隐藏字段等 都是要测试的。 
  5. 可能的测试用例如下:

白盒检查:

    • 是否只通过安全框架的给定接口访问数据库。
    • 字符转码后,才进行非法字符验证测试。

黑盒测试

    • 针对 所有表单字段(如:认证表单、查询表单和实体增删改表单等),进行长度、类型、语法和业务规则的服务器端验证;并确认只包含安全字符。
    • 用户访问中发生的任何错误,已经配置成导向到特定的错误页面,不显示底层错误信息。
    • 表单字段中,重点测试的有单引号(') 、分号(;)、注释(-- 和 /*.) 、SQL操作符(UNION, AN, OR),函数(SUBSTRING, ASCII ,LENGTH)。
    • 如果项目未引入任何技术框架来预防漏洞,则采用的基本测试方法可参考OWASP中的文章 -Testing for SQL Injection, 针对SQL Server, Oracle和MySQL,其都做了详尽的介绍。

www.ChinaQA.com, Chico Chen,chicochen@hotmail.com


TAG: 软件测试 SQL注入 OWASP

『街角↗看流年╮╮╮ 引用 删除 milaxiaomin   /   2012-07-31 14:27:02
5
Drayce的个人空间 引用 删除 Drayce   /   2012-01-10 17:37:50
5
 

评分:0

我来说两句

Open Toolbar