关键字WHERE是SELECT操作的一个判断条件,之前的id=1即查询条件。这里,AND代表需要同时满足两个条件,一个是id=1,另一个是'1'。由于字符串'1'被强制转换成True,代表这个条件成立,因此数据库查询出id=1的记录。
再看图1所示的语句:第1个条件仍为id=1,第2个条件字符串'a'被强制转换成逻辑假,所以条件不满足,查询结果为空。当页面显示为sqli时,AND后面的值为真,当页面显示为空时,AND后面的值为假。虽然我们看不到直接的数据,但是可以通过注入推测出数据,这种技术被称为布尔盲注。
图1
那么,这种情况下如何获得数据呢?我们可以猜测数据。例如,先试探这个数据是否为'a',如果是,则页面显示id=1的回显,否则页面显示空白;再试探这个数据是否为'b',如果数据只有1位,那么只要把可见字符都试一遍就能猜到。假设被猜测的字符是'f',访问http://192.168.20.133/sql2.php?id=1'and'f'='a',猜测为'a',没有猜中,于是尝试'b'、'c'、'd'、'e',都没有猜中,直到尝试'f'的时候,猜中了,于是页面回显了id=1的内容,见图2。
当然,这样依次猜测的速度太慢。我们可以换个符号,使用小于符号按范围猜测。访问链接http://192.168.20.133/sql2.php?id=1'and'f'<'n',这样可以很快知道被猜测的数据小于字符'n',随后用二分法继续猜出被测字符。
上述情况只是在单字符条件下,但实际上数据库中的数据大多不是一个字符,那么,在这种情况下,我们如何获取每一位数据?答案是利用MySQL自带的函数进行数据截取,如substring()、mid()、substr(),见图3。
图2
图3
上面简单介绍了布尔盲注的相关原理,下面利用布尔盲注来获取admin的密码。在MySQL中查询(结果见图4):
然后截取数据的第1位(结果见图5):
于是完整的利用SQL语句如下:
图4
图5
访问链接http://192.168.20.133/sql2.php?id=1'and(select mid((select concat(user,0x7e,pwd)from wp_user),1,1))='a'%23,结果见图6。截取第2位,访问http://192.168.20.133/sql2.php?id=1'and(select mid((select concat(user,0x7e,pwd)from wp_user),2,1))='d'%23,结果与图6的一致,说明第2位是'd'。以此类推,即可得到相应的数据。
图6
在盲注过程中,根据页面回显的不同来判断布尔盲注比较常见,除此之外,还有一类盲注方式。由于某些情况下,页面回显的内容完全一致,故需要借助其他手段对SQL注入的执行结果进行判断,如通过服务器执行SQL语句所需要的时间,见图7。在执行的语句中,由于sleep(1)的存在,使整个语句在执行时需要等待1秒,导致执行该查询需要至少1秒的时间。通过修改sleep()函数中的参数,我们可以延时更长,来保证是注入导致的延时,而不是业务正常处理导致的延时。与回显的盲注的直观结果不同,通过sleep()函数,利用IF条件函数或AND、OR函数的短路特性和SQL执行的时间判断SQL攻击的结果,这种注入的方式被称为时间盲注。其本质与布尔盲注类似,故具体利用方式不再赘述。
图7
| 留言与评论(共有 0 条评论) “” |