第56天-Web安全:SQL注入之盲注深度解析(布尔、延时、报错)

admin 2026-03-03 04:45:33 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统解析了SQL注入中的盲注技术,涵盖布尔盲注、时间盲注和报错盲注三种类型,详细阐述了其原理、适用场景、常用函数及利用过程。文章结合增删改查功能点分析注入构造方式,并提供了实际案例与防御建议,旨在帮助读者深入掌握无回显条件下的SQL注入攻击与防护方法。 综合评分: 85 文章分类: WEB安全,渗透测试,漏洞分析,安全培训,实战经验


cover_image

第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注入的主要因素

  1. 数据库类型(不同数据库语法、函数、权限有差异)

  2. 数据操作方法(增删改查构造的SQL语句结构不同)

  3. 参数数据类型(数字型、字符型、搜索型等,影响闭合方式)

  4. 参数数据格式(是否经过加密、编码、过滤)

  5. 提交数据方式(GET、POST、Cookie、JSON等)

  6. 有无数据处理(回显、报错、逻辑判断等)


🛠️ 常见SQL注入的利用过程

  1. 判断数据库类型

  2. 判断参数类型及格式(数字/字符,闭合方式)

  3. 判断数据格式及提交方式

  4. 判断数据回显及防护机制(有无报错、有无回显)

  5. 获取数据库名、表名、列名

  6. 获取数据或尝试进一步利用(写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注入之盲注深度解析(布尔、延时、报错)》

评论:0   参与:  0