1 基于时间型SQL盲注
注入SQL 代码之后, 存在以下两种情况:
- 如果注入的SQL代码不影响后台[ 数据库] 的正常功能执行, 那么Web 应用的页面显示正确( 原始页面) 。
- 如果注入的SQL 代码影响后台数据库的正常功能( 产生了SQL 注入) , 但是此时Web 应用的页面依旧显示正常( 原因是Web 应用程序采取了“ 重定向" 或“ 屏蔽 ”措施)。
产生一个疑问: 注入的SQL 代码到底被后台数据库执行了没有? 即web 应用程序是否存在SQL 注入?
面对这种情况, 之前讲的基于布尔的SQL 盲注很难发挥作用了( 因为基于布尔的SQL 盲注的前提是web 程序返回的页面存在true 和false 两种不同的页面) 。这时, 一般采用基于web 应用响应时间上的差异来判断是否存在SQL 注入, 即基于时间型SQL 盲注。
1.1 sleep()函数——延时函数
通过逻辑判断控制sleep()函数的执行
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
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);
1.4 注入思路:
基于时间盲注的一般思路是延迟注入,说白了就是利用sleep()或benchmark()等函数让mysql执行时间变长并结合判断条件语句if(expr1,expr2,expr3),然后通过页面的响应时间长短来判断语句返回的值是TRUE还是False,从而猜解一些未知的字段。
注入流程(以获取数据库版本信息为例):
- 确定注入点及注入类型
- 使用if判断语句,猜测version()的长度并用sleep函数作为判断依据
- 重复步骤2直至获取真正长度
- 使用if判断语句,猜测version()的第一个字符的ascii码并使用sleep函数作为判断依据构造注入语句,
- 重复步骤4,直至获取全部长度的版本字符的ascii码