在Java源代码字符串中隐藏Payload | PortSwigger研究
Gareth Heyes 研究员 @garethheyes
发布时间:2024年1月23日 15:00 UTC 更新时间:2024年1月24日 12:27 UTC
在这篇文章中,我们将展示Java如何处理源代码字符串中的Unicode转义字符,这种方式可能会让你感到惊讶——以及如何滥用它们来隐藏Payload。
我们最近发布了一个名为Bambdas的强大新功能。它们允许你使用Java代码过滤Burp中的项目。但这让我们思考,如果能说服用户运行一个看起来像无害漏洞Payload但实际上在本地机器上执行任意代码的Bambda,会发生什么?
当你在一个Bambda中使用以下代码时,你期望会发生什么:
|
|
如果你期望这只是一个简单的字符串赋值,那你就错了。实际发生的情况是,Java编译器将Unicode编码的双引号(\u0022)视为双引号并关闭字符串。然后Runtime.getRuntime()与通过编码字符串传递的命令一起被执行。Java几乎允许你用Unicode转义字符编码整个语法!
我们未能在任何公开文档中找到这种技术的记录,但如果你喜欢这个发现,你可以在这篇论文中找到一系列相关攻击。
请记住,Bambda允许任意代码执行,因此当使用来自不受信任源的Bambda时,请确保在使用前进行验证!