mysql基于时间盲注_基于时间型SQL盲注

1 基于时间型SQL盲注

注入SQL 代码之后, 存在以下两种情况:

如果注入的SQL代码不影响后台[ 数据库] 的正常功能执行, 那么Web 应用的页面显示正确( 原始页面) 。

如果注入的SQL 代码影响后台数据库的正常功能( 产生了SQL 注入) , 但是此时Web 应用的页面依旧显示正常( 原因是Web 应用程序采取了“ 重定向" 或“ 屏蔽 ”措施)。

产生一个疑问: 注入的SQL 代码到底被后台数据库执行了没有? 即web 应用程序是否存在SQL 注入?

面对这种情况, 之前讲的基于布尔的SQL 盲注很难发挥作用了( 因为基于布尔的SQL 盲注的前提是web 程序返回的页面存在true 和false 两种不同的页面) 。这时, 一般采用基于web 应用响应时间上的差异来判断是否存在SQL 注入, 即基于时间型SQL 盲注。

1.1 sleep()函数——延时函数

在MySQL中, sleep() 函数语法如下:

sleep(seconds) ,即sleep() 函数代码执行延迟若干秒。Sleep() 函数执行是有条件的,必须保障sql语句执行结果存在数据记录才会停止指定的秒数,如果sql 语句查询结果为空,那么sleep() 函数不会停止。S1eep 函数执行停留后,执行后返回值为0

mysql基于时间盲注_基于时间型SQL盲注_第1张图片

通过逻辑判断控制sleep()函数的执行

mysql基于时间盲注_基于时间型SQL盲注_第2张图片

1.2 逻辑判断函数if()

在基于时间型SQL盲注中, 经常使用条件语句来判断操作是否正确:

if condition then do_someing else do_something_elsell 即如果某条件发生, 那么执行语句一, 否则, 执行语句二

在MySQL中, if () 函数语法如下:

IF(expr1 ,expr2 ,expr3) 如果expr1 为真, 则IF() 函数执行expr2 语句; 否则IF() 函数执行expr3 语句。

输入:

select user from users where user_id=1 and1=if(ascii (substr(database(),11))>1,sleep(5),1);  //这里如果条件ascii (substr(database(),11))>1成立, 则执行sleep(5) , 否则执行1

mysql基于时间盲注_基于时间型SQL盲注_第3张图片

1.3 BENCHMARK()函数

在MySQL中, BENCHMARK()函数语法如下:

BENCHMARK(count,expr) 即BENCHMARK()函数重复执行表达式expr  count 次,实际表现就是查询延迟。可配合if 函数,实现延迟的注入判断。

构造输入如下:

select

user from users where user_id=1 union select if (ascii

(substring(database(),1,1))>100,BENCHMARK(500000000,encode('MSG' ,'by

5 seconds' )),1);

mysql基于时间盲注_基于时间型SQL盲注_第4张图片

1.4 注入思路:

基于时间盲注的一般思路是延迟注入,说白了就是利用sleep()或benchmark()等函数让mysql执行时间变长并结合判断条件语句if(expr1,expr2,expr3),然后通过页面的响应时间长短来判断语句返回的值是TRUE还是False,从而猜解一些未知的字段。

注入流程(以获取数据库版本信息为例):

确定注入点及注入类型

使用if判断语句,猜测version()的长度并用sleep函数作为判断依据

重复步骤2直至获取真正长度

使用if判断语句,猜测version()的第一个字符的ascii码并使用sleep函数作为判断依据构造注入语句,

重复步骤4,直至获取全部长度的版本字符的ascii码

你可能感兴趣的:(mysql基于时间盲注)