护网在即,HVV高频面试题–SQL注入

admin 2026-05-14 14:16:48 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统梳理HVV护网行动中SQL注入高频面试题,涵盖基础原理、MySQL/MSSQL/Oracle等数据库的注入方法、绕过技巧及防御措施。重点解析联合查询、报错注入、布尔盲注、时间盲注等技术的适用场景与实战利用,涉及文件写入、命令执行等红队打点手法,为护网岗位面试提供实用指导。 综合评分: 87 文章分类: WEB安全,红队,渗透测试,安全培训,实战经验


cover_image

护网在即,HVV 高频面试题 – SQL 注入

原创

小智 小智

智榜样网络安全学习中心

2026年5月12日 14:05 湖南

在小说阅读器读本章

去阅读

SQL 注入是 Web 安全领域最经典的漏洞类型,也是 HVV 红蓝对抗红队最常用的打点手段之一,同时是护网相关岗位面试中出现频率极高的考点。本文整理了 HVV 面试中关于 SQL 注入高频题目,覆盖基础原理不同数据库注入方法绕过技巧实战利用防御等维度,贴合护网实战场景

一、SQL 注入基础原理类高频题

1. 什么是 SQL 注入?SQL 注入产生的根本原因是什么?

SQL 注入指的是用户可控的输入数据,被未经处理地拼接到 SQL 语句中,被数据库当作 SQL 指令的一部分执行,最终导致数据库执行非预期的操作。

其产生的根本原因,是应用代码层未对用户输入做严格的校验与过滤,同时 SQL 语句采用了字符串拼接的方式执行,未使用参数化查询等安全机制,让用户输入可以改变原有 SQL 语句的执行逻辑。

2. SQL 注入的主要危害有哪些?

最直接的危害是读取数据库中的敏感数据,包括业务数据、用户账号密码、后台管理员凭证等;可通过注入篡改、删除数据库数据,造成业务数据丢失或业务中断;高权限场景下,可写入文件到服务器,获取 WebShell,进一步执行系统命令控制目标主机;还可借助数据库服务器的网络环境,对内网进行探测,为横向移动铺路。

3. 按照注入点类型,SQL 注入可以分为哪几类?

按照注入点所在的位置,可分为 GET 型注入POST 型注入Cookie 注入HTTP 头注入。其中 HTTP 头注入是 HVV 中容易被业务忽略的场景,常见的注入点包括 User-AgentRefererX-Forwarded-ForClient-IP 等,这类字段常被业务系统记录到数据库中,若未做过滤就会产生注入。

4. 按照数据返回方式,SQL 注入可以分为哪几类?

按照 SQL 执行结果的返回形式,可分为联合查询注入报错注入布尔盲注时间盲注堆叠查询注入。不同的注入方式对应不同的页面响应场景,也是 HVV 实战中需要根据目标环境灵活选择的核心内容

二、MySQL 数据库注入专项高频题

1. MySQL 中联合查询注入的使用条件和执行步骤是什么?

联合查询注入的使用条件有三个:页面存在 SQL 查询结果的回显位;UNION 前后两条 SELECT 语句的查询列数必须一致;对应列的数据类型相互兼容。

执行步骤分为四步:首先通过 ORDER BY 子句判断当前查询的列数;其次通过 UNION SELECT 判断页面上的回显位位置;再利用回显位执行 SQL 函数,依次查询当前数据库名表名字段名;最终通过查询语句读取目标字段中的数据。

实战中常用 UNION ALL 替代 UNION,避免默认去重导致的查询结果丢失。

2. MySQL 中常用的报错注入函数有哪些?分别说明适用场景?

MySQL 中主流的报错注入函数包括 updatexml()extractvalue()floor(rand()*2) group by 组合。

updatexml() 适用于 MySQL 5.1.5 及以上版本,原理是更新 XML 文档时,传入不符合 XML 格式的内容触发报错,单条语句最大返回 32 个字符,实战中可通过字符串截取函数分段获取数据。

extractvalue() 同样适用于 MySQL 5.1.5 及以上版本,原理是解析 XML 文档路径时,传入非法格式的路径触发报错,返回字符限制与 updatexml() 一致,二者常配合使用覆盖完整数据。

floor(rand()*2) group by 适用于 MySQL 5.0 及以上版本,原理是分组查询时,rand() 函数多次计算导致主键重复触发报错,兼容性更广,适合低版本 MySQL 环境。

