DVWA系列之6 SQL注入漏洞的挖掘与防御

下面我们来查看high级别的SQL注入源码。

image

可以看到除了之前的mysql_real_escape_string()函数之外,在它前面还多加了一个stripslashes()函数,这个函数的作用是删除由 addslashes() 函数添加的反斜杠,也就是去除addslashes()函数的转义。

这里为什么要有这个操作呢?这是由于在high级别下,PHP的magic_quotes_gpc被自动设为on,magic_quotes_gpc被称为魔术引号,开启它之后,可以对所有的GET、POST和COOKIE传值的数据自动运行addslashes()函数,所以这里才要使用stripslashes()函数去除。magic_quotes_gpc功能在PHP5.3.0中已经废弃并且在5.4.0中已经移除了,这也是为什么在DVWA中一直强调使用mysql_real_escape_string()函数进行过滤的原因吧。

另外还可以发现,在执行查询之前,使用了if语句进行判断,判断的条件是一个is_numeric()函数,也就是判断用户输入的数据是否是数字型,只要不是数字型就一概报错,这样那些and、or、select等语句都无法执行了。

最后在具体执行查询时,还要求$id是字符型。经过这样重重防护,这样页面就很难注入了。

所以DVWA中的high级别其实是为我们展示了一个样板,告诉我们该如何从代码层面来防止SQL注入。至于high级别能否被注入,那估计只有那些真正的黑客高手才能做到了。

最后总结一下,如何从代码层面防止SQL注入。

  • 对于数字型注入,只要使用if语句,并以is_number()函数作为判断条件就足以防御了。

  • 对于字符型注入,只要对用于接收用户参数的变量,用mysql_real_escape_string()函数进行过滤也就可以了。

那么又该如何从代码层面来挖掘SQL注入漏洞呢?

这里的首要原则是:用户的一切输入都是有害的,或者说是不被信任的。

所以漏洞挖掘主要可以从以下几个方面着手:

一是代码中负责获取用户数据的变量,这些变量主要包括:$_GET、$_POST、$_COOKIE、$_SERVER。

二是代码中负责执行数据库查询操作的函数,如mysql_query()。

我们可以在代码中对这些变量和函数进行搜索跟踪,从而分析是否存在漏洞。

这里可以使用一款名叫闪电文件搜索的软件来进行查找分析,如下图所示。

image

我们从中选取DVWA的登录文件login.php进行分析,可以发现这里的参数类型是字符型,主要从两个方面采取了防御措施:一是使用mysql_real_escape_string()函数进行过滤,二是在mysql_query()函数之前加了@符号,抑制报错信息。因而这个页面就是相对安全的。

image

本文出自 “一壶浊酒” 博客,转载请与作者联系!

你可能感兴趣的:(sql注入,挖掘,high,防御,dvwa)