利用Unicode溢出绕过字符黑名单的技术解析

本文详细介绍了Unicode码点截断攻击的原理,通过溢出产生特定ASCII字符以绕过字符黑名单,涵盖JavaScript的fromCharCode方法漏洞及实际应用案例,包括ActiveScan++的更新和Hackvertor标签的使用。

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

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

以下是一些以0x41(代表A)结尾的示例: 0x4e41 0x4f41 0x5041 0x5141

如果对上述码点执行模运算,您将看到它们产生字符“A”:

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

不仅仅是字节存在此问题,JavaScript本身的fromCharCode()方法也存在码点溢出。该方法允许生成0-0xffff之间的字符,但如果超出此范围,将发生溢出并根据溢出量产生字符。

1
2
3
String.fromCharCode(0x10000 + 0x31, 0x10000 + 0x33, 0x10000 + 0x33, 0x10000 + 0x37)

//1337

上述代码使用十六进制值0x10000,这是fromCharCode()方法支持的最大码点之上的一位。然后我向其添加溢出,在这种情况下是1337的每个码点的十六进制。当溢出发生时,它产生1337。

漏洞赏金猎人正在积极使用此技术,Ryan Barnett引起了我们的注意。为方便大家,我们已将此类截断攻击添加到ActiveScan++中,感谢Ryan的PR,我们还创建了一个Hackvertor标签以帮助重现这些字符。非常感谢我的同事Zak,我与他一起调查了此事。我们还更新了Shazzer unicode表以显示潜在的unicode截断字符。

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