报错注入适用于页面没有直接的查询结果回显,但会将 SQL 执行的错误信息输出到页面的场景,也是 HVV 中最常用的注入方式之一。

3. 什么是布尔盲注?MySQL 中布尔盲注常用的函数和执行逻辑是什么?

布尔盲注适用于页面没有 SQL 执行结果回显,也没有报错信息输出,但 SQL 语句执行的真假结果,会导致页面返回不同内容的场景,比如页面正常显示与空白、查询成功与失败的不同提示。

常用的函数包括 length()substr()ascii()if()

执行逻辑为:先通过 length() 函数判断目标数据的长度;再通过 substr() 逐位截取字符,用 ascii() 将字符转换为 ASCII 码,通过 if() 判断 ASCII 码的数值范围,逐位猜解出完整的数据内容。

4. 什么是时间盲注?MySQL 中时间盲注常用的函数和执行逻辑是什么?

时间盲注适用于页面无论 SQL 语句执行结果真假,返回的内容、状态码都完全一致,无法通过页面差异判断注入结果的场景,完全依靠 SQL 语句执行的时间延迟来判断数据内容。

常用的函数包括 if ()sleep ()benchmark ()。

执行逻辑为:通过 if () 构造条件判断语句,当猜解的条件为真时,执行 sleep () 函数让数据库延迟响应,条件为假时则立即返回;根据页面响应的时间差,逐位猜解出目标数据。benchmark () 函数适用于 sleep () 被过滤的场景,通过执行大量重复运算制造时间延迟。

5. MySQL 中的堆叠查询注入是什么?使用条件和实战利用方式有哪些?

堆叠查询注入指的是在 SQL 语句中,通过分号结束前一条 SQL 语句,同时拼接执行一条或多条新的 SQL 语句,实现多语句并行执行。

使用条件为:数据库底层采用了支持多语句执行的 API,比如 PHP 中的 mysqli_multi_query()、Java 中的 Statement 接口,预编译语句无法执行堆叠注入。

实战中的利用方式,除了常规的增删改查操作,还可以创建数据库用户、修改用户权限、写入文件到服务器,比如通过 SELECT ... INTO OUTFILE 写入 WebShell,是 HVV 中从 SQL 注入到 GetShell 的关键手段。

6. MySQL 中通过 SQL 注入写入 WebShell 需要满足哪些条件?常用的写入方式是什么?

需要满足四个条件:当前数据库用户拥有 FILE 权限;已知 Web 目录的绝对路径;Web 目录对数据库进程有写入权限;数据库的 secure_file_priv 配置允许写入目标目录,该配置为空时允许任意目录写入,指定目录时仅能写入该目录,为 NULL 时禁止文件写入操作。

常用的写入方式有两种:一是通过 SELECT '一句话木马内容' INTO OUTFILE 'Web目录绝对路径' 写入文本文件;二是 MySQL 5.6 及以上版本,可通过 SELECT '木马内容' INTO DUMPFILE 写入二进制文件,适合写入 exe 等可执行程序。

三、MSSQL 数据库注入专项高频题

1. MSSQL 中联合查询注入和 MySQL 的联合查询注入有什么核心差异?

第一,MSSQL 对联合查询的要求更严格,UNION 前后的查询语句不仅列数要一致,对应列的数据类型也必须严格匹配,无法像 MySQL 一样用 null 填充所有列;第二,MSSQL 默认不区分大小写,而 Linux 环境下的 MySQL 默认区分库名、表名的大小写;第三,二者查询元数据的方式完全不同,MSSQL 通过 sys.databasessys.tablessys.columns 系统视图查询库、表、字段信息,而 MySQL 依靠 information_schema 库完成元数据查询。

2. MSSQL 中常用的报错注入函数有哪些?

MSSQL 的报错注入主要利用类型转换错误、XML 解析错误触发,常用的方法包括:

一是 convert()/cast() 强制类型转换,将字符串格式的查询结果强制转换为 int 类型,触发类型转换报错带出数据,兼容性覆盖绝大多数 MSSQL 版本;二是 updatexml()/extractvalue()MSSQL 2005 及以上版本支持,原理与 MySQL 一致,通过 XML 格式错误触发报错;三是 floor(rand()*2) group by 分组主键重复报错,原理与 MySQL 类似;另外还有 OPENROWSETOPENDATASOURCE 等函数触发报错的方式,适用于部分特殊环境。

