控制SQL Server最适合unicode转换

Bra*_*ood 5 sql-server unicode penetration-testing sql-server-2012

最近的一次whitehat扫描让我意识到SQL Server最适合的unicode转换.这意味着当包含unicode字符的字符串转换为非unicode字符串时,SQL Server将对其中的字符进行最佳替换,以便不会使用问号删除数据.例如:

SELECT '????'
Run Code Online (Sandbox Code Playgroud)

输出"TEST"

每个字符都替换为"相似"的ASCII等效字符.这也可以在单个字符上看到,其中unicode字符65308(<)被转换为ASCII字符60(<).

SELECT ascii(NCHAR(65308))
Run Code Online (Sandbox Code Playgroud)

输出"60"

主要问题是这个文件记录在哪里?我已经搜索了各种各样的短语并阅读了Microsoft文档,但我能找到的只是人们希望进行手动转换,而没有任何记录SQL Server明显的自动最佳拟合unicode转换的人.此外,可以关闭或配置?

虽然这种行为对于没有将字符串存储为unicode的应用程序很方便,并且可能在大多数情况下都被完全注意到,但渗透测试会将此报告为"高级"漏洞,因为unicode转换可用于规避验证例程并导致诸如XSS之类的漏洞.

Sol*_*zky 5

(以下是我对 DBA.StackExchange 上相关问题的回答的摘录:Automatic Translation when Converting Unicode to non-Unicode / NVARCHAR to VARCHAR

这些“最适合”的映射记录在案,只是不在最容易找到的地方。如果您转到以下 URL,您将看到一个包含多个文件的列表,每个文件都以其将 Unicode 字符映射到的代码页命名:

ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/

大多数文件最后更新(或至少放置在那里)是在 2006 年 10 月 4 日,其中一个是在 2012 年 3 月 14 日更新的。这些文件的第一部分将 ASCII 代码映射到等效的 Unicode 代码点。但是每个文件的第二部分将 Unicode 字符映射到它们的 ASCII“等价物”。

我编写了一个测试脚本,它使用代码页 1252 映射来检查 SQL Server 是否真正使用这些映射。这可以通过回答以下两个问题来确定:

  1. 对于所有映射的代码点,SQL Server 是否将它们转换为指定的映射?
  2. 对于所有未映射的代码点,SQL Server 是否将它们中的任何一个转换为非“ ?”字符?

测试脚本太长无法放在这里,所以我把它贴在了 Pastebin 上:

SQL Server 中的 Unicode 到代码页映射

运行脚本将显示上面第一个问题的答案是“是”(意味着所有提供的映射都得到遵守)。它还将显示第二个问题的答案是“否”(意思是,没有任何未映射的代码点转换为“未知”字符以外的任何内容)。因此,该映射文件非常准确:-)。

此外,这可以关闭或配置吗?

我不这么认为,但这并不意味着做一个或两个是不可能的。但是,应该注意这些映射是“Microsoft”映射,因此适用于 Windows 和 SQL Server;它们不是特定于 SQL Server 的。因此,即使可以找到配置这些东西的位置,更改也可能是一个坏主意,因为它会影响操作系统上运行的所有内容。