一次字符串拼接的sql注入实战
字数 1029 2025-08-20 18:18:40
字符串拼接SQL注入实战教学文档
1. 漏洞背景
在渗透测试过程中发现一个基于Oracle数据库的布尔型SQL注入漏洞,注入点位于account参数处。该注入点对常规的and和or操作符进行了过滤,最终通过字符串拼接方法成功实现注入。
2. 初始测试
- 使用单引号测试:
account=admin',发现输出与正常情况不同,确认存在注入点 - 尝试常规闭合方法失败,包括:
account=admin' or '1'='1account=admin' and '1'='1- 双写关键字绕过(如
aandnd)
3. 绕过思路
3.1 字符串拼接方法
发现系统使用Oracle数据库后,尝试使用Oracle的字符串连接符||:
account=adm'||'i'||'n
成功闭合,系统返回与account=admin相同的结果。
3.2 进阶利用
将固定字符替换为函数调用:
account=adm'||CHR(105)||'n
同样成功执行,其中CHR(105)返回字母i。
4. 构造完整注入payload
采用以下形式构造注入语句:
account=adm'||CHR(ASCII(SUBSTR((SELECT user FROM dual),1,1))-N)||'n
其中:
SUBSTR函数提取数据ASCII函数获取字符的ASCII码- 通过调整
N值使得CHR参数等于105(字母i的ASCII码) - 当
CHR参数等于105时,整个表达式等价于admin
5. 自动化利用
使用Burp Suite Intruder模块爆破用户名的第一个字符:
- 设置payload位置在
N值处 - 通过观察响应是否与
account=admin相同来判断是否正确字符 - 成功爆破出第一位字符后,可编写脚本自动化获取完整数据
6. Oracle相关函数说明
CHR(n): 返回ASCII码为n的字符ASCII(c): 返回字符c的ASCII码SUBSTR(str,pos,len): 从字符串str的第pos位开始截取len个字符dual: Oracle的系统表,常用于测试查询
7. 防御建议
- 使用参数化查询或预编译语句
- 实施最小权限原则
- 对输入进行严格过滤和转义
- 禁用错误信息回显
- 使用Web应用防火墙(WAF)
8. 总结
该案例展示了当常规SQL注入方法被过滤时,如何利用字符串拼接技术实现注入。关键在于:
- 识别数据库类型(本例为Oracle)
- 了解特定数据库的字符串操作函数
- 构造确保语法正确的payload
- 通过布尔型判断逐步获取数据
这种方法在Oracle环境下特别有效,但原理可应用于其他支持字符串拼接的数据库系统。