3. MSSQL 中的布尔盲注和时间盲注,和 MySQL 相比有哪些语法差异?

布尔盲注方面,MSSQL 用 len() 获取字符串长度,substring() 截取字符串,ascii()/unicode() 转换字符编码,而 MySQL 对应使用 length()substr();条件判断上,MSSQL 支持 IF ELSE 语句,MSSQL 2012 及以上版本可使用 IIF() 函数,与 MySQL 的 if() 函数用法存在差异。

时间盲注方面,最核心的差异是 MSSQL 没有 sleep() 函数,常用 WAITFOR DELAY '0:0:5' 来实现固定时长的延迟;也可以通过 WAITFOR TIME、大数量循环查询制造延迟,适用于 WAITFOR 被过滤的场景。

4. 什么是 MSSQL 的堆叠注入?实战中有哪些高阶利用方式?

MSSQL 默认支持多语句执行,绝大多数数据库连接驱动都支持分号分隔的堆叠查询,这也是 MSSQL 注入相比 MySQL 利用空间更大的特点。

实战中的高阶利用方式包括:基础的数据库权限操作,比如创建 sysadmin 权限的数据库用户;通过 xp_cmdshell 扩展存储过程执行系统命令,这是 HVV 中最常用的利用方式,sysadmin 权限下可直接执行任意系统命令,获取服务器控制权;通过 xp_regreadxp_regwrite 等扩展存储过程读写 Windows 注册表,获取敏感信息或设置开机启动项;通过 OPENROWSET 函数对内网进行端口扫描,识别内网存活主机与服务,为内网横向移动提供支撑。

5. MSSQL 中 xp_cmdshell 无法使用时,还有哪些执行系统命令的方式?

xp_cmdshell 在 MSSQL 中默认处于禁用状态,即使开启也常被安全设备监控,替代的执行方式包括:通过 sp_oacreate 调用 OLE 自动化组件,创建 WScript.Shell 对象执行系统命令,适用于 MSSQL 2000 及以上版本;通过 xp_regwrite 修改注册表映像劫持项,配合 Windows 粘滞键等功能触发命令执行;借助 MSSQL 的 CLR 集成,编译自定义的 .NET 程序集导入到数据库中,执行任意代码,绕过对存储过程的限制;创建 SQL Server 代理作业,设置执行 PowerShell 脚本或系统命令,通过定时任务触发执行。

6. MSSQL 注入中,如何获取当前数据库的权限?如何判断是否为 sysadmin 权限?

获取当前权限的常用语句包括 SELECT SYSTEM_USER;SELECT CURRENT_USER;SELECT IS_SRVROLEMEMBER ('sysadmin');

判断是否为 sysadmin 权限,可执行 SELECT IS_SRVROLEMEMBER ('sysadmin'),返回 1 说明当前用户属于 sysadmin 服务器角色,拥有数据库最高权限,返回 0 则不具备该权限。也可以执行 SELECT * FROM fn_my_permissions (NULL, 'SERVER');,查看当前用户拥有的服务器级权限,确认权限范围。

四、其他主流数据库注入拓展题

1. Oracle 数据库注入的常用方式有哪些?和 MySQL/MSSQL 有什么差异?

Oracle 注入的常用方式包括联合查询注入报错注入布尔盲注时间盲注,与 MySQL/MSSQL 的核心差异集中在四个方面:一是元数据查询方式不同,Oracle 通过 ALL_TABLESALL_TAB_COLUMNSDBA_TABLES 等系统视图查询库、表、字段信息,不存在 information_schema 库;二是联合查询的要求更严格,UNION 前后必须严格匹配列数和数据类型,且所有查询必须包含 FROM 子句,无表查询时需要使用 DUAL 虚表;三是报错注入的函数不同,常用 utl_inaddr.get_host_name ()ctxsys.drithsx.sn () 等函数,通过非法参数触发报错;四是时间盲注的实现方式不同,Oracle 没有 sleep () 函数,通过 DBMS_LOCK.SLEEP () 函数实现延迟,也可通过笛卡尔积查询制造时间延迟。

2. PostgreSQL 数据库注入的特点和常用利用方式是什么?

PostgreSQL 注入的核心特点是默认支持堆叠查询,拥有完善的 information_schema 系统视图,支持自定义函数与 PL/pgSQL 存储过程,利用灵活性较高。

