基于时间型SQL盲注
如图所示
在我们注入了SQL代码之后,存在以下两种情况:
- 如果注入的SQL代码不影响后台[数据库]的正常功能执行,那么Web应用的页面显示正确(原始页面)。
- 如果注入的SQL代码影响后台数据库的正常功能(产生了SQL注入),但是此时Web应用的页面依旧显示正常(原因是Web应用程序采取了“重定向”或“屏蔽”措施)。
这时候,我们就会产生一个疑问:我们注入的的SQL代码到底被后台数据库执行了没有?即Web应用程序是否存在SQL注入?
面对这种情况,之前讲的基于布尔的SQL盲注就很难发挥作用了(因为基于布尔的SQL盲注的前提是Web程序返回的页面存在true和false两种不同的页面)。这时,我们一般采用基于web应用响应时间上的差异来判断是否存在SQL注入,即基于时间型SQL盲注。
if语句/if()函数
在基于时间型SQL盲注中,我们经常使用条件语句来判断我们的操作是否正确:
if condition then do_something else do_something_else11
即如果某条件发生,那么执行语句一;否则,执行语句二。
在mysql中,if()函数语法如下:
IF(expr1,expr2,expr3)
如果 expr1 为真,则 IF()函数执行expr2语句; 否则 IF()函数执行expr3语句。
sleep()函数
在mysql中,sleep()函数语法如下:
sleep(seconds)
即sleep() 函数代码执行延迟若干秒。
BENCHMARK()函数
在mysql中,BENCHMARK()函数语法如下:
BENCHMARK(count,expr)
即BENCHMARK()函数重复执行表达式expr count次。
一般情况下,我们不建议使用BENCHMARK()函数,因为其消耗大量的CPU资源。
Less-6
接下来,我们一less-6为例,学习基于时间型SQL盲注。
我们在这里使用IF(查询语句,1,sleep(5)),即如果我们的查询语句为真,那么直接返回结果;如果我们的查询语句为假,那么过5秒之后返回页面。所以我们就根据返回页面的时间长短来判断我们的查询语句是否执行正确,即我们的出发点就回到了之前的基于布尔的SQL盲注,也就是构造查询语句来判断结果是否为真。
步骤一 枚举出当前数据库名
如图所示
database()即能显示当前数据库,然后通过比较当前当前数据库的ascii码来枚举当前数据库的具体字符(建议采用二分法来一一枚举)。
最后,我们得到当前数据库为“security”。
步骤二 枚举当前数据库的表名
这里我们仅仅展示枚举当前数据库第一个表的第一个字符的方法,如图所示:
可以看出,当我们将表的第一个字符与102比较时,过了5秒之后才浏览器才显示(忽略下面的内容),即表的第一个字符大于102为假。然后我们将表的第一个字符与100比较,浏览器直接显示,即表的第一个字符大于100。这样就能得到表的全部字符。
最后,我们得到当前数据库第一个表名为“emails”。
步骤三 枚举当前数据表的字段名
这里,我们完整的展示枚举当前数据表的第一个字段名。如图所示:
很多人会疑惑,我们究竟怎么判断我们得到的各个字符就是完整的字段名呢?因为我们并不知道字段的长度。
这个很简单,就是当我们在枚举字段名时,如果我们直接与1进行比较(即假设当前字符的ascii码大于1),如果这都显示错误,那一般情况下,我们可以认为我们已经得到了完整的字段名了。如图所示:
步骤四 枚举各个字段对应的数据项内容
在这一步的时候,遇到了一下问题,具体如下:
如果有人知道是什么原因,希望能指导我一二!