SQL 注入技术详解与过滤绕过方法
说明:全文已统一润色、修正逻辑漏洞、补齐防御与过滤绕过章节,Markdown 格式可直接复制发布到 CSDN。修正了原示例 payload 的逻辑问题,增加实战 payload、WAF 绕过思路、靶场演示与总结。
1. 什么是 SQL 注入?
SQL 注入(SQL Injection) 是 Web 领域最经典的高危漏洞之一。攻击者向页面输入框、请求参数等可控位置,插入恶意 SQL 语句,应用程序未做过滤就将用户输入拼接到原始 SQL 语句中,发送给数据库执行。
漏洞成功利用后,攻击者可实现:读取数据库敏感数据、篡改 / 删除数据、甚至拿下服务器权限。
1.1 SQL 注入的工作原理
SQL 注入的核心根源:直接拼接用户可控输入到 SQL 语句,破坏原有 SQL 语义。
举一个登录校验场景:
后端原始 SQL:
SELECT * FROM users WHERE username = 'admin' AND password = 'password';
攻击者在用户名输入框填入:admin' OR '1'='1
拼接后 SQL 语句:
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = 'password';
⚠️ 知识点补充:SQL 中
AND优先级高于OR
上面这条语句实际等价:SELECT * FROM users WHERE username = 'admin' OR ('1'='1' AND password = 'password');很多入门教程直接说这个 payload 一定能登录,其实是不准确的。
更稳妥的 Payload:admin' OR '1'='1'-- -
拼接结果:SELECT * FROM users WHERE username = 'admin' OR '1'='1'-- -' AND password = 'password';
-- -是 SQL 注释符,注释掉后面单引号和密码判断,直接绕过登录校验。
1.2 常见 SQL 注入攻击类型
- 基于错误的注入(Error-based)
构造特殊 SQL 语句,让数据库返回报错信息。从报错回显中,直接获取表名、字段名、数据库版本等结构信息。适合数据库错误信息对外暴露的场景。 - 联合查询注入(Union-based)
利用UNION关键字,把原有查询结果和攻击者自定义查询的结果合并输出。前提:前后两个查询的字段数量、数据类型匹配。是最常用、数据获取效率最高的注入方式。 - 布尔盲注(Boolean-based Blind)
页面不返回数据库数据,也不返回 SQL 报错。但是页面会根据 SQL 语句真假,返回两种不同页面状态(正常页面 / 空白页面)。攻击者通过构造判断语句,逐个字符猜解数据库内容。 - 时间盲注(Time-based Blind)
页面无论 SQL 语句真假,返回内容完全一致,无法依靠页面判断。通过sleep()、benchmark()等延时函数,根据服务器响应时间长短,推断 SQL 执行结果。适合页面无回显、无状态差异的场景。
2. SQL 注入防御方案
防御 SQL 注入需要多层防护,不能只依赖单一手段。
2.1 使用参数化查询(预编译语句)
参数化查询(Prepared Statements)是防御 SQL 注入最核心、最有效的手段。
原理:SQL 语句模板提前在数据库预编译,用户输入只作为参数值传递,数据库会把参数单纯当作字符串,不会解析执行里面的 SQL 关键字。
简单示例(PHP PDO)
// 预编译SQL模板,?是占位符
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
// 用户输入仅作为参数绑定,不会参与SQL语句解析
$stmt->execute([$username, $password]);
注意:使用预编译也不是绝对安全,如果预编译模板本身由字符串拼接生成,依然存在注入风险。
2.2 使用 ORM 框架
MyBatis、Hibernate、Django ORM 等框架,底层默认使用参数化查询。
开发人员尽量使用框架提供的对象化查询 API,避免手写原生 SQL。
坑点提醒:MyBatis 中
${}是字符串拼接,会产生注入;#{}才是预编译参数。很多注入漏洞都是误用${}造成。
2.3 输入校验与白名单过滤
对用户输入做严格校验,优先使用白名单,黑名单很容易被绕过。
- 白名单:只允许预期范围内字符(例如 ID 只允许数字);
- 黑名单:过滤
union、select、and等关键字,不推荐单独作为防御手段。
2.4 数据库最小权限原则
应用连接数据库账号,只分配业务必需权限。
Web 业务账号:禁止drop、alter、into outfile等高权限操作。就算发生注入,也能降低攻击危害。
2.5 关闭数据库详细错误回显
生产环境禁止把原生数据库报错信息直接返回前端。防止攻击者利用报错注入获取库表信息。
3. 过滤绕过思路(本文重点)
当站点使用黑名单、WAF 对关键字、符号做过滤时,攻击者会使用各类变形方式绕过检测。下面是实战中常见绕过手段。
3.1 注释符绕过
常用注释:-- -、#、/* */
场景:过滤单引号后多余闭合字符,截断后面 SQL 语句。
Payload 示例:
admin' or 1=1-- -
3.2 大小写变形绕过
部分 WAF 只匹配小写关键字,可切换大小写绕过。
示例:UNION、uNiOn、SelEcT
?id=1' uNiOn sElEcT 1,version()-- -
3.3 空格过滤绕过
当空格被拦截,使用等价符号替代空格:/**/、%09(Tab)、%0A换行符
?id=1'/**/union/**/select/**/1,2-- -
3.4 编码绕过
URL 编码、Unicode 编码,部分 WAF 只检测原始明文,后端解析后触发注入。
URL 编码示例:' → %27
3.5 关键字替换 / 嵌套绕过
简单黑名单会直接替换关键词为空,可嵌套构造。
例:过滤union,使用ununionion,替换后剩余union
?id=1' ununionion selselectect 1,2-- -
3.6 堆叠查询绕过
部分数据库(MySQL)支持;分隔多条 SQL 语句,如果后端支持多语句执行,可以执行多条 SQL。
?id=1';drop table users;-- -
注意:很多中间件默认禁止堆叠查询,这个方式不一定生效。
✅ 重要说明:绕过手段依赖 WAF / 过滤规则的缺陷,规则更新后可能失效。黑名单过滤只能作为辅助防护,不能替代预编译。
4. 靶场简单注入实战演示(Union 查询)
测试地址:本地 DVWA 靶场 SQL Injection
原始请求:?id=1 返回一条数据
- 判断是否存在注入:
?id=1'页面报错,存在字符型注入 - 判断字段数:
?id=1' order by 2-- -正常;?id=1' order by 3-- -报错 → 查询字段为 2 - 判断回显位置:
?id=-1' union select 1,version()-- -
页面返回数据库版本信息,注入成功。
5. 总结
- SQL 注入根源:用户可控输入直接拼接 SQL 语句;
- 防御首选:参数化预编译语句、ORM 框架,白名单校验;黑名单过滤极易被绕过,仅作辅助;
- 注入分为报错注入、联合注入、布尔盲注、时间盲注四大类;
- WAF / 黑名单绕过只是利用规则缺陷,绕过手段不固定,随防护规则变化;
- 安全开发一定要遵循最小权限原则,生产环境关闭数据库错误详情输出。
免责声明:本文仅用于安全学习、靶场测试。未经授权,禁止对任何网站进行渗透测试,违者承担相应法律责任。
最后
网络安全需要学习那些知识
网络安全零基础入门学习路线&规划
初级
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!

7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。

网络安全工程师企业级学习路线

视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

一些我自己买的、其他平台白嫖不到的视频教程:

要学习网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。
机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!
这份完整版的学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】


2396

被折叠的 条评论
为什么被折叠?