常用的利用方式包括:基础的联合查询报错注入盲注,报错注入常用 cast() 类型转换错误或 xpath 函数报错;堆叠注入场景下,可创建自定义函数,通过 C 语言函数或 PL/pgSQL 执行系统命令;高权限环境下,可通过 COPY 语句写入文件到服务器,实现 WebShell 写入;借助 dblink 模块实现跨数据库查询,对内网数据库环境进行探测。

五、SQL 注入绕过与实战利用题

1. 针对 SQL 注入的关键词过滤,有哪些常见的绕过方式?

常见的绕过方式包括:大小写绕过,针对不区分大小写的过滤规则,将 select 写成 SeLeCtunion 写成 UnIoN双写绕过,针对简单的关键词替换过滤,将 select 写成 seleselectct,过滤掉中间的 select 后,剩余内容重新拼接为完整关键词;注释符绕过,用注释符拆分关键词,比如 sel/*xxx*/ectuni/*123*/on,数据库执行时会忽略注释内容,而过滤规则无法匹配完整关键词;编码绕过,通过 URL 编码、Unicode 编码、十六进制编码处理 payload,比如用 %0a%0d%09 等空白字符替代空格,关键词用十六进制编码后传入;等价语法绕过,用功能等价的函数或语法替代被过滤的关键词,比如用 && 替代 and|| 替代 orlike 替代 =mid () 替代 substr ()空格绕过,用注释符、括号替代空格,比如 select (username) from (users),完全不使用空格完成语句编写。

2. 当 SQL 注入中逗号,被过滤时,有哪些绕过方式?

针对不同场景的逗号过滤,有对应的绕过方案:针对 substr () 等字符串截取函数的逗号过滤,用 from ... for ... 语法替代,比如 substr (str from 1 for 1) 替代 substr (str,1,1);针对联合查询的列数填充,用 join 语句替代逗号分隔的列,比如 UNION SELECT * FROM (SELECT 1) a JOIN (SELECT 2) b JOIN (SELECT 3) c;针对 limit 子句的逗号过滤,用 offset 语法替代,比如 limit 2,1 等价于 limit 1 offset 2;针对 if () 函数的逗号过滤,用 case when ... then ... else ... end 语法替代 if () 函数,无需逗号分隔参数。

3. 当 UNION、SELECT 被完全过滤时,还有哪些注入利用方式?

联合查询无法使用时,可采用以下利用方式:报错注入,无需 UNION 和 SELECT 的回显,只要页面有报错信息输出,即可通过报错带出数据;布尔盲注 / 时间盲注,无需页面回显数据,通过页面差异或响应时间猜解数据,即使关键词被部分过滤,也可通过变形语法绕过;堆叠注入,若目标支持多语句执行,可直接执行增删改、权限操作、命令执行等语句,无需查询数据;带外注入(OOB),利用数据库的网络通信能力,将查询结果通过 DNSSMBHTTP 等协议发送到攻击者控制的服务器,无需页面回显和报错信息。

4. 什么是 SQL 带外注入(OOB)?MySQL 和 MSSQL 中分别如何实现?

带外注入,指的是在页面无回显、无报错、无法通过时间盲注高效猜解数据的场景下,利用数据库的网络通信能力,将查询到的数据通过 DNSHTTPSMB 等协议发送到攻击者控制的服务器,从而获取数据的注入方式。

MySQL 中的实现方式,是利用 LOAD_FILE() 函数,将查询结果拼接到域名中,发起 DNS 解析请求,攻击者通过 DNS 日志获取数据,前提是数据库的 secure_file_priv 为空,且目标服务器能访问公网。

MSSQL 中的实现方式,主要利用 master..xp_dirtreemaster..xp_fileexist 函数,访问攻击者的 SMB 共享,将查询结果拼接到共享地址中,通过 DNS 日志获取数据;也可通过 utl_httpOLE 自动化组件发起 HTTP 请求,实现数据外带。

5. HVV 实战中,遇到预编译语句,是否一定不存在 SQL 注入?为什么?

预编译语句不是绝对安全的,依然存在 SQL 注入的可能。

预编译语句的安全前提,是 SQL 语句的结构固定,所有用户输入都以参数占位符 ? 的形式传入,数据库会将占位符的内容当作纯数据处理,不会解析为 SQL 指令。但如果代码中,将用户可控的内容拼接到了预编译的 SQL 语句结构中,比如表名字段名ORDER BY 后的排序字段、limit 后的数值,依然会产生 SQL 注入

