对不起了系统,为了交差,我只能转走小道进行SQL注入了
字数 1140 2025-08-29 08:30:05
SQL注入绕过技术实战教学文档
0x00 背景介绍
本文记录了一个SQL注入漏洞的发现和利用过程,主要特点是目标系统对大多数SQL函数和关键字进行了过滤,但通过巧妙的绕过技术最终成功获取了数据库路径信息。
0x01 注入点发现
-
初始发现:测试中发现一个可通过单引号闭合的SQL注入点
- 原始注入:
'能够实现完美闭合 - 拦截情况:
and、or等关键字被检测拦截
- 原始注入:
-
初步绕过:
- 使用
||代替or(||在SQL中表示逻辑或) - 成功构造:
'||1/1||'验证注入存在
- 使用
0x02 长度探测技术
-
长度判断方法:
- 使用减法代替等号(等号被拦截)
- 示例:
'||1/(length(123)-3)||'- 当
length(123)=3时表达式为1/0导致错误 - 其他情况返回正常
- 当
-
函数限制:
- 发现大多数常用函数被禁用,无法直接获取库名、用户名、版本等信息
0x03 高级绕过技术
-
路径信息获取:
- 目标:获取数据库路径
@@datadir - 初始尝试:
'||1/(length(@@datadir)-300)||'(300为假设值) - 问题:逗号被拦截
- 目标:获取数据库路径
-
逗号绕过:
- 使用
from和for代替逗号 - 最终构造:
'||1/(ord(substr(@@datadir+from+1+for+1))-300)||' - 解释:
substr(string from start for length)是标准SQL语法ord()获取字符ASCII码- 通过不断调整300的值进行爆破
- 使用
-
成功利用:
- 通过布尔盲注方式逐字符爆破出完整数据库路径
- 虽然无法获取更多信息,但足以证明漏洞存在
0x04 关键知识点总结
-
绕过技术:
- 运算符替换:
||代替or - 语法改写:
from...for...代替逗号 - 比较方式:减法代替等号比较
- 运算符替换:
-
被拦截内容:
- 关键字:
and、or、= - 符号:逗号
- 函数:大多数信息获取函数
- 关键字:
-
利用思路:
- 当主要信息获取途径被阻断时,寻找次要目标(如路径信息)
- 使用标准SQL语法替代被拦截的简化语法
- 布尔盲注作为最后手段
0x05 防御建议
- 使用参数化查询而非字符串拼接
- 不要依赖黑名单过滤,应采用白名单机制
- 最小权限原则,限制数据库用户权限
- 错误信息处理,避免泄露敏感信息
- 对
||等运算符也进行过滤或转义
0x06 扩展思考
-
其他可能的绕过方式:
- 使用
like进行模糊匹配 - 尝试
%00等空字节截断 - 使用注释符分割语句
- 使用
-
更全面的信息获取:
- 尝试
@@version_compile_os获取操作系统 - 通过
hex()函数绕过字符限制 - 使用嵌套查询绕过直接函数调用
- 尝试
本案例展示了即使在被严格过滤的环境中,通过深入了解SQL语法标准和创造性思维,仍然可能找到注入途径。这强调了全面防御而非局部修补的重要性。