其实对于初学SQL注入,并不需要区分注入类型。
想要学好一种漏洞最重要的是理解漏洞的原理,也就是漏洞源码,
测试漏洞链接: http://45.32.81.200:8080/vul/sqli/sqli_blind_b.php
先看一下什么是盲注,当输入 kobe 后,
--------------------------------------------------------------
-------------------------------------------------------------
如上图 ,可以查询到他的相关信息
根据之前所说的字符型注入可知(之前写的博客),如果这里存在字符型注入,那么输入 kobe ' or 1=1#
所有信息会暴露出来,如下图
-------------------------------------------------------------
-------------------------------------------------------------
但是这里输入kobe ' or 1=1# 确没有显示,难道这里没有注入的漏洞吗?
于是决定开挂,看看他的原码到底是啥
-----------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
初学盲注的人,看这段代码可能会看的云里雾里,实际上不需要看懂他,
简单的解释一下,当刚刚输入kobe ' or 1=1# 其实信息已经被后台查出来了
后台执行的语句为 select id,email from member where username='kobe ' or 1=1#'
(井号用于注释后面的引号),所以无论username输入的是啥 ,后面的1=1 都为永真
但是,为什么查询到的记录并没有显示到页面上呢???
很简单,因为看原码 有一句
if ( $result && $mysqli_num_rows($result)==1 ){
理解这句话关键是理解 $mysqli_num_rows()这个函数 ,可以百度一下,
该函数的功能: 返回结果集中行的数量
简单的说这行代码的意思是,如果后台查询到的 查询结果为非空,并且只有一行,就为真
所以我们输入 kobe ' and 1=1# 和 输入 kobe 返回的结果是一样的
于是可以用后面的and逻辑来进行判断 ,例如输入
kobe' and length(database())>8 #
再输入 kobe' and length(database())<8 #
根据返回的不同,可以判断数据库的长度是大于8,还是小于8
常见的测试函数还有很多 例如substr函数,substr()用法
substr("abcd",1,2) 从 第一个字母开始截取,截取2 个,结果为 ab
于是可以继续构造payload ,例如输入
kobe' and substr(database(),1,1)>'c' #
并且输入 kobe' and substr(database(),1,1)<'c' #
根据返回的不同结果,就可以判断数据库名的第一个字母是否大于c
好了,以上就是关于bool的盲注
来,直接上代码
-----------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------
与bool盲注的代码类似,也是这么个逻辑,就是只要查出的信息多于一行,就不会正常输出
但是,与bool盲注不同的是,即使输入后查询正确信息,且查出为一行,输出的也是和非正常输出的一样
所以,再用之前的payload ,并不能让我们得到有用的信息了
mysql中有一个这样的函数,sleep(),该函数的作用就是休眠
既然我们不能从页面显示的信息来判断,那是否可以用时间来呢???
测试链接 http://45.32.81.200:8080/vul/sqli/sqli_blind_t.php
输入 kobe' and sleep(5) #
等待5秒,信息才会显露出来
现在,用mysql中的if来进一步判断,与之前的bool注入类似,这里就多用一个if函数
输入 kobe ' and if ((substr(database(),1,1))='p',sleep(5),null)#
如果 (substr(database(),1,1))='p' 函数为真 ,执行sleep(5),否则什么也不执行
好了,这里就是盲注的基于时间注入了 (找到盲注漏洞后,一般都用sqlmap来拿库)