Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'BaiduLinkSeo_Plugin' does not have a method 'post' in /var/www/html/build/var/Typecho/Plugin.php on line 489
sql注入-false注入 - Miagz's blog

sql注入-false注入

由 Miagz 发布

前言

今天看到一篇非常有意思的文章,我将它整理了下来分享分享

False注入

首先我给大家抛出一个问题

为什么user=0会返回所有数据呢?先别着急下结论,我们再看看下面的例子

那为什么host=0却不返回任何数据呢?它们类型不同?

先不着急,我们先讲讲别的,MySQL中其实有一种隐式类型转换,以下我在网上找来的关于隐式类型转换解释

如果两个参数比较,有至少一个NULL,结果就是NULL,除了是用NULL<=>NULL 会返回1。不做类型转换
如果两个参数都为字符,那么就按照字符来比较,不做类型转换
如果连个参数都为整数,那么就按照整数来进行比较,不做类型转换
有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
所有其他情况下,两个参数都会被转换为浮点数再进行比较

注意,请看最后一段,如果将字符与数字进行比较的话,那么mysql就会将字符与数字转换为浮点数,无疑字符转换为浮点数肯定是会失败的

我们看看下面这些例子:

在sql语句中,如果加上了引号的话,那么数据库就会判定这是一个字符型的参数。但是如果字符串开头是数字的话,那么数据库就会截断数字后面的任何字符,并且转换为数字

现在的话就可以很容易理解为什么user=0会返回所有的数据,而host=0不会返回数据了,因为 user是字符型而0为整数型,数据库会将user和0转换为浮点数,因为user转换为浮点数肯定会出错的,所以返回一个0,那么就变成0=0进行比较,返回一个true,因此sql语句差不多就变成了:

select * from tab;

最终返回了所有数据,host=0不会返回数据是因为host里面存放的都是IP,开头都是数字数据库就会将host转换为数字再与0进行比较,因为host开头大于0所以条件不成立返回任何数据

利用

在实际过程中,很多的传参变量一般都是where user='$user'或者 where user='+input+' 我们就要利用false注入使其成功获取数据

使用 '+'来进行绕过

使用 '/进行绕过

还有很多很多方式我有不一一概述了直接上图


暂无评论

发表评论