基本概念

SQL注入漏洞是指,攻击者能够利用现有Web应用程序,将恶意的数据插入SQL查询中,提交到后台数据库引擎执行非授权操作。

主要危害

●非法查询、修改或删除数据库资源。
●执行系统命令。
●获取承载主机操作系统和网络的访问权限。

SQL注入漏洞的风险要高于其他所有的漏洞,原因如下。
●SQL注入攻击具有广泛性。SQL注入利用的是SQL语法,这使得所有基于SQL语言标准的数据库软件,包括SQL Server、Oracle、MySQL、DB2和Informix等,以及与之连接的网络应用程序,包括Active/Java Server Pages、PHP或Perl等都面临该类攻击。当然各种软件都有自身的特点,实际的攻击代码可能不尽相同。此外,SQL注入攻击的原理相对简单,介绍注入漏洞和利用方法的教程等资源非常多。这些因素造成近年SQL注入攻击的数量一直居高不下。
●相较于其他漏洞,对于SQL注入漏洞的防范要困难。例如,要实施缓冲区溢出攻击,攻击者必须首先能绕过站点的防火墙,而SQL注入内容往往作为正常输入的一部分,能够通过防火墙的控制审查,访问数据库进而获得数据库所在服务器的访问权。

防御措施

代码层漏洞防护

基本措施

  • 采用强类型语言,如Java、C#等强类型语言几乎可以完全忽略数字型注入。
  • 尽可能避免使用拼接的动态SQL语句,所有的查询语句都使用数据库提供的参数化查询接口。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。
  • 在服务器端验证用户输入的值和类型是否符合程序的预期要求
    一般应验证以下内容。
  • 检查字段是否为空,要求其长度大于零,不包括行距和后面的空格。
  • 检查字段数据类型是否符合预期要求,如所有HTTP请求参数或Cookie值的类型都应是字符串。
  • 检查输入字段长度是否符合预期要求。
  • 根据功能需求定义的允许选项来验证用户输入的数据。
  • 检查用户输入是否与功能需求定义的模式匹配。
  • 在服务器端对用户输入进行过滤。针对非法的HTML字符和关键字,可以编写函数对其进行检查或过滤。
  • 需要检查或过滤的特殊字符至少应包含:、&、;、$、%、@、'、"、,、\、+、*、\'(反斜杠转义单引号)、\"(反斜杠转义引号)、<>(尖括号)、()(小括号)、CR(回车符,ASCII0x0d)或LF(换行,ASCII0x0a)
  • 需要检查或过滤的关键字至少应包含(不区分大小写):and、exec、insert、select、delete、update、count、chr、mid、master、truncate、char、declare、backup或script
  • 避免网站显示SQL错误信息,如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
  • 加固应用程序服务器和数据库,利用最低权限账户与数据库连接。

安全规范

Web安全开发中应当遵循安全规范。

使用专业的漏洞扫描工具进行安全性测试

常见的SQL注入漏洞扫描工具如下。

  • SQLMap(http://sqlmap.sourceforge.net):一款被称为SQL注入第一神器的开放源代码工具,可以自动探测和利用SQL注入漏洞及接管数据库服务器的过程。SQLMap支持多种数据库、多种类型和模式的注入。
  • Pangolin(中文译名“穿山甲”):一款目前国内使用率很高的SQL注入测试软件。它能够通过一系列简单的操作,完成从检测注入到控制目标。