比如预编译语句写为 "SELECT * FROM users ORDER BY" + 用户输入的字段名,这种情况下,即使使用了 PreparedStatement,也无法阻止 SQL 注入,因为表名字段名无法用占位符替代,用户输入会直接拼接到 SQL 结构中执行。

六、SQL 注入防御与应急响应题

1. 防御 SQL 注入最有效的手段是什么?

防御 SQL 注入的核心,是阻断用户输入被解析为 SQL 指令的可能,最有效的手段是使用 预编译语句(参数化查询),严格区分 SQL 语句的结构和用户输入的数据,所有用户可控的内容都通过 参数占位符 传入,不直接拼接到 SQL 语句中。同时预编译语句必须正确使用,不能将用户输入拼接到 SQL 语句的结构部分

2. 除了预编译语句,还有哪些辅助的 SQL 注入防御措施?

辅助防御措施包括:输入校验,对用户输入进行严格的格式校验和白名单过滤,固定格式的内容只允许符合规则的输入通过,表名、字段名等无法用预编译的场景,必须采用白名单限制输出编码,对从数据库查询出的数据进行 HTML 编码处理,避免 SQL 注入带来的 XSS 等次生漏洞;最小权限原则,为 Web 应用的数据库账号分配最小必要的权限,禁止使用 rootsa 等最高权限账号,只开放必要的库表查询权限,关闭 FILEEXECUTE 等高危权限;关闭错误回显,生产环境中关闭数据库的详细错误信息输出,避免报错信息为攻击者提供利用线索;部署 WAF 等安全设备,对 SQL 注入的攻击 payload 进行检测和拦截,作为纵深防御的一环。

3. 护网期间,发现业务系统存在 SQL 注入漏洞,应急响应的流程是什么?

护网期间的应急响应,需要兼顾快速止损溯源分析,核心步骤为:第一步临时阻断,将受影响的业务系统临时下线,或通过 WAF、防火墙添加临时规则,拦截针对该漏洞的攻击请求,避免攻击者进一步利用;第二步攻击排查,查看 Web 访问日志数据库审计日志,排查漏洞是否已被利用,确认攻击者执行的操作,包括是否窃取数据、写入 WebShell、执行系统命令;第三步漏洞修复,定位漏洞点和产生原因,开发人员采用预编译等方案紧急修复,修复完成后通过安全测试确认漏洞已闭合;第四步事件处置,若确认数据被窃取,需按等保要求完成上报和处置,若服务器已被入侵,需进行全面的后门排查权限清理系统加固;第五步复盘加固,业务恢复后,对全量业务系统进行 SQL 注入漏洞排查,同时完善开发规范安全测试流程,避免同类漏洞重复出现。

4. ORM 框架是否会产生 SQL 注入?常见的风险点有哪些?

ORM 框架(比如 MyBatisHibernate)能大幅降低 SQL 注入的风险,但不是绝对安全,依然存在 SQL 注入的可能。

MyBatis 的常见风险点包括:使用拼接用户输入,而非参数占位符{} 会将用户输入直接拼接到 SQL 语句中产生注入;动态 SQL 中,将用户输入拼接到 ORDER BYGROUP BY表名字段名的位置,未做白名单校验;模糊查询、IN 查询时,错误使用 ${} 拼接用户输入,而非 bind 标签或 concat 函数处理。

Hibernate 的常见风险点包括:使用 HQL 语句时直接拼接用户可控输入,未使用参数绑定;使用原生 SQL 查询时,直接拼接用户输入,未采用预编译的参数绑定。

SQL 注入作为经典的 Web 漏洞,虽然出现时间已久,但在 HVV 实战中依然是红队突破边界的重要手段,也是护网相关岗位面试的必考内容。掌握不同数据库的注入方法、绕过技巧和防御方案,不仅能应对面试,也能在护网实战中,无论是红队打点还是蓝队防御,都能具备对应的实战能力。

🎁 互动与福利

分享本文到朋友圈,点赞+在看+关注,一键三联,可以凭截图找老师领取

上千学习资料+工具

22919c6e4ef945aa9a9cbf0f6df4f6ff

分享后扫码加我!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:智榜样网络安全学习中心 小智 小智《护网在即,HVV 高频面试题 – SQL 注入》

评论:0   参与:  0