sql注入测试工具如何防范SQL注入——测试篇_mssql数据库

来源:百度文库 编辑:神马文学网 时间:2024/04/27 23:46:24
 灌注-编程篇》中,我们讲了对于程序员而言,如何编码以防范代码存在SQL灌注缝隙,那么,对于职员来说,如何测试SQL灌注缝隙是不是存在呢?
  起首,我们将SQL灌注攻击能分为以下三品类型:
  Inband:数据经由SQL代码灌注的通道取出,这是最直接的一种攻击,通过SQL灌注获取的信息直接反映到应用程序的Web页面上;
  Out-of-band:数据通过不同于SQL代码灌注的方式获患上(譬如通过邮件等)
  推理:这种攻击是说并无真正的数据传输,但攻击者可以通过发送特定的哀求,重组返回的结果从而获患上一些信息。
  岂论是哪种SQL灌注,攻击者都需要构造一个语法正确的SQL查询,如果应用程序对一个不正确的查询返回了一个错误消息,那么就和容易重新构造初始的查询语句的思维规律,进而也就能更易的举行灌注;如果应用程序隐藏了错误信息,那么攻击者就必需对查询思维规律举行逆向工程,即我们所谓的“盲SQL灌注”
  黑盒测试及示例: 这个测试的第一步是理解我们的应用程序在什么时辰需要访问数据库,典型的需要访问数据库的时机是: 认证表单:输入用户名和暗码以查抄是不是有权限
  搜刮引擎:提交处理字符串以从数据库中获取响应的记载
  电子商务站点:获取某类商品的价格等信息
  作为测试职员,我们需要列对所有输入域的值可能用于查询的字段做一个表单,包括那一些POST哀求的隐含字段,然后截取查询语句并孕育发生错误信息。第一个测试往往是用一个单引号“‘”或是分号“;”,前者在SQL中是字符串终结符,如果应用程序没有过滤,则会孕育发生一条错误信息;后者在SQL中是一条SQL语句的终结符,同样如果没有过滤,也会孕育发生错误信息。在Microsoft SQL Server中,返回的错误信息一般是这样:
  同样可用于测试的另有“--”以及SQL中的一些诸如“AND”的关键字,通常很常见的一种测试是在要求输入为数码的输入框中输入字符串,会返回如下的错误信息:
  类似上边这样的堕落返回信息能让我们知道很多数据库的信息,通常不会返回那么多信息,会返回诸如“500 Server Error”的信息,那就需要“盲SQL灌注”了。注重,我们需要对所有可能存在SQL灌注缝隙的输入域举行测试,并且在每个测尝试使用例时只变化一个域的值,从而才气找到真正存在缝隙的输入域。
  下面我们看一下标准的SQL灌注测试是怎样的。
  我们以下面的SQL查询为例:
  如果我们在页面上输入以下的用户名和暗码:
  那么整个查询语句就变为:
  假定参数值是通过GET方法传递到办事器的,且域名为www.example.com,那么我们的访问哀求就是:
  对上边的SQL语句作简单分析后我们就知道由于该语句永远为真,所以肯定会返回一些数据,在这种环境下现实上并未验证用户名和暗码,并且在某些系统中,用户表的第一行记载是办理员,那这样造成的后果则更为严重。
  别的一个查询的例子如下:
  在这个例子中,存在两个需要别人解答的题目,一个是括号的用法,另有一个是MD5哈希函数的用法。对于第一个需要别人解答的题目,我们可以很容易找到缺掉的右括号解决,对于第二个需要别人解答的题目,我们可以想办法使第二个条件掉效。我们在查询语句的最后加上一个注解符以表示后面的都是注解,常见的注解肇始符是/*(在Oracle中是--),也就是说,我们用如下的用户名和暗码:
  那么整条SQL语句就变为:
  我们的URL哀求就变为:
  http://www.example.com/index.php?username=1'%20or% 20'1'%20=%20'1'))/*&password=foo Union查询SQL灌注测试
  另有一种测试是利用Union的,利用Union可以毗连查询,从而从其他表中获患上信息,假定我们就象下的查询:
  然后我们设置id的值为:
  那么整体的查询就变为:
  显然这样就能获患上所有信用卡用户的信息。
  盲SQL灌注测试
  在上边我们提到过盲SQL灌注,即blind SQL injection,它象征着对于某个操作我们患上不到不论什么信息,通常这是由于程序员已编写了特定的堕落返回页面,从而隐藏了数据库结构的信息。
  利用推理方法,有时候辰我们可以或许恢复特定字段的值。这种方法通常采用一组对办事器的布尔查询,依据返回的结果来推断结果的寄义。仍然延续上边的www.example.com,有一个参数名为id,那么我们输入以下url哀求:
  显然由于语法错误,我们会获患上一个预先界说好的堕落页面,假定办事器上的查询语句为SELECT field1, field2, field3 FROM Users WHERE Id='$Id',假定我们想要获患上用户名字段的值,那么通过一些函数,我们就能够逐字符的读取用户名的值。在这里我们使用以下的函数:
  我们界说id为:
  那么最终的SQL查询语句为:
  那么,如果在数据库中有效户名的第一个字符的ASCII码为97的话,那么我们就能获患上一个真值,那么我们就接续寻找该用户名的下一个字符;如果没有的话,那么我们就递增猜测第一个字符的ASCII码为98的用户名,这样反复下去就能判断出正当的用户名。
  那么,什么时辰我们可以竣事推理呢,我们假定id的值为:
  此中N是我们到目前为止已分析的字符数目,那么整体的sql查询为:
  这个查询的返回值若是真,那我们就已完成了推理并且我们已获患上了想要的数值,如果为假,则表示我们还要接续分析。
  这种盲SQL灌注会要求我们输入大量的sql尝试,有一些自己主动化的东西可以或许帮我们实现,SqlDumper就是这样的一种东西,对MySQL数据库举行GET访问哀求。
  存储过程灌注
  在上一篇《如何防范SQL灌注—编程篇》中,我们提到使用存储过程是可以或许防范SQL灌注的,但同时也要注重,存储过程如果使用不恰当,使用存储过程的动态查询事实上也会造成一定的SQL灌注缝隙。
  以下面的SQL存储过程为例:
  用户的输入如下:
  后面则显而易见,用户的所有暗码都被更改且获患上了报表信息。