利用Unicode溢出绕过字符黑名单
Unicode码点截断——也称为Unicode溢出攻击——发生在服务器尝试将Unicode字符存储于单字节时。由于字节的最大值为255,通过精心构造溢出可以产生特定的ASCII字符。
以下是几个以0x41(代表字母"A")结尾的示例:
|
|
如果对这些码点执行取模运算,可以看到它们会产生字符"A":
|
|
不仅字节存在此问题,JavaScript自身的fromCharCode()
方法也存在码点溢出漏洞。该方法允许生成0-0xFFFF范围内的字符,但如果超出此范围,将发生溢出并产生由溢出量决定的字符。
|
|
上述代码使用十六进制值0x10000(比fromCharCode()
方法支持的最大码点大1),然后为其添加溢出量(此处为1337的每个码点的十六进制值)。当发生溢出时,就会产生"1337"。
漏洞赏金猎人正在积极使用此技术,该问题由Ryan Barnett提请我们关注。为方便大家使用,我们已将这类截断攻击添加到ActiveScan++中,感谢Ryan的PR提交。我们还创建了Hackvertor标签以帮助重现这些字符。特别感谢我的同事Zak,我与他共同研究了此问题。我们同时更新了Shazzer Unicode表以显示潜在的Unicode截断字符。