SQL注入

一、SQL注入攻击类型

1. 基于错误的注入(Error-Based)

原理:通过故意触发数据库错误,获取数据库类型/结构信息

攻击示例:

复制代码
AND 1=CONVERT(int, (SELECT @@version)) --

2. 联合查询注入(Union-Based)

利用UNION操作符合并恶意查询结果

步骤:

  1. 确定字段数:ORDER BY 4--

  2. 探测回显位置:UNION SELECT 'A','B','C'--

3. 布尔盲注(Boolean Blind)

通过页面返回真假状态推测数据

复制代码
AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)='a' -- 

4. 时间盲注(Time-Based Blind)

利用延时函数判断条件真假

MySQL示例:

复制代码
AND IF(ASCII(SUBSTRING(database(),1,1))>100, SLEEP(5), 0) -- 

二,挖掘SQL注入漏洞

步骤1:寻找注入点

目标:URL参数、表单字段、Cookie、HTTP头部

探测方法:提交单引号 触发数据库错误

步骤2:判断数据库类型

MySQL:SELECT @@version

MSSQL:SELECT @@version

Oracle: SELECT banner FROM v$version

步骤3:自动化工具辅助

复制代码
sqlmap -u "http://example.com?id=1" --risk=3 --level=5 --dbs

三、防御方案

  1. 参数化查询(预编译语句)
python 复制代码
cursor.execute("SELECT * FROM users WHERE name = %s", (username,))
  1. 输入验证与过滤

白名单校验:如数字类型强制转换intval($input)

敏感字符黑名单:'",;()/*等

  1. 最小权限原则

数据库账户禁止使用root/sa等高权限账号

按需分配SELECT/UPDATE权限

  1. 其他加固措施

启用WAF(Web应用防火墙)

错误信息模糊处理,避免泄露数据库结构

定期扫描:使用Acunetix、AppScan等工具

四、高级攻击与防御演进

  1. 二次注入(Second-Order Injection)

特征:恶意数据先存储再触发,防御难度高

防御:所有外部输入均视为不可信,包括数据库读取的数据

  1. NoSQL注入

新兴威胁:MongoDB、Redis等非关系型数据库同样存在注入风险

防御示例(MongoDB):

使用ORM框架自带过滤

javascript 复制代码
UserModel.findOne({ username: userInput });
相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
小白男神3 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js