利用Unicode溢出绕过字符黑名单
Unicode码点截断——也称为Unicode溢出攻击——发生在服务器尝试将Unicode字符存储在单个字节中时。由于字节的最大值为255,可以通过精心构造溢出以产生特定的ASCII字符。
以下是一些以0x41(代表A)结尾的示例: 0x4e41 0x4f41 0x5041 0x5141
如果对上述码点执行模运算,您将看到它们产生字符“A”:
|
|
不仅仅是字节存在此问题,JavaScript本身的fromCharCode()方法也存在码点溢出。该方法允许生成0-0xffff之间的字符,但如果超出此范围,将发生溢出并根据溢出量产生字符。
|
|
上述代码使用十六进制值0x10000,这是fromCharCode()方法支持的最大码点之上的一位。然后我向其添加溢出,在这种情况下是1337的每个码点的十六进制。当溢出发生时,它产生1337。
漏洞赏金猎人正在积极使用此技术,Ryan Barnett引起了我们的注意。为方便大家,我们已将此类截断攻击添加到ActiveScan++中,感谢Ryan的PR,我们还创建了一个Hackvertor标签以帮助重现这些字符。非常感谢我的同事Zak,我与他一起调查了此事。我们还更新了Shazzer unicode表以显示潜在的unicode截断字符。