利用Unicode溢出绕过字符黑名单的突破性技术

本文详细介绍了Unicode码点截断攻击技术,通过精心构造超过单字节存储限制的Unicode字符,可成功绕过服务器字符黑名单防护机制,并展示了在JavaScript中的实际应用案例和攻击向量。

利用Unicode溢出绕过字符黑名单

Unicode码点截断——也称为Unicode溢出攻击——发生在服务器尝试将Unicode字符存储于单字节时。由于字节的最大值为255,通过精心构造溢出可以产生特定的ASCII字符。

以下是几个以0x41(代表字母"A")结尾的示例:

1
0x4e41 0x4f41 0x5041 0x5141

如果对这些码点执行取模运算,可以看到它们会产生字符"A":

1
String.fromCodePoint(0x4e41 % 256, 0x4f41 % 256, 0x5041 % 256, 0x5141 % 256) // 输出"AAAA"

不仅字节存在此问题,JavaScript自身的fromCharCode()方法也存在码点溢出漏洞。该方法允许生成0-0xFFFF范围内的字符,但如果超出此范围,将发生溢出并产生由溢出量决定的字符。

1
2
String.fromCharCode(0x10000 + 0x31, 0x10000 + 0x33, 0x10000 + 0x33, 0x10000 + 0x37)
// 输出"1337"

上述代码使用十六进制值0x10000(比fromCharCode()方法支持的最大码点大1),然后为其添加溢出量(此处为1337的每个码点的十六进制值)。当发生溢出时,就会产生"1337"。

漏洞赏金猎人正在积极使用此技术,该问题由Ryan Barnett提请我们关注。为方便大家使用,我们已将这类截断攻击添加到ActiveScan++中,感谢Ryan的PR提交。我们还创建了Hackvertor标签以帮助重现这些字符。特别感谢我的同事Zak,我与他共同研究了此问题。我们同时更新了Shazzer Unicode表以显示潜在的Unicode截断字符。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计