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 });
相关推荐
奔跑吧邓邓子14 分钟前
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
爬虫·python·正则表达式·进阶·高级
码界筑梦坊38 分钟前
基于Flask的京东商品信息可视化分析系统的设计与实现
大数据·python·信息可视化·flask·毕业设计
pianmian139 分钟前
python绘图之箱型图
python·信息可视化·数据分析
余衫马39 分钟前
CentOS7 离线安装 Postgresql 指南
数据库·postgresql
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
E___V___E1 小时前
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2
数据库·笔记·mysql
m0_748254882 小时前
mysql之如何获知版本
数据库·mysql
小金的学习笔记2 小时前
如何在本地和服务器新建mysql用户和密码
运维·服务器·mysql
前端御书房2 小时前
前端PDF转图片技术调研实战指南:从踩坑到高可用方案的深度解析
前端·javascript
mikey棒棒棒2 小时前
Redis——优惠券秒杀问题(分布式id、一人多单超卖、乐悲锁、CAS、分布式锁、Redisson)
数据库·redis·lua·redisson·watchdog·cas·并发锁