最小权限法: 为了避免注入攻击对数据库造成的损害,我们可以把每个数据库用户的权限尽可能缩小,不要把DBA或管理员的权限赋予你应用程序账户,在给用户权限时是基于用户需要什么样的权限,而不是用户不需要什么样的权限。当一个用户只需要读的权限时,我们就只给他读的权限,当用户只需要一张表的部分数据时,我们宁愿另建一个视图让他访问。 如果你的策略是都是用存储过程的话,那么仅允许应用程序的账户执行这些查询,而不给他们直接访问数据库表的权限。诸如此类的最小权限法能够在很大程度上保证我们数据库的安全。 输入验证白名单法: 输入验证能够在数据传递到SQL查询前就察觉到输入是否正确合法,采用白名单而不是黑名单则能在更大程度上保证数据的合法性。
上面说的是关于sql注入漏洞的产生和开发人员的防范方式,那么对于我们测试人员来说,如何测试sql注入漏洞是否存在呢? 首先,我们将SQL注入攻击能分为以下三种类型: Inband:数据经由SQL代码注入的通道取出,这是最直接的一种攻击,通过SQL注入获取的信息直接反映到应用程序的Web页面上; Out-of-band:数据通过不同于SQL代码注入的方式获得(譬如通过邮件等) 推理:这种攻击是说并没有真正的数据传输,但攻击者可以通过发送特定的请求,重组返回的结果从而得到一些信息。 不论是哪种SQL注入,攻击者都需要构造一个语法正确的SQL查询,如果应用程序对一个不正确的查询返回了一个错误消息,那么就和容易重新构造初始的查询语句的逻辑,进而也就能更容易的进行注入;如果应用程序隐藏了错误信息,那么攻击者就必须对查询逻辑进行反向工程,即我们所谓的“SQL盲注” 黑盒测试及示例: 这个测试的第一步是理解我们的应用程序在什么时候需要访问数据库,典型的需要访问数据库的时机是: 认证表单:输入用户名和密码以检查是否有权限 搜索引擎:提交字符串以从数据库中获取相应的记录 电子商务站点:获取某类商品的价格等信息 作为测试人员,我们需要列对所有输入域的值可能用于查询的字段做一个表单,包括那些POST请求的隐含字段,然后截取查询语句并产生错误信息。第一个测试往往是用一个单引号“‘”或是分号“;”,前者在SQL中是字符串终结符,如果应用程序没有过滤,则会产生一条错误信息;后者在SQL中是一条SQL语句的终结符,同样如果没有过滤,也会产生错误信息。在Microsoft SQL Server中,返回的错误信息一般是这样: - Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
- [Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character string ‘’.
- /target/target.asp, line 113
复制代码 同样可用于测试的还有“--”以及SQL中的一些诸如“AND”的关键字,通常很常见的一种测试是在要求输入为数字的输入框中输入字符串,会返回如下的错误信息:
- Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
- [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ‘tester’ to a column of data type int.
- /target/target.asp, line 113
复制代码类似上面这样的出错返回信息能让我们知道很多数据库的信息,通常不会返回那么多信息,会返回诸如“500 Server Error”的信息,那就需要“盲SQL注入”了。注意,我们需要对所有可能存在SQL注入漏洞的输入域进行测试,并且在每个测试用例时只变化一个域的值,从而才能找到真正存在漏洞的输入域。
下面我们看一下标准的SQL注入测试是怎样的,这段我在上边的帖子里说过了,这里再详细重复一下 仍然以下面的SQL查询为例: - SELECT * FROM Users WHERE Username='$username' AND Password='$password'
复制代码 如果我们在页面上输入以下的用户名和密码:- $username = 1' or '1' = '1
- $password = 1' or '1' = '1
复制代码
|