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

上一篇 / 下一篇  2008-04-18 17:58:15 / 个人分类:软件测试技术

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

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

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

下面来介绍SQL注入是如何产生的。

以下面用C#编写的代码为例,该代码试图检查用户名/密码组合是否正确:

   string username = txtUsername.Text;

   string password = txtPassword.Text;

   string SQL = "SELECT * FROM tblUsers

      WHERE username = '"+ username +"'

      AND password = '"+ password + "';";

   //执行SQL

用户名和密码从服务器端的两个文本框获取,并且SQL语句被创建,然后该语句执行。如果没有记录返回,那么表明用户输入的详细资料不正确,或者没有经过注册; 否则用户可以进入到下一个阶段。

如果用户在两个文本框里面输入了Joe和mypassword,那么SQL语句会是:

   SELECT * FROM tblUsers

   WHERE username = 'Joe'

   AND password = 'mypassword';

这正是开发人员的意图。不过要是用户往密码文本框里面输入:' OR 'a' = 'a,SQL就会是:

   SELECT * FROM tblUsers

   WHERE username = 'Joe'

   AND password = ''

   OR 'a' = 'a';

现在,密码不重要了,因为'a'='a'总是正确的。如果用来连接到数据库的账户有权删除数据而不是仅仅有权读取数据,就会出现更糟糕的情形。

假设用户往密码文本框里面输入:

   '; DELETE FROM tblUsers WHERE 'a' = 'a'。

这会得出以下的语句:

   SELECT * FROM tblUsers

   WHERE username = 'Joe'

   AND password = '';

   DELETE FROM tblUsers

   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

 

评分:0

我来说两句

Open Toolbar