某次奇怪的sql注入记录
字数 777 2025-08-06 08:35:00
SQL注入漏洞分析与利用教学文档
1. 漏洞背景
本教学文档基于奇安信攻防社区中分享的一个特殊SQL注入案例。该案例展示了一种非标准的SQL注入方式,涉及条件判断和字符串比较的巧妙利用。
2. 注入语句分析
核心注入语句为:
keyValue=29'=if('1' like '1 ,1,0x11')='29
2.1 语句分解
'1' like '1- 这是一个简单的LIKE比较,结果为真(1)if('1' like '1 ,1,0x11)- IF函数,条件为真返回第二个参数1- 整体表达式变为
29'=1='29
2.2 运算顺序
SQL中的运算顺序为:
(29'=1)='29'
29'=1- 字符串'29'与数字1比较,MySQL会尝试将字符串转换为数字- '29'转换为数字29
- 29 == 1 → 假(0)
0='29'- 数字0与字符串'29'比较- '29'转换为数字29
- 0 == 29 → 假(0)
最终结果为假(0)。
3. 注入原理
3.1 关键点
- IF函数利用:通过控制IF函数的返回值为1或0来构造布尔条件
- 类型转换:利用MySQL在比较时的隐式类型转换特性
- 逗号触发:根据评论区提示,某些系统遇到逗号会自动添加引号
3.2 变种可能性
可以构造其他条件判断:
keyValue=29'=if(1=1,1,0)='29 // 真
keyValue=29'=if(1=2,1,0)='29 // 假
4. 漏洞利用方法
4.1 布尔盲注
利用这种模式可以进行布尔盲注:
keyValue=29'=if(ascii(substr(database(),1,1))>100,1,0)='29
4.2 时间盲注
结合sleep函数实现时间盲注:
keyValue=29'=if(1=1,sleep(5),0)='29
5. 防御建议
- 参数化查询:使用预编译语句
- 输入过滤:对特殊字符如单引号、逗号进行过滤
- 最小权限:数据库连接使用最小必要权限
- 类型检查:严格校验输入参数类型
6. 学习资源
- MySQL官方文档:类型转换规则
- OWASP SQL注入防护指南
- SQL注入绕过技术手册
7. 实验验证
建议在测试环境验证以下payload:
SELECT '29'=if('1' like '1',1,0x11)='29';
SELECT '29'=1='29';
SELECT 0='29';
通过本案例可以深入理解SQL注入的灵活性和MySQL的类型转换机制,这对安全测试和防御都有重要意义。