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 });
相关推荐
林炳然5 小时前
Python的“一行搞定”风格
python
java1234_小锋5 小时前
TensorFlow2 Python深度学习 - 使用Dropout层解决过拟合问题
python·深度学习·tensorflow·tensorflow2
liyi_hz20086 小时前
O2OA (翱途)开发平台新版本发布预告:架构升级、性能跃迁、功能全面进化
android·java·javascript·开源软件
wanfeng_096 小时前
python爬虫学习
爬虫·python·学习
唐叔在学习6 小时前
Pyinstaller - Python桌面应用打包的首选工具
后端·python·程序员
angelQ6 小时前
前端fetch手动解析SSE消息体,字符串双引号去除不掉的问题定位
前端·javascript
林希_Rachel_傻希希6 小时前
JavaScript 解构赋值详解,一文通其意。
前端·javascript
冉冰学姐6 小时前
SSM装修服务网站5ff59(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·装修服务网站
林希_Rachel_傻希希6 小时前
正则表达式捕获组与全局匹配
前端·javascript
库库8396 小时前
Redis分布式锁、Redisson及Redis红锁知识点总结
数据库·redis·分布式